web-dev-qa-db-ja.com

一時テーブルとテーブル変数のINSERTパフォーマンスの違い

SQL Server 2005で次の問題が発生しています。テーブル変数にいくつかの行を挿入しようとすると、一時テーブルを使用した同じ挿入に比べて時間がかかります。

これはテーブル変数に挿入するコードです

DECLARE @Data TABLE(...)
INSERT INTO @DATA( ... )
SELECT ..
FROM ...

これは一時テーブルに挿入するコードです

CREATE #Data TABLE(...)
INSERT INTO #DATA( ... )
SELECT ..
FROM ...
DROP TABLE #Data

一時テーブルにはキーまたはインデックスがなく、選択部分は2つのクエリで同じであり、選択によって返される結果の数は最大10000行です。選択のみを実行するのに必要な時間は、約10秒です。

一時テーブルバージョンの実行には最大10秒かかります。5分後にテーブル変数バージョンを停止する必要がありました。

クエリはテーブル値関数の一部であり、一時テーブルへのアクセスを許可しないため、テーブル変数を使用する必要があります。

テーブル変数バージョンの実行計画 Execution plan

一時テーブルバージョンの実行計画 Execution plan

12
munissor

2つのプランの明らかな違いは、高速の方が並列で、低速の方が直列であることです。

これは、テーブル変数に挿入するプランの制限の1つです。コメントで述べたように(そしてそれが望ましい効果を持っているように見えます)あなたはやってみることができます

INSERT INTO @DATA ( ... ) 
EXEC('SELECT .. FROM ...')

それが制限を回避するかどうかを確認します。

8
Martin Smith