• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
PowerCoder
博客园    首页    新随笔    联系   管理    订阅  订阅

查看SQLServer最耗资源时间的SQL语句(转载)

sql server中,如果想知道有哪些语句是执行效率不高的,应该如何查看呢?下面就将为您介绍sql server中如何查看执行效率不高的语句,供您参考。

 

1.找出执行时间最长的10条SQL(适用于SQL SERVER 2005及其以上版本)
Sql代码

SELECT top 10    
    (total_elapsed_time / execution_count)/1000 N'平均时间ms'    
    ,total_elapsed_time/1000 N'总花费时间ms'    
    ,total_worker_time/1000 N'所用的CPU总时间ms'    
    ,total_physical_reads N'物理读取总次数'    
    ,total_logical_reads/execution_count N'每次逻辑读次数'    
    ,total_logical_reads N'逻辑读取总次数'    
    ,total_logical_writes N'逻辑写入总次数'    
    ,execution_count N'执行次数'    
    ,creation_time N'语句编译时间'    
    ,last_execution_time 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    
    ) N'执行语句'    
    ,qp.query_plan    
FROM  sys.dm_exec_query_stats AS qs   
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) st   
CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) qp    
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;    
  
  
如果想对SQL作筛选,可将  
not like '%fetch%'  换成  like '%user%'就可以找出SQL语句中含有user关键字的SQL

 

2 找出执行最慢的SQL语句(适用于SQL SERVER 2005及其以上版本)
Sql代码

SELECT  
    (total_elapsed_time / execution_count)/1000 N'平均时间ms'  
    ,total_elapsed_time/1000 N'总花费时间ms'  
    ,total_worker_time/1000 N'所用的CPU总时间ms'  
    ,total_physical_reads N'物理读取总次数'  
    ,total_logical_reads/execution_count N'每次逻辑读次数'  
    ,total_logical_reads N'逻辑读取总次数'  
    ,total_logical_writes N'逻辑写入总次数'  
    ,execution_count 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) N'执行语句'  
    ,creation_time N'语句编译时间'  
    ,last_execution_time 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;  

 

3 找出最耗时的前N条T-SQL语句 (适用于SQL SERVER 2005及其以上版本)
Sql代码

--给N赋初值为30    
declare @n int set @n=30     
    
;with maco as     
(       
    select top (@n)    
        plan_handle,    
        sum(total_worker_time) as total_worker_time ,    
        sum(execution_count) as execution_count ,    
        count(1) as sql_count    
    from sys.dm_exec_query_stats group by plan_handle    
    order by sum(total_worker_time) desc    
)    
select  t.text ,    
        a.total_worker_time ,    
        a.execution_count ,    
        a.sql_count    
from    maco a    
        cross apply sys.dm_exec_sql_text(plan_handle) t    
            
/* 结果格式如下    
text     total_worker_time  execution_count   sql_count    
-------- ------------------ ----------------- ---------    
内容略    
*/  

 

4 平均耗CPU最多的前个SQL (SQL SERVER 2005或以上版本)
Sql代码

SELECT TOP 5 total_worker_time / execution_count AS [Avg CPU Time],    
    SUBSTRING(st.text, (qs.statement_start_offset/2)+1,     
        ((CASE qs.statement_end_offset    
            WHEN -1 THEN DATALENGTH(st.text)    
            ELSE qs.statement_end_offset    
            END - qs.statement_start_offset)/2) + 1) AS statement_text     
 FROM sys.dm_exec_query_stats AS qs     
 CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS st     
 ORDER BY total_worker_time/execution_count DESC  

 

5 平均耗CPU最多的前个SQL (SQL SERVER 2008或以上版本)
Sql代码

SELECT TOP 20  
    total_worker_time/1000 AS [总消耗CPU 时间(ms)],execution_count [运行次数],  
    qs.total_worker_time/qs.execution_count/1000 AS [平均消耗CPU 时间(ms)],  
    last_execution_time AS [最后一次执行时间],min_worker_time /1000 AS [最小执行时间(ms)],  
    max_worker_time /1000 AS [最大执行时间(ms)],  
    SUBSTRING(qt.text,qs.statement_start_offset/2+1,   
        (CASE WHEN qs.statement_end_offset = -1   
        THEN DATALENGTH(qt.text)   
        ELSE qs.statement_end_offset END -qs.statement_start_offset)/2 + 1)   
    AS [使用CPU的语法], qt.text [完整语法],  
    qt.dbid, dbname=db_name(qt.dbid),  
    qt.objectid,object_name(qt.objectid,qt.dbid) ObjectName  
FROM sys.dm_exec_query_stats qs WITH(nolock)  
CROSS apply sys.dm_exec_sql_text(qs.sql_handle) AS qt  
WHERE  execution_count>1  
ORDER BY (qs.total_worker_time/qs.execution_count/1000) DESC  

 

6 总耗CPU最多的前个SQL (SQL SERVER 2008或以上版本)
Sql代码

SELECT TOP 20  
    total_worker_time/1000 AS [总消耗CPU 时间(ms)],execution_count [运行次数],  
    qs.total_worker_time/qs.execution_count/1000 AS [平均消耗CPU 时间(ms)],  
    last_execution_time AS [最后一次执行时间],max_worker_time /1000 AS [最大执行时间(ms)],  
    SUBSTRING(qt.text,qs.statement_start_offset/2+1,   
        (CASE WHEN qs.statement_end_offset = -1   
        THEN DATALENGTH(qt.text)   
        ELSE qs.statement_end_offset END -qs.statement_start_offset)/2 + 1)   
    AS [使用CPU的语法], qt.text [完整语法],  
    qt.dbid, dbname=db_name(qt.dbid),  
    qt.objectid,object_name(qt.objectid,qt.dbid) ObjectName  
FROM sys.dm_exec_query_stats qs WITH(nolock)  
CROSS apply sys.dm_exec_sql_text(qs.sql_handle) AS qt  
WHERE execution_count>1  
ORDER BY  total_worker_time DESC

 

原文链接

 

posted @ 2024-07-10 21:02  PowerCoder  阅读(611)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3