正確なクエリパフォーマンスを得るには?


9

ストアドプロシージャのパフォーマンスを改善しようとしています。SPを実行すると、何かがキャッシュされているかのように、ほぼ瞬時に終了します。SSMSでSPを実行する前に、次の2行のSQLを使用するように言われました。

DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE

上記の2行のコードでSPを実行すると、SPは約8秒で終了します。しかし、これは本当に私に本当の実行時間を与えていますか?どうやって知るの?


回答:


9

これらのコマンドは2つのことを行います。

  • ページキャッシュをクリアします。これは、ディスクから既に取得されたデータページを格納します(通常、クエリにおける時間の最大の要因はディスクアクセスです)。
  • クエリプランのキャッシュをクリアします。つまり、サーバーは新しいクエリプランを作成する必要があります。これは、非常に大量のトランザクションを除いて、通常は重要ではありません。

基本的に、「最悪の場合」のシナリオと同等の時間を取得しています。サーバーを再起動しただけで、メモリには何もありません。これらのページはすでにメモリに読み込まれているため、以降の実行では、ディスクからデータをプルするためのコストを支払う必要はありません。

これは実際の状況に似ています。特定のクエリを実行する最初のユーザーは、同じデータをチェックしている場合、後続の実行よりも長く待機する必要があるでしょう。

私が使用したい良い方法は、複数回実行して平均を取ることです。tempdbなどの共有リソースを完全に制御できないため、これは共有環境で特に役立ちます。

これらのコマンドを使用して、舞台裏で実際に起こっていることに関する詳細情報を取得することもできます。

SET STATISTICS IO ON
SET STATISTICS TIME ON

これらは、ディスクからのページ読み取り(オブジェクトごと)、論理ページ読み取り、プランのコンパイルに費やされた時間、およびクエリの実行に費やされた時間に関する詳細情報を提供します。


いつものJNKのように素晴らしい答え。
OO

お力になれて、嬉しいです!あなたはたまたま私がよく扱ったことについて質問しているのです。レプリケーションやメモリ管理について質問しても、追加することはあまりありません:)
JNK

2
SET STATISTICS IO ONについては知っていましたが、SET STATISTICS TIME ONについては知りませんでした。JNKに感謝します。
datagod 2012年

2
参考までに、SQL Sentry Plan Explorerを使用して実際のプランを生成することにより、すべてのSET設定なしでこの情報の多くを取得できます。また、複数回(たとえば5回)実行するにはGO 5、SSMS と同じようにバッチを終了するだけです。それは無料でダウンロードできます。私はあなたに何も売ろうとはしていません。sqlsentry.net/plan-explorer/sql-server-query-view.asp
Aaron Bertrand

1
@JNKは確かに無料です。時間を節約でき、Management Studioから取得することが不可能または非常に面倒な情報を表示します。そして私はそこで働いています。:-)
アーロンバートランド
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.