web-dev-qa-db-ja.com

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

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

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

DBCC FREESYSTEMCACHE
DBCC FREESESSIONCACHE
DBCC FREEPROCCACHE

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

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

49
andrerpena

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

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

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

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

  • DBCC DROPCLEANBUFFERSバッファプールからクリーンな(変更されていない)ページをクリアします
    先頭にCHECKPOINTを付けて、ダーティページを最初にディスクにフラッシュします
  • DBCC FLUSHPROCINDBそのデータベースの実行プランをクリアします

(DBA.SE上)も参照

45
gbn

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

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

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

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

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

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

15
Thomas Bovee

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

dbcc dropcleanbuffers;

から [〜#〜] msdn [〜#〜]

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

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

10
DaveShaw

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

  1. 一貫性

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

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

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

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

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

3