2012-01-29 30 views
6

ストアドプロシージャの再コンパイルが過剰になる可能性があることに注意してください。SQL Serverでストアドプロシージャの再コンパイルが発生する要因は何ですか?

ストアドプロシージャを再コンパイルするコードの例は便利です。可能であれば再コンパイルを避け、パフォーマンスを向上させることが目的です。

異なる出力(データ型および/または列数による)をもたらす動的SQLおよび可変パスは、問題を引き起こす可能性があるようです。前提条件は正しいですか?他の例がありますか?

編集:別の例が見つかりました。フロー制御文で一時テーブルを作成すると、再コンパイルが発生します。

+0

はい。今質問は何ですか? –

+2

あなたは特定の質問をする必要があると思います。 –

答えて

17

ストアドプロシージャの再コンパイルを確保するために、いくつかの方法があります。

  • sp_recompileと再コンパイルのためのprocのマーキングストアドプロシージャのダイナミック(exec()を考える)
  • を作るWITH RECOMPILE
  • を使用しては。
  • 、キャッシュされたクエリプランは、procの内の個々の文がRECOMPILEクエリヒント(SQL 2008)で再コンパイルすることができ、クエリ・レベルで呼び出す
  • DBCC FREEPROCCACHE
  • に依存しているスキーマを変更します。再コンパイル

要因上記ハード要因以外に、何がストアドプロシージャの再コンパイルを引き起こしますか?まあ、たくさんのこと。これらのうちのいくつかは上記のリストに織り込まれていますが、私はそれらを再提示したいのですが、明らかではないかもしれません。

大量のデータを挿入または削除
  • (インデックス内のデータ密度&テーブルは、多くの場合、クエリ・プランを制御)
  • は、DML変更の基礎となる、再び(一時テーブルをドロップ/作成
  • (基礎となるオブジェクトへの変更を)インデックスの再構築します)。
  • クエリプランの期限切れ(メモリの使用をクリーンアップするために、最近、およびSQL希望者の使用していないと思います)

これは決して完全なリストです。クエリオプティマイザは、SQL Serverをどれぐらい使用していても進化し、驚かされます。

:しかし、ここで使用のものとすることができるいくつかのリソースがありますしかし、お待ちください!

これは、あなたの質問には、再コンパイルが常にパフォーマンスに悪いとの前提があります。実際には、しばしば報復は良いです。

いつ再コンパイルしますか?姓で検索するprocの例を見てみましょう。ストアドプロシージャは、祝福(あなたのために働く場合)と呪い(それがあなたに作用する場合)である 'parameter sniffing'を実行します。 zerbrowskiの場合は、最初にZebr%で検索します。姓の索引は、これが非常に具体的であり、100万行から3行を返すことを認識します。そのため、1つの実行計画が作成されます。低い行の結果のためにコンパイルされたprocで、次の検索はS%です。 Sはあなたの最も一般的な名前で、100万人のうち93,543人の行と一致します。

1

特定のSETオプションによって、ストアドプロシージャの再コンパイルや複数の再コンパイルが1回の実行で発生することがあります。

これらのオプションの一部がいなくてもSPの内側かもしれ

--this will cause recompilation 
SET concat_null_yields_null ON; 
EXEC spMyProc; 

SP内で再コンパイルの原因となるオプションの一部:

ARITHABORT

ANSI_NULLS

QUOTED_IDENTIFIER

幸運なことに、このo Neは再コンパイルを行わない:SET NOCOUNT ON;

関連する問題