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.
    
  • 相关阅读:
    字节顺序(大端小端)
    动态数组(一维二维)探秘
    算法十正则表达式匹配
    算法九回文数
    算法八字符串转换正数(atoi)
    windows server 2008配置多用户远程连接
    算法七整数反转
    原码反码补码
    算法六Z自形变换
    Java学习笔记之:Java Map集合
  • 原文地址:https://www.cnblogs.com/qianlixing/p/4780681.html
Copyright © 2011-2022 走看看