Как эти альтернативы SQL-Server-2005 MERGE сравниваются - PullRequest
1 голос
/ 19 апреля 2011

В SQL-Server-2005 как можно сравнить следующие подходы с точки зрения производительности для массового обновления данных.

Массовое удаление, затем Массовая вставка

--Delete Existing Data
DELETE FROM Foo
WHERE Category = 1;

--Insert New Data
INSERT INTO Foo (Id, Category, ...)
SELECT Id, Category, ...
FROM @Temp;

(Стиль слияния) Массовая вставка / Обновление / Удаление

--Delete Existing Data Not In New Data
DELETE FROM Foo 
FROM Foo LEFT OUTER JOIN @Temp T ON Foo.Id = T.Id
WHERE Foo.Category = 1
AND T.Id IS NULL;

--Update Matching Data
UPDATE Foo
SET
    Foo.Category = T.Category,
...
FROM Foo INNER JOIN @Temp T ON Foo.Id = T.Id;

--Insert New Data
INSERT INTO Foo (Id, Category, ...)
SELECT Id, Category, ...
FROM @Temp T LEFT OUTER JOIN Foo F ON F.Id = T.Id
WHERE F.Id IS NULL;

Ответы [ 2 ]

2 голосов
/ 20 апреля 2011

Если вам не нужно время (ленивый) и вы точно знаете, что вторая форма не требуется, вторая форма всегда предпочтительнее в производственной, занятой системе.

Вам следует увеличить2-й, чтобы обновление личности (обновление не приводило к изменениям) не выполнялось.В настоящее время ваш код обновит запись для себя, даже если она точно такая же до и после - в этом случае она почти совпадает с первой формой.

Некоторые различия:

  • В правильной 2-й форме существующие записи с прикрепленными ссылками (хуки внешнего ключа) не нарушаются, тогда как первая может сломаться, поскольку она пытается на мгновение удалить все записи.
  • В правильной 2-й форме меньшеlog
  • Правильная вторая форма будет меньше делать в триггерах (если в таблице были триггеры)
1 голос
/ 19 апреля 2011

Это будет зависеть полностью от вашей текущей структуры данных. Какие поля? Как много? Каковы показатели? Насколько велики таблицы, в которые вы вставляете / обновляете / выбираете?

Ваша первая альтернатива содержит меньше логики и может быть быстрее, но это будет зависеть от того, какие поля вы обновляете, сколько их, какие значения и типы данных, какие индексы и т. д.

Краткий ответ - это зависит.

В SQL нет (обычно) «лучшего» ответа. Существует лучшее решение для данной ситуации, но если вы не поделитесь подробностями, вы не сможете получить хороший ответ.

Кроме того, BULK INSERT - это особый вид функции, обычно использующий BCP. Вы можете сделать вставку minimally logged, но то, что вы перечислили, не является BULK INSERT.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...