IIS Webアプリケーションの背後にあるSQL Server 2014の20GBデータベースを24時間365日にクエリして無効にすることはなく、自動クローズはオフになっていますが、手動でトリガされる「日次作業キュー」ストアドプロシージャがあります。最初に実行します。MSSQLが最初に実行されたときにprocが遅く格納され、キャッシュされていないインデックス?
午前中に初めて使用されたときは、ゆっくりと実行されます - 待ってからもう一度実行すると、即時応答に戻ります。サーバーの他の負荷も同時に最小限に抑えられ、ページ寿命は健全で、このクエリをサポートするために必要なインデックスが必要です。または、少なくとも追加のインデックスは推奨されていません。
これをクエリ最適化の問題として取り上げ、どこにもいないようにするために、他のアイデアを検討し始めました。ローカルDEVサーバにバックアップからDB復元
- 最初の実行が遅い第二の実行が高速であり、sys.dm_os_buffer_descriptors介してロードインデックス大きい(500MBの+)を参照してください - 私はDBCC DROPCLEANBUFFERSすべてをシミュレートするために実行する場合、バッファからアンロードされます次回の実行は遅くなり、インデックスがキャッシュされているのを見ることができ、インデックスはすぐに実行されます。
私たちが経験しているパターンに合っているように見えますが、MSSQLが10時間以上使用されていないデータのキャッシュを解除するとは思わしくありません。
私はもっと明白な何かを逃しましたか?私が正しい道にいると仮定すると、この問題を横断する最初の人にはなれないので、そこにはエレガントなソリューションが必要です...
SQL Serverは、自発的にバッファプールからページを削除しません。それらはLRUベースで削除され、メモリ圧に基づいてより最近のページが表示されます。その10時間で、サーバーのメモリに収まるよりも多くのデータを読み込んだ場合、既存のデータは実際にバッファプールを離れてしまい、新しいI/Oが必要になります。 (実行するのは難しいかもしれませんが)エレガントな単純な解決策があります。メモリを増設し、データベースのすべてのバイトを常時メモリに格納するだけで十分です。 –
ありがとう、それは知っておくと便利です - 私は既存のインデックスを見直し、それほど特殊ではないものが許容できるパフォーマンスを提供するかどうかを確認する必要があると思うので、システムのこの部分だけに大きな複雑なインデックスをロードする必要はありません –