zoukankan      html  css  js  c++  java
  • SQL Server监测查询性能

    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.
    
  • 相关阅读:
    C/C++多文件之间的变量定义
    PKU POJ 2186 Popular Cows 强连通分量
    重载函数
    ZOJ 2763 Prison Break
    201357 训练赛总结
    hdu 4467 Graph 构造
    201356 训练赛总结
    201353 NEERC 2012, Eastern subregional contest
    2013512 CF 183 总结
    一道动态规划
  • 原文地址:https://www.cnblogs.com/qianlixing/p/4780681.html
Copyright © 2011-2022 走看看