2つの異なるクエリの実行時間を比較する場合、最初のクエリの実行によって2番目のクエリのパフォーマンスが変化しないことを確認するために、キャッシュをクリアすることが重要です。
Google検索で、次のコマンドを見つけることができました。
DBCC FREESYSTEMCACHE
DBCC FREESESSIONCACHE
DBCC FREEPROCCACHE
実際、いくつかの実行後、私のクエリは以前よりも現実的な時間で完了しています。ただし、これが推奨されるテクニックかどうかはわかりません。
ベストプラクティスは何ですか?
個人的には、一般的なクエリの場合、2回目以降の実行の方が重要です。
ディスクIOまたはクエリのパフォーマンスをテストしていますか?
クエリが頻繁に実行され、重要であると想定すると、実際の条件下でそれを測定する必要があります。そして、毎回prodサーバーのキャッシュをクリアしたくありません...
もし欲しかったらどうぞ:
DBCC DROPCLEANBUFFERS
バッファプールからクリーンな(変更されていない)ページをクリアしますCHECKPOINT
を付けて、ダーティページを最初にディスクにフラッシュしますDBCC FLUSHPROCINDB
そのデータベースの実行プランをクリアします(DBA.SE上)も参照
遅い回答ですが、他の読者にも役立つかもしれません
DBCC DROPCLEANBUFFERS
は、クエリのテストやクエリの実行速度の測定によく使用されるコマンドです。このコマンド(実行時)は、実際にはデータのごく一部であるダーティページのみを残します。サーバー全体のすべてのクリーンページを削除します。
このコマンドは実稼働環境ではしないでくださいことに注意してください。このコマンドを実行すると、バッファキャッシュがほとんど空になります。 DBCC DROPCLEANBUFFERS
コマンドの実行後にクエリを実行すると、物理読み取りを使用してデータがキャッシュに戻されます。これは、メモリよりもかなり低速になる可能性があります。
繰り返しますが、このコマンドはDBCC FREEPROCCACHE
と同様に扱います。何をしているのか絶対に理解していない限り、本番サーバーでは実行しないでください。
メモリ内のデータのキャッシュによる速度/効率の変更なしに、パフォーマンステスト環境でクエリを何度も実行できるため、これは便利な開発ツールになります。
詳細: http://www.sqlshack.com/insight-into-the-sql-server-buffer-cache/
私はいつも使うように言われました:
dbcc dropcleanbuffers;
から [〜#〜] msdn [〜#〜] :
サーバーをシャットダウンして再起動せずに、DBCC DROPCLEANBUFFERSを使用して、コールドバッファキャッシュでクエリをテストします。
クリーンなバッファーをバッファープールから削除するには、まずCHECKPOINTを使用してコールドバッファーキャッシュを作成します。これにより、現在のデータベースのすべてのダーティページが強制的にディスクに書き込まれ、バッファがクリーンアップされます。これを行った後、DBCC DROPCLEANBUFFERSコマンドを発行して、バッファープールからすべてのバッファーを削除できます。
他の答えはnotを実行する理由について正しいDBCC FREEPROCCACHE
。ただし、そうする理由もいくつかあります。
同じことを異なる方法で実行しようとしている2つの異なるクエリまたはプロシージャを比較する場合、それらは同じページにヒットする可能性があります。単純にクエリ#1を実行してからクエリ#2を実行した場合、これらのページが最初のクエリによってキャッシュされたため、2番目のクエリの方がはるかに高速になる可能性があります。各実行の前にキャッシュをクリアすると、それらは均等に始まります。
ホットキャッシュのパフォーマンスをテストしたい場合は、クエリを数回交互に実行し、最初の数回の実行を破棄してください。結果を平均化します。
ホットキャッシュに対して1秒、コールドキャッシュに対して1分かかるクエリがあるとします。インメモリクエリを20%遅くするが、IOバウンドクエリを20%速くする最適化は大きな成功である可能性があります。通常の操作では、通常の状況で余分な200ミリ秒に気付くことはありませんが、何かがクエリを強制するとディスクに対して実行すると、60秒ではなく48秒かかるため、売り上げを節約できます。
これは、数十ギガバイトのメモリと比較的高速なSANおよびSSDストレージを備えた最近のシステムではそれほど問題ではありませんが、それでも問題はありません。一部のアナリストがあなたの=に対して大規模なテーブルスキャンクエリを実行した場合OLTPデータベースはバッファキャッシュの半分を一掃します。ストレージ効率の高いクエリを使用すると、より高速にバックアップできます。