查询当前系统SQL的执行计划效率,按照执行时间逆向排序

/****** Object:  StoredProcedure [dbo].[SQLCMD]    Script Date: 09/05/2011 12:47:44 ******/
IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[SQLCMD]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[SQLCMD]
GO
 

/*
查询当前系统SQL的执行计划效率,按照执行时间逆向排序
 */
 CREATE PROC [dbo].[SQLCMD]
/*
******************************************************************************************
-- Copyright (C) 2011 Sinodier 版权所有
-- USPName:     SQLCMD
-- Author:  庄金冬 Sinodier  http://www.cnblogs.com/sinodier
-- Create date: 2011年9月2日 17:02:08
-- Description: 查询当前系统SQL的执行计划效率,按照执行时间逆向排序
*****************************************************************************************
*/
    @flag VARCHAR(MAX) = '' ,
    @top INT = 50, ---显示几条
    @IsPrint INT = 0 ---Print 1
 AS
    BEGIN
        IF ( @flag = '' )
            BEGIN
                PRINT N'
----清除缓存
DBCC freeproccache
----打开IO分析
SET STATISTICS IO ON
----打开Time分析
SET STATISTICS TIME ON
----打开PROFILE分析
SET STATISTICS PROFILE ON

----关闭IO分析
SET STATISTICS IO OFF
----关闭Time分析
SET STATISTICS TIME OFF
----关闭PROFILE分析
SET STATISTICS PROFILE OFF

---查询当前系统SQL的执行计划效率,按照执行时间逆向排序
/*
如果时间较长,可以进行优化:
优化原则:
  1.  like 不要 用前置 %,那样索引失效
  2.  分页排序,必须添加唯一键,最好有索引
  3.  尽量少用 IN,NOT IN ,OR ,<>, NOT 这些都会造成 索引失效
  4.  使用 EXISTS 取代 IN
  5.  或者使用 外联结 替换 IN
  未完待更新……
*/

/*查询当前系统SQL的执行计划效率,按照执行时间逆向排序*/
---EXEC SQLCMD ''1'',50,0
'
 
            END
        IF ( @flag = '1' )
            BEGIN
 
                DECLARE @SQL VARCHAR(MAX)= N''
                SET @SQL = N' SELECT TOP ' + CAST(@top AS VARCHAR(MAX))
                    + N'
        SUBSTRING(st.text, ( qs.statement_start_offset / 2 ) + 1,
                  ( ( CASE statement_end_offset
                        WHEN -1 THEN DATALENGTH(st.text)
                        ELSE qs.statement_end_offset
                      END - qs.statement_start_offset ) / 2 ) + 1) [SQL语句] ,
        total_worker_time / 1000 / 1000 [CPU 时间总量(秒)] ,---此计划自编译以来执行所用的 CPU 时间总量(以微秒为单位报告,但仅精确到毫秒)
        last_worker_time / 1000 / 1000 [上次CPU时间(秒)] ,---上次执行计划所用的 CPU 时间(以微秒为单位报告,但仅精确到毫秒)。
        max_worker_time / 1000 / 1000 [单次最大CPU时间(秒)] ,---此计划在单次执行期间所用的最大 CPU 时间(以微秒为单位报告,但仅精确到毫秒)。
        min_worker_time / 1000 / 1000 [单次最小CPU时间(秒)] ,---此计划在单次执行期间所用的最小 CPU 时间(以微秒为单位报告,但仅精确到毫秒)。
        total_physical_reads [物理读取总次数] ,---此计划自编译后在执行期间所执行的物理读取总次数。
        last_physical_reads [上次物理读取次数] ,---上次执行计划时所执行的物理读取次数。
        min_physical_reads [单次最小物理读取次数] ,--该计划在单个执行期间所执行的最少物理读取次数。
        max_physical_reads [单次最大物理读取次数] ,--该计划在单个执行期间所执行的最多物理读取次数。
        total_logical_writes [逻辑写入总次数] ,--此计划自编译后在执行期间所执行的逻辑写入总次数。
        last_logical_writes [上次逻辑写入次数] ,--上次执行计划时所执行的逻辑写入次数。
        min_logical_writes [单次最小逻辑写入次数] ,--该计划在单个执行期间所执行的最少逻辑写入次数。
        max_logical_writes [单次最大逻辑写入次数] ,--该计划在单个执行期间所执行的最多逻辑写入次数。
        total_logical_reads [逻辑读取总次数] ,--此计划自编译后在执行期间所执行的逻辑读取总次数。
        last_logical_reads [上次逻辑读取次数] ,--上次执行计划时所执行的逻辑读取次数。
        min_logical_reads [单次最小逻辑读取次数] ,--该计划在单个执行期间所执行的最少逻辑读取次数。
        max_logical_reads [单次最大逻辑读取次数] ,--该计划在单个执行期间所执行的最多逻辑读取次数。
        total_elapsed_time / 1000 / 1000 [计划所用的总时间] ,--上次完成执行此计划所用的总时间(以微秒为单位报告,但仅精确到毫秒)。    
        last_elapsed_time / 1000 / 1000 [上次所用时间] ,--最近一次完成执行此计划所用的时间(以微秒为单位报告,但仅精确到毫秒)。
        min_elapsed_time / 1000 / 1000 [单次所用最小时间] ,--任何一次完成执行此计划所用的最小时间(以微秒为单位报告,但仅精确到毫秒)。
        max_elapsed_time / 1000 / 1000 [单次所用最大时间]  --任何一次完成执行此计划所用的最大时间(以微秒为单位报告,但仅精确到毫秒)。

 FROM   sys.dm_exec_query_stats AS qs
        CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS st
 ORDER BY max_worker_time DESC   '
  if(@IsPrint=1)
  begin
   PRINT @SQL
  end
  EXEC (@SQL)
            END 
    END

GO

 

posted @ 2011-09-05 12:50  晓梦庄子  阅读(379)  评论(0)    收藏  举报