none
数据库sql server 语句top10的问题 RRS feed

  • 问题

  • 以前总是执行top10的语句给自己看,比如查询最浪费cpu的top10,磁盘IO最大的top10语句。

    最近有个需求,就是把每天的top10,发给所有的开发的同事,看谁写的sql 语句最恶心。

    出现了一个细节上的问题。

    通过 sys.dm_exec_query_stats 和 sys.dm_exec_sql_text 出来的查询dbid有很多是空的。官方解释:

    对于临时和预定义 SQL 语句为 NULL。

    SELECT TOP 5 total_worker_time/execution_count AS [Avg CPU Time],
        db_name(dbid) as dbname,    --这里怎么改造一下,能显示出dbname
        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;

    怎么改造一下,能显示出数据库的名字。

    如果没有语句执行的dbname的话,发给开发的人员,看起来不是很友好,很多人不知道是不是自己的脚本浪费资源。

    多谢各位!

     

     

     

     

     

     

    2010年9月19日 6:22

答案

全部回复

  • What's wrong with db_name function? You'll not get db name if dbid is null.
    2010年9月20日 0:02
  • 大哥,我是要得到dbname啊。

    但是top10出来的dbid是空,看看有没有别的办法可以获取到dbname。

    或者有什么类似的思路也可以,只要获取最浪费cpu资源的sql语句,能包含执行的数据库的名字就行。

     

    我现在有一个想法,非常的烂。就是用profiler定时跟踪一段时间脚本到一个表,从表中统计出来。。但是这个并不能

    代表所有的情况,我总不能一天24小时都开着profiler。

    2010年9月20日 1:05
  • Not every query has dbid in that dm, depends on where the query came from. But you can get some idea with object name and query itself. 

    2010年9月20日 2:56
  • 请教版主,您最后是怎么解决这个问题的,我也遇到这个问题,如果没有dbid,开发部门会认为不是他们数据库出的问题,因为一个实例数据库很多,还望指教,谢谢!
    2013年10月12日 6:39
  • You can find out db with object name like table/sp, etc.
    2013年10月12日 15:34