web-dev-qa-db-ja.com

SQLサーバーで遅いクエリを識別するにはどうすればよいですか?

this like この質問への回答を探しているときに、 this post などの簡単な参照リンクを見つけました。

実行時間> some_thresholdである実行時間を含むSQLクエリのリストを生成するための、できるだけ簡潔なプロシージャを探しています。

5
adambox

答えは簡単だったので、ここにはなかったと思います。これが私が理解したことです:

  1. 開くSQL Server Profiler(パフォーマンスツール)
  2. File -> New Trace...
  3. データベースに接続する
  4. [イベントの選択]タブをクリックします
  5. SQLクエリの終了に対応するイベントのみを選択:
    • RPC:Completed
    • SQL:BatchCompleted
  6. 列フィルター...をクリックします
  7. リストでDurationをクリックします
  8. 展開以上、「遅い」と見なすしきい値時間をミリ秒単位で入力します
  9. クリック[〜#〜] ok [〜#〜]
  10. クリック実行

多数のアプリケーションを実行していて、ノイズを削減したい場合は、ApplicationNameNTUserNameなどでフィルタリングできます。一部の列のみを表示することもできます。 TextDataDurationだけです。

これがプロファイラの はるかに高度な処理 です。

9
adambox

特にトレースをデータベースにインポートする場合、プロファイラートレースを使用することは優れた方法です。

SQL Server 2005以降を使用している場合、DMV(動的管理ビュー)は代替方法を提供します。

SELECT TOP 100
(total_logical_reads + total_logical_writes) / qs.execution_count AS average_IO,
(total_logical_reads + total_logical_writes) AS total_IO,
qs.execution_count AS execution_count,
SUBSTRING (qt.text,qs.statement_start_offset/2, 
     (CASE WHEN qs.statement_end_offset = -1 
        THEN LEN(CONVERT(NVARCHAR(MAX), qt.text)) * 2 
      ELSE qs.statement_end_offset END - qs.statement_start_offset)/2) AS indivudual_query,
o.name AS object_name,
DB_NAME(qt.dbid) AS database_name
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) as qt
LEFT OUTER JOIN sys.objects o ON qt.objectid = o.object_id
where qt.dbid = DB_ID()
ORDER BY average_IO DESC;

覚えておくべきことの1つは、SQL Serverの起動時にDMVがクリアされることです。そのため、サーバーが12分間稼働していると、多くのことはわかりません。また、これらは累積的であるため、メンテナンスウィンドウ(checkDB)がデータを歪める可能性があります。

0
Peter Schofield