2008开始有报表直接查出来的。你也可以监控一下它用的是什么SQL

解决方案 »

  1.   

    运行时间最长的查询
    SELECT  SUBSTRING(qt.text, ( qs.statement_start_offset / 2 ) + 1,
                      ( ( CASE qs.statement_end_offset
                            WHEN -1 THEN DATALENGTH(qt.text)
                            ELSE qs.statement_end_offset
                          END - qs.statement_start_offset ) / 2 ) + 1) ,
            qs.execution_count ,
            qs.total_logical_reads ,
            qs.last_logical_reads ,
            qs.total_logical_writes ,
            qs.last_logical_writes ,
            qs.total_worker_time ,
            qs.last_worker_time ,
            qs.total_elapsed_time / 1000000 AS total_elapsed_time_in_S ,
            qs.last_elapsed_time / 1000000 AS last_elapsed_time_in_S ,
            qs.last_execution_time ,
            qp.query_plan
    FROM    sys.dm_exec_query_stats qs
            CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) qt
            CROSS APPLY sys.dm_exec_query_plan(qs.sql_handle) qpORDER BY qs.total_worker_time DESC --CPU时间
      

  2.   

    CROSS APPLY sys.dm_exec_query_plan(qs.sql_handle) qp
    ==>
    CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) qp一点小bug我想问的是:
    我列出来的第一种有什么问题?
      

  3.   

    我去,你自己只要稍微看一下就知道了
    CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle)
    目的是为了查询对应的sql语句执行的信息是从sys.dm_exec_query_stats 中查询得到的
    然后 根据 qs.last_elapsed_time 倒序排序,不知道告诉我你不知道last_elapsed_time 是啥意思
    真不知道的话,继续看你的sql
    , CAST(qs.last_elapsed_time / 1000000.0 AS DECIMAL(28, 2)) AS [最后完成消耗秒数]
    我真觉得你没必要纠结是否CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle)
      

  4.   

    我自己的笔记*************************************************************************
    sys.dm_exec_query_stats 
    *************************************************************************返回缓存查询计划的聚合性能统计信息。
    缓存计划中的每个查询语句在该视图中对应一行,并且行的生存期与计划本身相关联。
    在从缓存删除计划时,也将从该视图中删除对应行。配合sys.dm_exec_query_plan,查询sql缓存的执行计划信息
    配合sys.dm_exec_sql_text,查询缓存的sql信息
      

  5.   

    以前总是喜欢收集一些统计top的sql,见一个收集一个,越来越多……后来就总结了一下,这些统计,都是从特定的几个DMV中查询出来的,直接跟不同的对象关联,得到想要的对象 
      

  6.   

    基本的东西我还是懂的, 我想问的是:
    (select text from sys.dm_exec_sql_text(sql_handle)) as [SQL]
    这个是否合理?
      

  7.   

    你觉得有区别吗?
    CROSS APPLY的原理也是子查询
    你想比较什么
      

  8.   

    基本的东西我还是懂的, 我想问的是:
    (select text from sys.dm_exec_sql_text(sql_handle)) as [SQL]
    这个是否合理?什么叫做合理?
    主要看你想要看什么结果了
    你统计top sql,不就是为了看看是那些个sql吗,不看文本,光看那些聚合结果有啥用
      

  9.   

    不好意思,我明白你的意思了,这是sql写法的问题,用在这里,个人感觉没啥不一样的
      

  10.   


    两个sql查询出来的字段有什么不一样吗?
      

  11.   


    两个sql查询出来的字段有什么不一样吗?不要看行数, 看行数, 这个如果仔细研究, 肯定是有区别的。
    --1. 不用 CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle)
    取的是部分SQL--2. 用 CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle)
    取的是全部SQL不明白为何无一人认真研究这个问题……
      

  12.   

    最好别用 这个 (select text from sys.dm_exec_sql_text(sql_handle)) a因为,这个是完整的语句,而实际上,我们需要的是一个 明细的统计信息,比如,你执行了一个存储过程,里面有N多语句,但是哪些语句运行慢,哪些语句运行快呢?通过 cross apply 我们可以找到相应的语句,同时,通过:SUBSTRING(qt.text, ( qs.statement_start_offset / 2 ) + 1,
                      ( ( CASE qs.statement_end_offset
                            WHEN -1 THEN DATALENGTH(qt.text)
                            ELSE qs.statement_end_offset
                          END - qs.statement_start_offset ) / 2 ) + 1) 这段,取出 当前存储过程中 某一个语句,看他的运行效率。另外 ,cross apply 和子查询的结果应该是不一样的,cross apply相当于inner join,所以如果没有对应的sql文本,那么就不返回结果。而 子查询,会返回所有的 sys.dm_exec_query_stats中的记录,所以是不完全一样的。
      

  13.   

    你要弄清楚
    SUBSTRING(qt.text, ( qs.statement_start_offset / 2 ) + 1,
                      ( ( CASE qs.statement_end_offset
                            WHEN -1 THEN DATALENGTH(qt.text)
                            ELSE qs.statement_end_offset
                          END - qs.statement_start_offset ) / 2 ) + 1) 这一段sql是干嘛的?不就是去掉变量的定义,直接揪出来语句本身,
    (@0 int,@2 int,@3 int)select * from table where [Status] = @0 ……  between @2 and @3
    变成语句本身
    select * from table where [Status] = @0 ……  between @2 and @3查询结果出了这一列的处理,其他的不一样我给他吃了!!!!!!!!!
      

  14.   

    另外 cross apply和子查询当然不完全一样,但是在用这里,效果是完全一样的