1) 先清除缓存计划,注意生产环境谨慎使用此语句!

dbcc freeProcCache


2) 再执行查询,系统使用等等

3) 查找执行最长的语句时间,可能需要执行多次来判断平均时间,代码如下:

SELECT  creation_time  N'语句编译时间'


        ,last_execution_time  N'上次执行时间'


        ,total_physical_reads N'物理读取总次数'


        ,total_logical_reads/execution_count N'每次逻辑读次数'


        ,total_logical_reads  N'逻辑读取总次数'


        ,total_logical_writes N'逻辑写入总次数'


        , execution_count  N'执行次数'


        , total_worker_time/1000 N'所用的CPU总时间ms'


        , total_elapsed_time/1000  N'总花费时间ms'


        , (total_elapsed_time / execution_count)/1000  N'平均时间ms'


        ,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) N'执行语句'


FROM sys.dm_exec_query_stats AS qs


CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) st


where 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) not like '%fetch%'


ORDER BY  total_elapsed_time / execution_count DESC;



4) 根据第 3 步 结果,复制最长时间的语句,然后执行,同时调出执行计划(CTRL+M)

根据执行计划里占用最长的百分比,查看属性,输出列表


5) 根据输出表的列去优化,例如建立索引