web-dev-qa-db-ja.com

最も高価なクエリを記録して見つける方法はありますか?

Sql2k8のアクティビティモニターを使用すると、最も高価なクエリを確認できます。 OK、それは素晴らしいことですが、この情報を記録したり、クエリアナライザーでこの情報を取得したりする方法はありますか? SQL管理コンソールを開きたくないので、アクティビティモニターダッシュボードを見ています。

どのクエリが適切に記述されていないか/スキーマが適切に設計されていないなどを把握したい.

助けてくれてありがとう!

64
Pure.Krome
  1. SQL Server Profiler(SSMSの[ツール]メニュー)を使用して、これらのイベントを記録するトレースを作成します。

    _ RPC:Completed
     SP:Completed
     SP:StmtCompleted
     SQL:BatchCompleted
     SQL:StmtCompleted
    _
  2. 標準のトレーステンプレートから開始して、それを整理できます。特定のデータベース用であるか、サーバー全体用であるかを指定しませんでした。特定のデータベース用である場合、DatabaseID列を含め、DBにフィルターを設定します(SELECT DB_ID('dbname'))。各イベントに論理読み取りデータ列が含まれていることを確認してください。ファイルに記録するようにトレースを設定します。このトレースをバックグラウンドで無人で実行する場合、十分なスペースがある場合は最大トレースファイルサイズを500MBまたは1GBに設定することをお勧めします(すべてはサーバー上のアクティビティの量に依存するため、あなたはそれを吸って見なければならないでしょう)。

  3. トレースを短時間開始してから一時停止します。 「ファイル」->「エクスポート」->「スクリプトトレース定義」に移動し、DBバージョンを選択して、ファイルに保存します。これで、プロファイラーGUIを介して実行するよりもオーバーヘッドがはるかに少ないトレースを作成するSQLスクリプトが作成されました。このスクリプトを実行すると、トレースID(通常_@ID=2_)が出力されます。これに注意してください。

  4. トレースファイル(.trc)を取得したら(最大ファイルサイズに達したためにトレースが完了したか、実行中のトレースを停止します

    EXEC sp_trace_setstatus @ ID、0
    EXEC sp_trace_setstatus @ ID、2

プロファイラーにトレースをロードするか、 ClearTrace (非常に便利)を使用するか、次のようにテーブルにロードします。

_SELECT * INTO TraceTable
FROM ::fn_trace_gettable('C:\location of your trace output.trc', default)
_

次に、クエリを実行して、次のようなデータを集約できます。

_SELECT COUNT(*) AS TotalExecutions, 
    EventClass, CAST(TextData as nvarchar(2000))
 ,SUM(Duration) AS DurationTotal
 ,SUM(CPU) AS CPUTotal
 ,SUM(Reads) AS ReadsTotal
 ,SUM(Writes) AS WritesTotal
FROM TraceTable
GROUP BY EventClass, CAST(TextData as nvarchar(2000))
ORDER BY ReadsTotal DESC
_

コストのかかるクエリを特定したら、実際の実行計画を生成して調べることができます。

64
Mitch Wheat

次のスクリプトは結果を提供します。

SELECT TOP 10 
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 total_elapsed_time_in_S,
qs.last_elapsed_time/1000000 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.plan_handle) qp
ORDER BY qs.total_logical_reads DESC 
21
gngolakia

このツールについて聞いたことがありませんでしたが、Microsoftは、最も遅いクエリを含めて、これを正確に提供する素晴らしい仕事をする一連のレポートを提供しています。 パフォーマンスダッシュボードレポート をご覧ください。

SQL 2008互換かどうかはわかりませんが、チェックアウトする価値があります。

4
Tom Lianza

SQL Server 2008には、サーバーによって自動的に維持される動的管理ビューの上に構築される新しいツール Performance Studio があり、サーバーのパフォーマンスの概要を示します。チェックアウトする価値があります。

2
jaraics

SQL Server Profilerは必要なことを行いますか? 2008はまだ使用していないので、ツールがまだ存在するかどうかはわかりませんが、トレースを設定して、特定の条件を満たすクエリ(CPUを実行し、上記のCPUを実行するクエリなど)特定のしきい値)。

私たちはこれをプロジェクトで使用しており、実行が不十分なクエリのトラブルシューティングに役立っています(フルタイムのままにしてはいけませんが、パフォーマンスヘルスの追跡には一般的なWindowsパフォーマンスカウンターを使用してください)。

2
cfeduke

(Dell)Quest SQL Optimizer for SQL Server 9.0には、ユーザーがSQL Serverで最もリソースを消費するSQLを見つけることができるFind SQLモジュールが導入されています。 https://support.quest.com/softwaredownloads.aspx?pr=268445262

0
user2485339