Temp Tables
ストアド プロシージャの定義で作成された場合dropping them when I am done
、それらを使用すると実行計画が再コンパイルされますか?
呼び出されるたびにストアドプロシージャの場合は?個人的な経験はありますか?説明をお願いします。
すべての呼び出しの最後に一時テーブルが削除されると、実行計画が無効になります。SQL Serverは引き続き実行計画を保持し、次の呼び出しで再利用しますか、それとも呼び出されるたびに再コンパイルしますか?
Temp Tables
ストアド プロシージャの定義で作成された場合dropping them when I am done
、それらを使用すると実行計画が再コンパイルされますか?
呼び出されるたびにストアドプロシージャの場合は?個人的な経験はありますか?説明をお願いします。
すべての呼び出しの最後に一時テーブルが削除されると、実行計画が無効になります。SQL Serverは引き続き実行計画を保持し、次の呼び出しで再利用しますか、それとも呼び出されるたびに再コンパイルしますか?
一時テーブルの削除は問題ではありません。テーブルが (永続的または一時的に) 作成されると、そのステートメントの後のすべてのステートメントが再コンパイルされます (それらがテーブルを参照していない場合でも)。EXEC を使用した実行可能オブジェクトへの呼び出しは再コンパイルされません。これは、SQL Server がオブジェクトの作成後にプランを作成できるためです。(この場合、一時テーブル。)
拡張イベントとその sql_statement_recompile または SQL トレース/SQL Server Profiler SQL:StmtRecompile を使用して、再コンパイルを監視できます。
プロシージャ全体が再コンパイルされるのではなく、個々のステートメントのみが再コンパイルされます。
一般的に言えば、ストア プロシージャ内の DDL は再コンパイルを引き起こします。テーブルの作成と削除の命令を使用すると、再コンパイルが発生します。ストア プロシージャの最初のステートメントとして DDL を含めることで軽減できますが、事前にテストして、サーバーで自分の目で確認する必要があります。
テンポラル テーブルに配置する必要があるデータセットが小さく、一意でないインデックスが必要ない場合は、代わりにテーブル変数を使用してみてください。テーブル変数にあまりにも多くの行を入れることはお勧めできません。なぜなら、それらには統計がないためです.Sql Serverは常にレコードが1つしかないと「考え」、クエリプランは最適なものから少し離れている可能性があります(しかし、それはテンポラル テーブルの作成による再コンパイルは避けてください)。
一時テーブルは再コンパイルを引き起こす可能性があります。これは、SQL Server エンジンによって通常のテーブルのように扱われるために発生します。テーブル (基になるクエリが依存する) が大幅に変更されると、SQL Server はこの変更を (自動更新統計を使用して) 検出し、依存クエリを再コンパイルするようにマークして、次の実行で最適な実行プランを作成できるようにします。
一時テーブルまたは一時テーブルに依存するクエリが変更されると、クエリ エンジンはクエリに対応できないため、キャッシュされた同じプランを実行できなくなります。
テーブル変数は本質的に再コンパイルを引き起こさないことに注意してください。状況によっては、これらの方が適切な選択になる場合があります。
http://sqlserverplanet.com/optimization/temp-table-recompiles
一時テーブルの再コンパイルの詳細については、を参照してください。