SQL Server提供了以下工具(SET选项)来支持查询的监测:
IO统计
TIME统计
PROFILER统计
XML统计
1. IO统计
当这个选项开启的时,对一批查询中的每一个数据对象访问的查询都有单独一行的输出(不进行数据访问的查询语句不会产生任何输出,比如PRINT、SELECT变量的值或调用系统的方法)
当IO统计选项启用时,会输出逻辑读的次数、物理读的次数、预读的次数和扫描计数。
启用IO统计:SET STATISTICS IO ON;
禁用IO统计:SET STATISTICS IO OFF;
逻辑读
指处理查询所需访问页的次数,对于任何给定的读取操作,数据缓存中的每一页都会被读取,所以如果查询是SELECT * FROM Tbl10 WHERE ID < 5时逻辑读也是10,因为这10页数据已经在缓存中了,因为数据缓存中的页来自磁盘,此值总是至少和物理读的值一样大,但通常比物理读的值大。
物理读
指从磁盘读取的页数,该值总是小于或等于逻辑读的值。
缓存命中率 = (逻辑读-物理读)/逻辑读
物理读的次数可以差别很大,第二次以及后续执行时物理读的次数会大幅减少,因为缓存在第一次执行时就完成了加载。
预读
值在处理某个查询时,运用预读机制读到缓存的页数。
扫描计数
显示了表被访问的次数
可以通过select * from sys.dm_exec_requests where session_id = @@SPID查询granted_query_memory的值。
IO统计优化示例:
创建示例表,表被设计成每一行占用一页。
IF OBJECT_ID('dbo.Tbl1000') IS NOT NULL DROP TABLE dbo.Tbl1000;
CREATE TABLE dbo.Tbl1000(
Id INT IDENTITY(1,1),
Val INT,
Fill CHAR(7000) NOT NULL DEFAULT REPLICATE('Fill',1750)
);
INSERT INTO dbo.Tbl1000(Val)
SELECT TOP(1000) 1+ROW_NUMBER()OVER(ORDER BY (SELECT 1))%100
FROM sys.all_columns A, sys.all_columns B, sys.all_columns C;
启用IO统计,执行查询:
SET STATISTICS IO ON; GO SELECT * FROM Tbl1000 WHERE ID < 6 GO SET STATISTICS IO OFF;
GO
IO统计,表被扫描一次,逻辑读为1000,因为表一共有1000页。
(1000 row(s) affected)
Table 'Tbl10'. Scan count 1, logical reads 1000, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
由于表没有索引,所以做了一次全表扫描,创建一个聚集索引
CREATE CLUSTERED INDEX Tbl1000_Id ON Tbl1000(Id);
重新执行SELECT * FROM Tbl1000 WHERE ID < 6;
(5 row(s) affected)
Table 'Tbl1000'. Scan count 1, logical reads 9, physical reads 0, read-ahead reads 6, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
逻辑读为9,这说明添加合适的聚集索引减少了很大一部分的不必要读。
2. TIME统计
SET STATISTICS TIME ON
显示分析、编译和执行各语句所需的毫秒数。
下面的示例显示服务器的执行、分析和编译时间。
USE AdventureWorks2012; GO SET STATISTICS TIME ON; GO SELECT ProductID, StartDate, EndDate, StandardCost FROM Production.ProductCostHistory WHERE StandardCost < 500.00; GO SET STATISTICS TIME OFF; GO
下面是结果集:
SQL Server parse and compile time: CPU time = 0 ms, elapsed time = 1 ms. SQL Server parse and compile time: CPU time = 0 ms, elapsed time = 1 ms. (269 row(s) affected) SQL Server Execution Times: CPU time = 0 ms, elapsed time = 2 ms. SQL Server parse and compile time: CPU time = 0 ms, elapsed time = 1 ms.