パフォーマンス比較を実行する前にキャッシュをクリアするSQL Serverコマンド


46

2つの異なるクエリの実行時間を比較する場合、最初のクエリの実行によって2番目のクエリのパフォーマンスが変わらないことを確認するためにキャッシュをクリアすることが重要です。

Google検索では、次のコマンドを見つけることができました。

DBCC FREESYSTEMCACHE
DBCC FREESESSIONCACHE
DBCC FREEPROCCACHE

実際、私のクエリは、数回実行した後、以前よりも現実的な時間で完了しています。ただし、これが推奨される手法であるかどうかはわかりません。

ベストプラクティスは何ですか?

回答:


44

個人的には、一般的なクエリの場合、2回目以降の実行がより重要になります。

ディスクIOまたはクエリのパフォーマンスをテストしていますか?

クエリが頻繁に実行され、重要であると仮定すると、実際の生活条件下でそれを測定する必要があります。そして、毎回prodサーバーのキャッシュをクリアしたくありません...

もし欲しかったらどうぞ:

  • DBCC DROPCLEANBUFFERSバッファプールからクリーン(未修飾の)ページクリア
    していることをプリをCHECKPOINT最初にディスクに任意のダーティページをフラッシュします
  • DBCC FLUSHPROCINDB そのデータベースの実行計画をクリアします

(DBA.SEで)も参照してください


3
実行中にエラーが発生しましたDBCC FLUSHPROCINDB:DBCCステートメントに誤った数のパラメーターが指定されました。

最後にそれを見つけた:DECLARE @myDb AS INT = DB_ID(); DBCC FLUSHPROCINDB(@myDb); GOここから: stackoverflow.com/questions/7962789/...
ハンス・ボン

14

遅い答えですが、他の読者にとって役に立つかもしれません

DBCC DROPCLEANBUFFERSは、クエリのテストとクエリの実行速度の測定によく使用されるコマンドです。このコマンド(実行時)は、実際にはデータのごく一部であるダーティページのみを残します。サーバー全体のすべてのクリーンページを削除します。

このコマンドは実稼働環境では実行しないでください。このコマンドを実行すると、バッファーキャッシュがほとんど空になります。DBCC DROPCLEANBUFFERSコマンドの実行後にクエリを実行すると、物理読み取りを使用してデータがキャッシュに戻されます。これは、メモリよりもはるかに遅くなる可能性が非常に高くなります。

繰り返しますが、このコマンドはDBCC FREEPROCCACHEと同様に扱います。何をしているかを完全に理解していない限り、実稼働サーバーで実行しないでください。

これは、メモリ内のデータのキャッシュによる速度/効率の変更なしに、パフォーマンステスト環境で何度もクエリを実行できるため、有用な開発ツールとなります。

詳細:http : //www.sqlshack.com/insight-into-the-sql-server-buffer-cache/


9

私はいつも使用するように言われました:

dbcc dropcleanbuffers;

MSDNから:

DBCC DROPCLEANBUFFERSを使用して、サーバーをシャットダウンおよび再起動せずに、コールドバッファーキャッシュでクエリをテストします。

バッファプールからクリーンバッファを削除するには、まずCHECKPOINTを使用してコールドバッファキャッシュを作成します。これにより、現在のデータベースのすべてのダーティページがディスクに強制的に書き込まれ、バッファが消去されます。これを行った後、DBCC DROPCLEANBUFFERSコマンドを発行して、バッファープールからすべてのバッファーを削除できます。


2
Plusは:DBCC FREEPROCCACHE...任意のキャッシュされた実行計画をクリアする
marc_s

1
あなたがIOをテストする場合にのみ、きっと...
GBN

3

他の答えは、実行しない理由については正しいDBCC FREEPROCCACHEです。ただし、そうする理由もいくつかあります。

  1. 一貫性

異なる方法で同じことをしようとしている2つの異なるクエリまたはプロシージャを比較する場合、同じページにヒットする可能性があります。単純にクエリ#1を実行してからクエリ#2を実行すると、これらのページが最初のクエリでキャッシュされたため、2番目のクエリの方がはるかに高速になります。各実行の前にキャッシュをクリアすると、それらは均等に開始されます。

ホットキャッシュのパフォーマンスをテストする場合は、クエリを数回実行し、交互に実行して、最初の数回の実行を破棄してください。結果を平均します。

  1. 最悪のパフォーマンス

ホットキャッシュに対して1秒かかり、コールドキャッシュに対して1分かかるクエリがあるとします。インメモリクエリを20%遅くするがIOバインドクエリを20%速くする最適化は、大きな勝利になる可能性があります:通常の操作では、通常の状況では余分な200ミリ秒に気付かないでしょうが、何かがクエリを強制する場合ディスクに対して実行すると、60秒ではなく48秒かかるため、売り上げを節約できます。

これは、数10ギガバイトのメモリと比較的高速なSANおよびSSDストレージを備えた最新のシステムではあまり問題になりませんが、それでも重要です。一部のアナリストがOLTPデータベースに対して大量のテーブルスキャンクエリを実行して、バッファキャッシュの半分を消去した場合、ストレージ効率の高いクエリを使用すると、速度が速くなります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.