2017-11-13 3 views
0

IIS Webアプリケーションの背後にあるSQL Server 2014の20GBデータベースを24時間365日にクエリして無効にすることはなく、自動クローズはオフになっていますが、手動でトリガされる「日次作業キュー」ストアドプロシージャがあります。最初に実行します。MSSQLが最初に実行されたときにprocが遅く格納され、キャッシュされていないインデックス?

午前中に初めて使用されたときは、ゆっくりと実行されます - 待ってからもう一度実行すると、即時応答に戻ります。サーバーの他の負荷も同時に最小限に抑えられ、ページ寿命は健全で、このクエリをサポートするために必要なインデックスが必要です。または、少なくとも追加のインデックスは推奨されていません。

これをクエリ最適化の問題として取り上げ、どこにもいないようにするために、他のアイデアを検討し始めました。ローカルDEVサーバにバックアップからDB復元

- 最初の実行が遅い第二の実行が高速であり、sys.dm_os_buffer_descriptors介してロードインデックス大きい(500MBの+)を参照してください - 私はDBCC DROPCLEANBUFFERSすべてをシミュレートするために実行する場合、バッファからアンロードされます次回の実行は遅くなり、インデックスがキャッシュされているのを見ることができ、インデックスはすぐに実行されます。

私たちが経験しているパターンに合っているように見えますが、MSSQLが10時間以上使用されていないデータのキャッシュを解除するとは思わしくありません。

私はもっと明白な何かを逃しましたか?私が正しい道にいると仮定すると、この問題を横断する最初の人にはなれないので、そこにはエレガントなソリューションが必要です...

+1

SQL Serverは、自発的にバッファプールからページを削除しません。それらはLRUベースで削除され、メモリ圧に基づいてより最近のページが表示されます。その10時間で、サーバーのメモリに収まるよりも多くのデータを読み込んだ場合、既存のデータは実際にバッファプールを離れてしまい、新しいI/Oが必要になります。 (実行するのは難しいかもしれませんが)エレガントな単純な解決策があります。メモリを増設し、データベースのすべてのバイトを常時メモリに格納するだけで十分です。 –

+0

ありがとう、それは知っておくと便利です - 私は既存のインデックスを見直し、それほど特殊ではないものが許容できるパフォーマンスを提供するかどうかを確認する必要があると思うので、システムのこの部分だけに大きな複雑なインデックスをロードする必要はありません –

答えて

0

"日常の仕事の待ち行列"がデータを変更する場合。インデックスをキャッシュに再構築して再ロードする必要があります。あなたが少し待つ必要がある古い車を始めるのと同じですか?

私がやっていることは、夜間にこれらの「仕事」を計画し、索引がキャッシュにロードされるように基本的なクエリをプログラムすることです。

クエリを初めて実行するときにハードウェア(ディスク、メモリ)をチェックして、ディスクがディスクからデータを取得(スロー)し、メモリに保存する必要があります。

+0

作業キューはデータを変更せず、既存のデータを読み取り、未処理のタスクを返します。ストアドプロシージャを "必要"にする前にトライアルしますが、醜い回避策のように感じます。 –

関連する問題