CTE против нескольких вставок - PullRequest
2 голосов
/ 30 ноября 2009

Как все мы знаем, 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 ...

(Кроме того, я знаю, и мне все равно, что BULK INSERT использование CSV и любых других методов объективно ускоряет и улучшает способы ввода статических данных. Я специально хочу знать о проблемах, с которыми мне следует знать CTE против нескольких вставок.)

1 Ответ

2 голосов
/ 30 ноября 2009

Не уверен, какую версию SQL Server вы используете (2005 или 2008) - но независимо от того, какую версию вы используете, я не вижу большого преимущества в использовании CTE в этом случае для нескольких вставок, честно говоря. CTE действительно хороши для очень многих ситуаций, но это не одна из них.

Итак, я бы предложил вам использовать несколько INSERT утверждений.

В SQL Server 2008 вы могли бы упростить их, просто указав несколько значений:

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

Как всегда, структура вашей таблицы, наличие (или отсутствие) индексов и триггеров действительно оказывает существенное влияние на вашу скорость INSERT. Если вам нужно загрузить много данных, иногда проще отключить эти ограничения и отключить их на время INSERT, а затем снова включить, - но опять-таки: на самом деле нет никакого способа дать вам четкое указание, так ли это в вашей ситуации. конкретная ситуация или нет - просто слишком много переменных, о которых мы не знаем, играют значительную роль. Измерьте это, сравните это, примите решение для себя!

...