web-dev-qa-db-ja.com

プロシージャキャッシュヒット率を向上させる方法は?

手順キャッシュヒット率が95%未満であると私が知ることができることは問題です。私のボックスでは、値は85から95%に移動します。

この問題を解決するにはどうすればよいですか?サーバーにはRAMがたくさんあるので、問題にはなりません。他に何ができるのでしょうか?

11
AngryHacker

スプレッドシートの重要なデータポイントをまとめます(丸めます)。

_      Total                                     Use Count 1
      ---------------------------------------   -----------------------
      Total Plans   Total MBs   Avg Use Count   Total Plans   Total MBs   
      -----------   ---------   -------------   -----------   ---------
Adhoc      55,987       3,054               3        38,314       2,036
Proc          709       1,502           1,549           135         527
_

したがって、最初の行は、計画キャッシュの約2/3を占める、悪いものを示しています(ほとんどが一度だけ使用されるもので、いくつかの非常に小さな例外があります)。あなたはできる限りこれらの多くを取り除くようにする必要があります。 2行目は良いものを示しています。これらは、プランキャッシュ(大量の再利用を伴うプラン)に必要なものです。残りのデータは、主にIMHOとは無関係です。ただし、もう1つのポイント:アクセスはストアドプロシージャを介してのみ行われるが、それらのプロシージャが動的SQLを使用する場合、それらのステートメントはAdHocプランではなくProcプランとしてキャッシュされます。

2008年以降は、_optimize for ad hoc workloads_をオンにして次の問題に進みます。これは、使い捨てプランが現在使用しているMBの量をゼロに近づけます。残念ながら、2005年には、ステートメントレベルのOPTION (RECOMPILE)を使用するようにこれらのストアドプロシージャをリファクタリングするか、動的SQLを使用しないか、動的SQLを使用しないか、データベースで 強制パラメータ化level -リテラルをプランマッチングの目的のパラメーターとして扱うことにより、同様のクエリからより良いプランの再利用を試みます。計画ガイドは臆病者向けではないので、言及することもためらいます。この回答の後半で説明するように、計画キャッシュが確実にパフォーマンスのソースであることがわかっている場合を除いて、その道を進む価値はありません。問題。

SP2以前は、プランキャッシュに割り当てることができるメモリ量のアルゴリズムが比較的緩やかだったため、_@@VERSION_について質問しました。 SP2以降、彼らはそれをかなり厳しくしました(変更は this post および this post に文書化され、説明されています)。あなたの場合、プランのキャッシュは比較的いっぱいなので、キャッシュミスが発生するのは当然のことです。 26 GB = 5.8 GBの上限。スプレッドシートに〜4.5 GBが表示されますが、ここでは、知らない計算または構成の違いがある可能性があります。

このMSDN記事 2008で追加された_optimize for ad hoc workloads_サーバー設定について説明し、トレースフラグ8032について言及します。これにより、より多くのメモリをキャッシュに割り当てることができます(おそらくこの設定を設定していない場合)サーバーレベルで、これをすべてのお客様に推奨するか、少なくとも99%が2005年には廃止されました)。私はこのトレースフラグを2005 SP3またはSP4でテストしたことはありません。正直なところ、いつ導入されたのかさえわかりません。それがあなたの問題を解決するのか、それをシフトするだけなのかもわかりません。キャッシュに%割り当てられていたとしても、RAMキャッシュに割り当てられていても、ストアドプロシージャの性質上、キャッシュミスが多数発生します。

または、もちろん、解決すべき問題さえあれば、それはプランキャッシュに直接関係します。キャッシュヒット率が予想よりも高くないからといって、それが問題の原因であるとは限りません。もちろん、キャッシュヒット率が100%であっても、キャッシュヒット率は現実的ではないようです。あなたの計画の1つは使い捨てでアドホックです-ユーザーはまだ完全に別のものによって引き起こされるパフォーマンスの問題に苦しんでいる可能性があります。

私の提案は、計画のキャッシュヒット率よりも優れた喫煙銃を探すことです。ユーザーのパフォーマンスに関する苦情の詳細を確認します。すべてのクエリは常に遅いですか?特定のクエリ? 1日の特定の時間/週/ビジネスサイクル?レポートのクエリだけが遅いですか?真剣に読んでください SQL Serverのベストプラクティスについてのこの乾燥した長いドキュメント -特に、待機とキューに関するセクション。これは、パフォーマンスの問題を特定、診断、解決するための論理的なアプローチを策定するのに役立ちます。ダッシュボードのいくつかの数字をより見栄えよくする-あなたが直接知らない数字が問題に寄与している-非常に満足できるかもしれませんが、それがユーザーのパフォーマンスの問題を解決しない場合、それは本当にあなたを獲得していませんどこでも。

これらは、コンパイル/再コンパイルおよびプランキャッシュの再利用に関する情報を読み取る際にも役立ちます。これらのいくつかは2008(特にアドホックワークロード設定に関するもの)に焦点を当てていますが、情報の多くは2005年にも、アップグレードの利点(ヒント、ヒント)をよりよく理解するためにも役立ちます。

19
Aaron Bertrand