HOME >> Tips >> Microsoft SQL Server

SQL Server で実行された SQL を SQL で取得する方法

2017/3/3
文書番号:20703

SQL Server で実行されたSQL(クエリ)を取得する方法として SQL Server のログに出力する方法や、SQL Server Profiler を使用する方法を紹介しましたが、 今回はSQL で取得する方法です。

SQL Server に発行されたクエリをログに出力する

SQL Server Profiler を使用して SQL Server で実行される SQL を監視する


以下のSQLで取得することができます。

SELECT st.text
FROM   sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) st

クリックで拡大


指定した日時以降に実行したSQLを実行された順に並べて取得する場合

SELECT st.text
      ,last_execution_time
FROM   sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) st
WHERE  last_execution_time >= '2017/03/01 10:30:00'
ORDER BY last_execution_time

こちらは Microsoft MSDN のサイトにあるサンプルを実行してみた結果です。
テスト環境で実行しているので時間のかかるクエリはないのですが。

CPU の平均時間で順位付けされた上位5つのクエリに関する情報を取得しています。
詳細はページ下部の参考情報に記載したMSDNのページをご参照ください。

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; 

クリックで拡大

【参考情報】

[MSDN] sys.dm_exec_sql_text (Transact-SQL)
https://msdn.microsoft.com/ja-jp/library/ms181929.aspx

[MSDN] sys.dm_exec_query_stats (Transact-SQL)
https://msdn.microsoft.com/ja-jp/library/ms189741.aspx