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で取得することができます。
指定した日時以降に実行したSQLを実行された順に並べて取得する場合
こちらは Microsoft MSDN のサイトにあるサンプルを実行してみた結果です。
テスト環境で実行しているので時間のかかるクエリはないのですが。
CPU の平均時間で順位付けされた上位5つのクエリに関する情報を取得しています。
詳細はページ下部の参考情報に記載したMSDNのページをご参照ください。
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
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