查询当前系统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

浙公网安备 33010602011771号