web-dev-qa-db-ja.com

プロシージャキャッシュ(計画キャッシュ)サイズ

私は、多義的に組み立てられた、複雑なSQLクエリを多く含むアプリケーションを開発しています。可能な限り、クエリプランをプロシージャキャッシュに保持します。 (メモリプレッシャーのため)クエリプランがプロシージャキャッシュから破棄されないようにするために、プロシージャキャッシュに十分なメモリを割り当てたいと思います。 this によると、4Gb-64GB範囲の「可視ターゲット」メモリの10%のみがプロシージャキャッシュに使用されます。このレートを高くしてください。

プロシージャキャッシュのサイズを制御する方法はありますか? SQL Server 2008または2012;たぶんいくつかのエンタープライズ版の機能?

また、明示的に最小値を設定した場合、この「可視ターゲットメモリの10%」ルールも適用されますか? SQL Serverのメモリ?

(私はKEEP PLAN/KEEPFIXED PLANヒントを知っています; Iまた、アドホッククエリでステートメントを準備することの利点も認識しているため、これらの可能性はお勧めしません。特に、プロシージャキャッシュサイズの制御に興味があります。)

7
slobo

プランのキャッシュサイズを手動で制御することはできません。次のConnectアイテムは、すぐにはノブが追加されないという事実と、リソースガバナーがいくつかの狭い使用例でわずかに役立つかもしれないという事実の両方を説明しています。

http://connect.Microsoft.com/SQLServer/feedback/details/293188/amount-of-ram-for-procedure-cache-should-be-configurable

ただし、コメントで触れたように、プランキャッシュをより効果的にする方法は他にもあります(例: 「アドホックワークロード用に最適化」設定 を使用)。 Kimberlyはこれについてより詳細に説明していますが、基本的に、この設定では、同じプランが複数回使用されるまでずっと小さなスタブがキャッシュに配置され、その後、すべてがキャッシュされます。デフォルトの構成では、特に動的にアセンブルされたSQLが多数配置されている場合、使い捨てプランではキャッシュ内の多くのスペースが無駄になることがよくあります。これらが占有する無駄なスペースの量を減らすと、2回以上使用される計画のためにより多くの余地が残され、それらはとにかく保持したいものです。

8
Aaron Bertrand

参考までに、プロシージャキャッシュのサイズを調べる必要がある場合は、次のコマンドを実行します。

dbcc memorystatus

ページで測定されたプロシージャキャッシュのサイズがわかります。KBに変換するには、この数値に8を掛けます。

また、キャッシュされているプロシージャの数もわかります。これは、データベースに対して実行されているアドホッククエリが多すぎるかどうかを調べようとしている場合など、さまざまな理由で役立ちます。

プロシージャキャッシュによって消費されるメモリの割合を調整する場合は、サーバーで使用可能な最大メモリ(最小メモリではなく)を調整します。最初の4 GBの75%はプロシージャキャッシュに、残りの10%は使用できます。しかし、これを行う利点はないようです。理論的には、最大メモリが4 GBのSQL Serverの複数のインスタンスをインストールして、メモリの75%をプロシージャキャッシュで使用できるようにすることができます。あなたのシステムを知っています。データベースレイヤーに多くのビジネスロジックがあるようです。

3
Dave Hilditch