比较SQL查询性能 语句
--优先使用SET STATISTICS IO和SET STATISTICS
TIME查看性能调节是否有效。
--SET STATISTICS TIME ON
--SET STATISTICS TIME
ON
在开始我们的例子前,先运行下面的这二条命令(不要在正在使用的服务器上执行),
这二条命令将清除SQL
Server的数据和过程缓冲区,这样能够使我们在每次执行查询时在同一个起点上,否则,每次执行查询得到的结果就不具有可比性了:
DBCC
DROPCLEANBUFFERS
DBCC FREEPROCCACHE
SET STATISTICS TIME
SET STATISTICS TIME ON
select sum(totalamount)sumat,tenderno from
IF_MIDDLE_TEST --your sql
SET STATISTICS TIME OFF
结果对比:
-- CPU 时间 = 1560 毫秒,占用时间 = 7229 毫秒。
--todaydateindex:CPU 时间 =
1435 毫秒,占用时间 = 10340 毫秒。
--shonoindex: CPU 时间 = 1606 毫秒,占用时间 = 7918
毫秒。
--***both index***: CPU 时间 = 1295 毫秒,占用时间 = 2624 毫秒。
由于CPU占用时间是相对稳定的,因此可以使用这一数据作为衡量你的调节措施是提高了查询性能还是降低了查询的性能的一种方法。
SET STATISTICS IO
SET STATISTICS
IO的输出信息显示在输出的结束处,下面是它显示的一个例子:
Table ‘Order Details‘. Scan
count 1, logical reads 10, physical reads 1, read-ahead reads
9.
Scan
Count:在查询中涉及到的表被访问的次数。在我们的例子中,其中的表只被访问了1次,由于查询中不包括连接命令,这一信息并不是十分有用,但如果查询中包含有一个或多个连接,则这一信息是十分有用的。
Logical Reads: 这是SET STATISTICS IO或SET STATISTICS
TIME命令提供的最有用的数据。我们知道,SQL Server在可以对任何数据进行操作前,必须首先把数据读取到其数据缓冲区中。此外,我们也知道SQL
Server何时会从数据缓冲区中读取数据,并把数据读取到大小为8K字节的页中。
那么Logical
Reads的意义是什么呢?Logical Reads是指SQL Server为得到查询中的结果而必须从数据缓冲区读取的页数。在执行查询时,SQL
Server不会读取比实际需求多或少的数据,因此,当在相同的数据集上执行同一个查询,得到的Logical
Reads的数字总是相同的。
为什么说在调节查询性能中知道SQL Server执行查询时的Logical
Reads值是很重要的呢?因为在每次执行同一查询时,这个数值是不会变化的。因此,在进行查询性能的调节时,这是一个可以用来衡量你的调节措施是否成功的一个很好的标准。
在对查询的性能进行调节时,如果Logical
Reads值下降,就表明查询使用的服务器资源减少,查询的性能有所提高。如果Logical
Reads值增加,则表示调节措施降低了查询的性能。在其他条件不变的情况下,一个查询使用的逻辑读越少,其效率就越高,查询的速度就越快。
Physical
Reads:
物理读指的是,在执行真正的查询操作前,SQL
Server必须从磁盘上向数据缓冲区中读取它所需要的数据。在SQL
Server开始执行查询前,它要作的第一件事就是检查它所需要的数据是否在数据缓冲区中,如果在,就从中读取,如果不在,SQL
Server必须首先将它需要的数据从磁盘上读到数据缓冲区中。
我们可以想象得到,SQL
Server在执行物理读时比执行逻辑读需要更多的服务器资源。因此,在理想情况下,我们应当尽量避免物理读操作。
情况确实是这样,SQL
Server在执行查询时所需要的物理读次数不可能通过性能调节而减少的。减少物理读的次数是DBA的一项重要工作,但它涉及到整个服务器性能的调节,而不仅仅是查询性能的调节。在进行查询性能调节时,我们不能控制数据缓冲区的大小或服务器的忙碌程度以及完成查询所需要的数据是在数据缓冲区中还是在磁盘上,唯一我们能够控制的数据是得到查询结果所需要执行的逻辑读的次数。
小结:
在对查询的性能进行调节时用一些科学的标准来测量你的调节措施是否有效是十分重要的。问题是,SQL
Servers的负载是动态变化的,使用查询总的运行时间来衡量你正在调节性能的查询的性能是提高了还是没有,并不是一个合理的方法。
更好的方法是比较多个数据,例如逻辑读的次数或者查询所使用的CPU时间。因此在对查询的性能进行调节时,需要首先使用SET
STATISTICS IO和SET STATISTICS
TIME命令向你提供一些必要的数据,以便确定你对查询性能进行调节的措施是否真正地得到了目的。
其他相关:
set statistics io on
set statistics profile on
set statistics
io off
set statistics profile off