質問

ご存知のように、CTEはSQL Server 2005で導入され、群衆は熱狂しました。

大量の静的データをテーブルに挿入する場合があります。私が知りたいのは、次のうちどれがより速いか、そして他に知っておくべき要素です。

INSERT INTO MyTable (MyField) VALUES ('Hello')
INSERT INTO MyTable (MyField) VALUES ('World')

または

WITH MyCTE(Field1) AS (SELECT 'Hello' UNION SELECT 'World')
INSERT INTO MyTable (MyField) SELECT Field1 FROM MyCTE

MyTable に存在するトリガーのようなものに答えが依存することに不快感を感じています...

(また、CSVやその他のメソッドの BULK INSERT が静的データを挿入する客観的に高速でより良い方法であることを知っていますが、気にしません。特に懸念を知りたいです。 CTEと複数の挿入について注意する必要があります。)

役に立ちましたか?

解決

使用しているSQL Serverのバージョン(2005年または2008年)はわかりませんが、使用しているバージョンに関係なく、この場合のCTEを複数の挿入に使用しても、正直に言って大きな利点はありません。実際、CTEは非常に多くの状況に適していますが、これはその1つではありません。

したがって、基本的に、いくつかの INSERT ステートメントを使用することをお勧めします。

SQL Server 2008では、複数の値のタプルを指定するだけでこれらを簡素化できます。

INSERT INTO MyTable (MyField) 
VALUES ('Hello'), ('World'), ('and outer space')

いつものように、テーブル構造、インデックスおよびトリガーの有無は、実際にINSERT速度に大きな影響を与えます。大量のデータをロードする必要がある場合、これらの制約を有効にして、INSERTの期間中にトリガーをオフにしてからオンに戻す方が簡単な場合がありますが、この場合もそうであるかどうかを明確に示す方法はありません特定の状況かどうか-それについて私たちが知らない変数が多すぎると、重要な役割を果たします。それを測定し、比較し、自分で決定してください!

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top