7

Temp Tablesストアド プロシージャの定義で作成された場合dropping them when I am done、それらを使用すると実行計画が再コンパイルされますか?

呼び出されるたびにストアドプロシージャの場合は?個人的な経験はありますか?説明をお願いします。

すべての呼び出しの最後に一時テーブルが削除されると、実行計画が無効になります。SQL Serverは引き続き実行計画を保持し、次の呼び出しで再利用しますか、それとも呼び出されるたびに再コンパイルしますか?

4

3 に答える 3

6

一時テーブルの削除は問題ではありません。テーブルが (永続的または一時的に) 作成されると、そのステートメントの後のすべてのステートメントが再コンパイルされます (それらがテーブルを参照していない場合でも)。EXEC を使用した実行可能オブジェクトへの呼び出しは再コンパイルされません。これは、SQL Server がオブジェクトの作成後にプランを作成できるためです。(この場合、一時テーブル。)

拡張イベントとその sql_statement_recompile または SQL トレース/SQL Server Profiler SQL:StmtRecompile を使用して、再コンパイルを監視できます。

  1. ステートメントの実行が開始されます。SP:StmtStarting または SQL:StmtStarting が発生する
  2. ステートメントが再コンパイルされます。SQL:StmtRecompile が発生します。SP:StmtStarting または SQL:StmtStarting が再度発生する
  3. 発表は終了。SP:StmtCompleted または SQL:StmtCompleted が発生する

プロシージャ全体が再コンパイルされるのではなく、個々のステートメントのみが再コンパイルされます。

于 2013-10-27T20:49:37.557 に答える
-2

一般的に言えば、ストア プロシージャ内の DDL は再コンパイルを引き起こします。テーブルの作成と削除の命令を使用すると、再コンパイルが発生します。ストア プロシージャの最初のステートメントとして DDL を含めることで軽減できますが、事前にテストして、サーバーで自分の目で確認する必要があります。

テンポラル テーブルに配置する必要があるデータセットが小さく、一意でないインデックスが必要ない場合は、代わりにテーブル変数を使用してみてください。テーブル変数にあまりにも多くの行を入れることはお勧めできません。なぜなら、それらには統計がないためです.Sql Serverは常にレコードが1つしかないと「考え」、クエリプランは最適なものから少し離れている可能性があります(しかし、それはテンポラル テーブルの作成による再コンパイルは避けてください)。

于 2013-10-27T20:52:54.327 に答える
-3

一時テーブルは再コンパイルを引き起こす可能性があります。これは、SQL Server エンジンによって通常のテーブルのように扱われるために発生します。テーブル (基になるクエリが依存する) が大幅に変更されると、SQL Server はこの変更を (自動更新統計を使用して) 検出し、依存クエリを再コンパイルするようにマークして、次の実行で最適な実行プランを作成できるようにします。

一時テーブルまたは一時テーブルに依存するクエリが変更されると、クエリ エンジンはクエリに対応できないため、キャッシュされた同じプランを実行できなくなります。

テーブル変数は本質的に再コンパイルを引き起こさないことに注意してください。状況によっては、これらの方が適切な選択になる場合があります。

http://sqlserverplanet.com/optimization/temp-table-recompiles一時テーブルの再コンパイルの詳細については、を参照してください。

于 2013-10-28T06:59:49.937 に答える