SQL Server 2008でインデックスを強制的にメモリに保持する方法はありますか?


10

数百万行のテーブルがあり、そこからクエリを時々実行する必要があります。通常、最初のクエリは非常に遅くなり(約10秒)、その後のクエリは通常、かなり高速になります(約1秒)。数時間後、遅い/その後速いサイクルが再び始まります。

必要なすべてのインデックスが存在し、適切に使用されていることを実行プランで確認しました。パフォーマンスの違いは、インデックスが後続のクエリのために実際にメモリ内にあるためであると思います(私は正しいですか、それとも他にもあります)考えられる原因?)

また、インデックスを使用して他の多くのクエリも実行していますが、これらのクエリは時間がかかりませんし、そのパフォーマンスはそれほど重要ではないため、これらのインデックスが実際に重要なインデックスをメモリキャッシュから押し出しているのではないかと心配しています。

「RAMを追加する」という明らかな修正とは別に、インデックスをメモリに強制的に戻すためにダミークエリを1時間ごとに実行するスクリプトを作成することを考えていました。

これを行うよりエレガントな方法はありますか?SQLServerに、1つの単一のインデックスをキャッシュするだけの十分なメモリがある場合、それをキャッシュする必要があることを示唆する方法と同様に、

私は通常、そのようなことに関してSQLServerを台無しにするのが最善ではないことを知っていますが、私のクエリの異常な性質(非常にまれに実行されますが、タイムクリティカル)は、それが理にかなっていると信じています(可能な場合) 。

また、特定の時点でどのインデックスがメモリにキャッシュされているかを知る方法があるかどうか知りたいです。

回答:


13

以前はDBCC PINTABLEコマンドがありましたが、6.5または7.0で動作しなくなったと思います。このステートメントは、試してもうまくいくこと示唆しているかもしれませんが、ただ戻るだけで、実際には何も起こりません。

残念ながら、どのインデックスをキャッシュに保持するかを制御する方法は実際にはありません-定期的にホットなテーブルについて私が知っている最善の回避策は、手動でホットに保つことです(これについてはすでに質問で説明しています)。

どのインデックスがメモリ内にあるかについては、から大まかなアイデアを得ることができますsys.sm_os_buffer_descriptors。これに関するヒントを公開しました:

http://www.mssqltips.com/sqlservertip/2393/determine-sql-server-memory-use-by-database-and-object/


そのスクリプトによると、75 MBのテーブルが900 MBのバッファプールを占有しています。それは正常/可能ですか?
db2

1
@ db2インデックスはいくつありますか?
JNK

2
また、断片化の程度は...データではなく、ページの測定です。あなたのページは比較的空であるかもしれません、そしてそれは膨らんだ測定に貢献することができます。
アーロンバートランド

0

使用してみてくださいKEEPPLANKEEPPLAN FIXED クエリヒント

KEEPPLANは、クエリオプティマイザにクエリの推定再コンパイルしきい値を緩和させる。

KEEPFIXED PLANは、統計の変更が原因でクエリオプティマイザーがクエリを再コンパイルしないように強制します。KEEPFIXED PLANを指定すると、基になるテーブルのスキーマが変更された場合、またはこれらのテーブルに対してsp_recompileが実行された場合にのみ、クエリが確実に再コンパイルされます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.