Что быстрее?Триггер после вставки или прямая хранимая процедура - PullRequest
1 голос
/ 01 марта 2012

Я загружаю большие объемы записей Excel во временную таблицу.Затем мне нужно сложить эти строки и поместить сумму в основную таблицу с помощью PK.

Я сделал триггер после вставки, который проверяет, существует ли уже вставленная в основную таблицу вставка (несуществующая вставит, существующая обновит все столбцы в этой строке).

, чтобы вызватьTRIGGER Мне нужно вставить INTO другую временную таблицу

INSERT INTO TEMPTBL (select SUM(...)...* from temptable)

, тогда триггер вставит / обновит основную таблицу.

Мне было интересно, если это правильноили просто используя одну таблицу TEMP, затем используйте SP, чтобы выполнить проверку с помощью 1 CURSOR FETCH (для обновления существующих строк), а затем вставкой для остальных.

Заранее спасибо за чтение.Просто нужно знать, что было бы идеально / быстрее, потому что они будут обрабатывать несколько пользователей (пожалуйста, пока не возражайте против блокировки: D)

1 Ответ

3 голосов
/ 01 марта 2012

Оба подхода, которые вы предлагаете, звучат процедурно (построчно), но я думаю, что для того, что вы делаете, должно быть решение на основе множеств (все записи одновременно).

Вместо триггера или курсора вставьте сразу все свои записи, а в оператор вставки включите проверку, чтобы исключить все записи, которые уже существуют в таблице. Что-то вроде:

INSERT INTO YourTable (Column1, Column2...)
SELECT Column1, Column2...
FROM TempTable tt
WHERE NOT EXISTS (
    SELECT 1
    FROM YourTable yt
    WHERE tt.ID = yt.ID
)

EDIT:

Для вашего обновления вы можете сделать что-то подобное. Перед вставкой присоедините временную таблицу к существующей таблице и обновите соответствующие записи:

UPDATE yt
SET Column1 = tt.Column1, Column2 = tt.Column2
FROM
    YourTable yt JOIN
    TempTable tt ON tt.ID = yt.ID
...