Sqlserver查询性能分析
- 格式:doc
- 大小:33.00 KB
- 文档页数:2
Sqlserver查询性能分析(执行结果分析)
1、方法
在查询窗口中输入以下命令
dbcc dropcleanbuffers --注释:清除数据
dbcc freeproccache --注释:清除缓存
这是为了每次查询时,不会因为重复查询对结果有干扰,接着在窗口中输入以下命令。
Set statistics io on --注释:开启系统资源使用统计
Set statistics time on --注释:开启执行时间统计
然后在窗口中输入查询命令
如:SELECT TOP 1000000 * FROM [SearchInfo]
在消息框中就会出现如下结果
SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 0 ms.
(999999 row(s) affected)
Table 'SearchInfo'. Scan count 1, logical reads 17890, physical reads 29, read-ahead reads 17309, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
SQL Server Execution Times:
CPU time = 2153 ms, elapsed time = 22354 ms.
2、参数
SQL Server parse and compile time
这是指sql server解析语句的时间。(999999 row(s) affected)查询到的数据量,这个你知道咯,只要你的目的是明确的,那么查询到的数据量应该是不变的,如果改变,那么你的逻辑是不一致的对不对!
Table 'SearchInfo'. Scan count 1, logical reads 17890, physical reads 29, read-ahead reads 17309, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
这一串表示什么呢,
表示数据表'SearchInfo',扫描1次(Scan count)在逻辑区读取了17890次(logical reads)在物理区读取了29次(physical reads)提前读取17309次(read-ahead reads)lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
100万条数据全都是0,你懂的,忽略它吧
那这串数据中没被忽略的哪些有用呢,表的扫描次数Scan count有用的,查询次数的多少表示这个资源你用了多少次,逻辑区读取次数非常有用,我们知道,SQL Server在可以对任何数据进行操作前,必须首先把数据读取到其数据缓冲区中。此外,我们也知道SQL Server 何时会从数据缓冲区中读取数据,并把数据读取到大小为8K字节的页中。Logical Reads是指SQL Server为得到查询中的结果而必须从数据缓冲区读取的页数。在执行查询时,SQL Server不会读取比实际需求多或少的数据,因此,当在相同的数据集上执行同一个查询,得到的Logical Reads的数字总是相同的。
物理区读取咱忽略它吧,为什么呀?
SQL Server在执行查询时所需要的物理区读取次数不可能通过性能调节而减少的。减少物理读的次数是DBA的一项重要工作,但它涉及到整个服务器性能的调节,而不仅仅是查询性能的调节。在进行查询性能调节时,我们不能控制数据缓冲区的大小或服务器的忙碌程
度以及完成查询所需要的数据是在数据缓冲区中还是在磁盘上,唯一我们能够控制的数据是得到查询结果所需要执行的逻辑读的次数。
提前读也是个无关紧要的东西,就算要紧,你也没办法,他是sqlserver自动优化的一个结果值,你干扰不了,停了吧,孩子
SQL Server Execution Times:
CPU time = 2153 ms, elapsed time = 22354 ms.
这上面的就是数据库查询执行的的时间,这是相当关键的数据啊,要哪个,还是两个都要,贪心了吧,看看什么意思吧。CPU Time 指的是CPU在忙于执行当前任务的时间,其并没有考虑等待时间,如IO等待,网络等待等,而Elapsed Time 则是执行当前任务所花费的总时间,也就是说这两者的关系统可以表示为:Elapsed Time = Cpu Time + Wait Time 但是在多核处理器的情况下,由于多个CPU同时处理任务所以可能会出现Cpu Time 大于Elapsed Time 的情况而在服务器上执行查询时,会用到许多种服务器资源。其中的一种资源是CPU 的占用时间,假设数据库没有发生任何改变,反复地运行同一个查询其CPU的占用时间将是十分接近的。在这里,我指的不是一个查询从运行开始到结束的时间,而是指运行这一查询所需要的CPU资源数量,运行一个查询所需要的时间与服务器的忙碌程度有关。而Elapsed Time由于系统的运行繁忙等,时间上来说很难在结果上说明什么
总结下吧,这些数据是有用的
row(s) affected)你参考对比的基础,这个不一致,数据对比无意义
(Scan count)扫描次数,资源用了多少次,越少越好
(logical reads)逻辑读取了多少次,越少越好
(Execution Times:CPU time)cpu运行时间,越少越好
3、数据统计分析
接下来就是数据统计分析,你要对不同的情况进行分析。最简单是就是查询语句的写法不同(目的一致),然后就是数据量的不同,ok,1万条,10万条,100万条。每种组合情况,执行6—10次,然后统计平均。
文章来自:/整体发表