web-dev-qa-db-ja.com

SQL Server-DBをメモリに強制しますか?

SQL Server 2005 64ビットを実行する強力なWindows 2008 x64サーバー(4 x 4コアCPU、32GB RAM)があります。ページはメモリにキャッシュされるまでアクセスが少し遅い(6GB)が非常に重要なデータベースがあります(使用率は非常にランダムなI/Oであるため、特定のページがメモリとエンドユーザーに存在する確率は非常に低くなります。初期の遅さについて文句を言う)。ディスクは十分高速(ローカル15K SAS)ですが、アプリは多少不格好に書かれている(COTSソリューションです)ので、SQL Server 2005のメモリにデータベースを「強制」する方法があるかどうか疑問に思っています(2008はサポートされていません)ベンダーによるので、まだそれをアップグレードすべきではありません)最初のキャッシュフィルのブルースを回避するために?

私の現在の方法は、メモリ内のデータページを取得するためにスクリプトの各テーブルからSELECT *を実行することですが、一部のオブジェクト(インデックス、全文検索など)はこのメソッドによってキャッシュされません(およびスクリプトを変更してインデックスとキャッシュに適切なWHERE句を書き込むのは、海での作業です)。

14
Matt Rogish

いいえ、残念ながらデータベースを強制的にキャッシュする方法はありません。あなたの総当たりの方法はおそらく最も簡単です。次のように、1%が断片化されている場合はインデックスを再構築するように言うなど、非常に低いしきい値設定でインデックスデフラグスクリプトを使用することで、より近づくことができる場合があります。

http://sqlserverpedia.com/wiki/Index_Maintenance

これには時間がかかり、ディスクへの書き込みが多くなりますが、インデックスのデフラグと統計の更新という副作用があります。これはとにかく良いアイデアです。

15
Brent Ozar

わかりました-ブレントの回答についてコメントすることはできません(まだ、担当者が不足しているため)-デフラグルートに行く場合は、必ずしもインデックスを再構築しないでください-新しいインデックスが構築されるため、十分な空き領域がない場合はデータベースを拡張する可能性があり、次のログバックアップが少なくともインデックスのサイズであり、ログに大量のログレコードが含まれる可能性があることを保証します(復旧モデルによって異なります)。デフラグルートを実行する場合は、ALTER INDEX ... REORGANIZEを実行します。これは、空き領域(1つの8kページ)を必要としませんが、リーフレベルをメモリに読み取り、フラグメント化された部分でのみ動作しますページ。非リーフレベルは、いくつかのクエリの後にすぐに表示され、(ファンアウトに応じて)リーフレベルよりもはるかに少ないデータである必要があります。

9
Paul Randal

キーテーブルでFULLSCANを使用して統計を更新すると、データがキャッシュに強制され、それらのテーブルの周りの後続のDMLが大幅に速くなるシナリオがいくつかありました。また、実行計画に変更がなかったため、これは古い統計の結果ではありませんでした。

1
user172049

そもそもデータベースオブジェクトがキャッシュからフラッシュされるのはなぜですか? SQLサービスを再起動していますか、それともデータベースをオフラインまたはオンラインにしていますか?それとも、他のデータベースからのキャッシュによって押し出されているのでしょうか?

よろしく、

SCM。

1
SuperCoolMoss

データベースが小さい場合は、SSDに配置することを検討してください。

1
Roger Lipscombe

2番目のインスタンス のSQL Serverをそのデータベースのみでインストールし、そのインスタンスの 最小メモリ を6GBに設定してみませんか?

これにより、他のデータベースが「小さいながらも非常に重要な」データベースからメモリを奪い取らないことが保証されます。

また、他のインスタンスをオフラインにして、小さなDBをメモリに残すこともできます。

0
Portman

プロファイラを使用してSQLをチェックします。 「論理」読み取りと「物理」読み取りを比較します。 SQLサーバーは賢く、最も効率的な結果を得るために必要なRAMを使用します。

また、自動統計が最新であることを確認してください。

クエリの種類とdbテーブルのサイズについてこれ以上考えないと、少し奇妙に聞こえます。

0
Guy