1

次のような構造のクエリがあります。

CREATE TempTable
...
INSERT INTO TempTable
...
INSERT INTO TempTable
...
INSERT INTO TempTable
...
INSERT INTO MaterialTable
SELECT *
FROM TempTable

一時テーブルの使用を避けて、マテリアル テーブルに直接いくつかの挿入を行う方が効率的でしょうか? すなわち

INSERT INTO MaterialTable
...
INSERT INTO MaterialTable
...
INSERT INTO MaterialTable
4

2 に答える 2

1

実行計画を分析してテストを実行することは、常に最善の策です。一時テーブルには独自のオーバーヘッドがあるため、実際には多くの要因に依存します。背景情報については、一時テーブルとテーブル変数間の実行計画とINSERT パフォーマンスを理解する方法をご覧ください。

于 2013-08-08T09:25:02.380 に答える
1

答えは、宛先テーブルとそのインデックスの正確な構造、およびMaterialTable挿入と同時に にアクセスするプロセスの性質によって異なります。

  • TempTableインデックスがありません。MaterialTable複数のインデックスを持つ可能性があります。挿入されるデータの量と個々の挿入の数によっては、各インデックスの単一の複数行チェックを実行する必要があるため、temp からのコピーの方が高速になる可能性があります。
  • TempTable部外者には見えません。MaterialTableプログラムと同時にアクセスされる可能性があります。そのような場合、ロックとロック解除の量は少なくなります。
  • すべての行を一度に挿入すると、挿入を並列化する可能性が高くなり、挿入がさらに高速になる可能性があります。

MaterialTable小さい場合 (数千行) は、それほど重要ではありません。テーブルが大きいほど影響が大きくなるため、 が大きくなることMaterialTableが予想される場合は、一時テーブル アプローチを維持することをお勧めします。

于 2013-08-08T09:35:04.677 に答える