回答:
個人的には、一般的なクエリの場合、2回目以降の実行がより重要になります。
ディスクIOまたはクエリのパフォーマンスをテストしていますか?
クエリが頻繁に実行され、重要であると仮定すると、実際の生活条件下でそれを測定する必要があります。そして、毎回prodサーバーのキャッシュをクリアしたくありません...
もし欲しかったらどうぞ:
DBCC DROPCLEANBUFFERS
バッファプールからクリーン(未修飾の)ページクリアCHECKPOINT
最初にディスクに任意のダーティページをフラッシュしますDBCC FLUSHPROCINDB
そのデータベースの実行計画をクリアします(DBA.SEで)も参照してください
DECLARE @myDb AS INT = DB_ID(); DBCC FLUSHPROCINDB(@myDb); GO
ここから: stackoverflow.com/questions/7962789/...
遅い答えですが、他の読者にとって役に立つかもしれません
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コマンドを発行して、バッファープールからすべてのバッファーを削除できます。
DBCC FREEPROCCACHE
...任意のキャッシュされた実行計画をクリアする
他の答えは、実行しない理由については正しいDBCC FREEPROCCACHE
です。ただし、そうする理由もいくつかあります。
異なる方法で同じことをしようとしている2つの異なるクエリまたはプロシージャを比較する場合、同じページにヒットする可能性があります。単純にクエリ#1を実行してからクエリ#2を実行すると、これらのページが最初のクエリでキャッシュされたため、2番目のクエリの方がはるかに高速になります。各実行の前にキャッシュをクリアすると、それらは均等に開始されます。
ホットキャッシュのパフォーマンスをテストする場合は、クエリを数回実行し、交互に実行して、最初の数回の実行を破棄してください。結果を平均します。
ホットキャッシュに対して1秒かかり、コールドキャッシュに対して1分かかるクエリがあるとします。インメモリクエリを20%遅くするがIOバインドクエリを20%速くする最適化は、大きな勝利になる可能性があります:通常の操作では、通常の状況では余分な200ミリ秒に気付かないでしょうが、何かがクエリを強制する場合ディスクに対して実行すると、60秒ではなく48秒かかるため、売り上げを節約できます。
これは、数10ギガバイトのメモリと比較的高速なSANおよびSSDストレージを備えた最新のシステムではあまり問題になりませんが、それでも重要です。一部のアナリストがOLTPデータベースに対して大量のテーブルスキャンクエリを実行して、バッファキャッシュの半分を消去した場合、ストレージ効率の高いクエリを使用すると、速度が速くなります。
DBCC FLUSHPROCINDB
:DBCCステートメントに誤った数のパラメーターが指定されました。