none
如何获取某一个时间段的TOP SQL? RRS feed

  • 问题

  •   我们想开发一个获取SQLServer Top SQL的监控,但又不能通过sql profile去获取数据,因为需要一直抓取数据,开启profile的成本太高,所以使用了 sys.dm_exec_query_stats 去获取TOP SQL,但它返回结果是累积值,那么我如何去获取某一个时间段的TOP SQL
    2019年9月6日 9:32

全部回复

  • Hi Wison.W.He,

     

    你可以使用下面的代码查询过去一小时内具有最长平均执行时间的查询数量:

     

    SELECT TOP 10 rs.avg_duration, qt.query_sql_text, q.query_id, 

        qt.query_text_id, p.plan_id, GETUTCDATE() AS CurrentUTCTime,  

        rs.last_execution_time  

    FROM sys.query_store_query_text AS qt  

    JOIN sys.query_store_query AS q  

        ON qt.query_text_id = q.query_text_id  

    JOIN sys.query_store_plan AS p  

        ON q.query_id = p.query_id  

    JOIN sys.query_store_runtime_stats AS rs  

        ON p.plan_id = rs.plan_id 

    WHERE rs.last_execution_time > DATEADD(hour, -1, GETUTCDATE()) 

    ORDER BY rs.avg_duration DESC;

     

     

    更多详情请参考:https://docs.microsoft.com/zh-cn/sql/relational-databases/performance/monitoring-performance-by-using-the-query-store?view=sql-server-2017

     

    Best regards,

    Dedmon Dai


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com

    2019年9月9日 7:01
  • 指定时间段的完整操作,要么 profiler,要么用扩展事件,本质上都是在一直抓取数据
    2019年9月9日 7:03
  • Hi Wison.W.He,

     

    你可以使用下面的代码查询过去一小时内具有最长平均执行时间的查询数量:

     

    SELECT TOP 10 rs.avg_duration, qt.query_sql_text, q.query_id, 

        qt.query_text_id, p.plan_id, GETUTCDATE() AS CurrentUTCTime,  

        rs.last_execution_time  

    FROM sys.query_store_query_text AS qt  

    JOIN sys.query_store_query AS q  

        ON qt.query_text_id = q.query_text_id  

    JOIN sys.query_store_plan AS p  

        ON q.query_id = p.query_id  

    JOIN sys.query_store_runtime_stats AS rs  

        ON p.plan_id = rs.plan_id 

    WHERE rs.last_execution_time > DATEADD(hour, -1, GETUTCDATE()) 

    ORDER BY rs.avg_duration DESC;

     

     

    更多详情请参考:https://docs.microsoft.com/zh-cn/sql/relational-databases/performance/monitoring-performance-by-using-the-query-store?view=sql-server-2017

     

    Best regards,

    Dedmon Dai


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com

    看了下,你这个是会用到Query Store。这个是在2017中才有的吧。在2008中没办法呢
    2019年9月11日 0:52
  • 指定时间段的完整操作,要么 profiler,要么用扩展事件,本质上都是在一直抓取数据
    嗯。想到了只有通过这两种开启。但是又不可能一直打开。这个就很郁闷。另外,我们也是想统计一个时间段的TOP SQL。也即是,即使用了Profiler或者扩展事件,后续还是要做汇总。
    2019年9月11日 0:54
  • 你可以通过 job 定时开,定时关,也就是只在你指定的时弊段内跑

    然后是统计,这些结果可以直接导入到表表做统计(profile 可以直接结果到表)

    2019年9月11日 1:09
  • 你可以

    1、每小时把 sys.dm_exec_query_stats的结果保存下来,做对比

    2、每小时把执行计划缓存清一下(不推荐)


    想不想时已是想,不如不想都不想。

    2019年9月11日 2:06
    版主