Производительность SQL Trigger - PullRequest
3 голосов
/ 14 декабря 2011

У меня есть триггер на столе, в основном это

ALTER TRIGGER xx
FOR UPDATE,DELETE,INSERT
AS
   DELETE FROM other WHERE id in (SELECT id from deleted)
   DELETE FROM other WHERE id in (SELECT id from inserted)
   INSERT INTO other() VALUES() WHERE id in (SELECT id from inserted)

GO

Он работает очень медленно, когда выполняет вставку (20 секунд).Удаляет быстро.Играя вокруг, я попытался сделать это вместо этого:

ALTER TRIGER xx
FOR UPDATE,DELETE,INSERT
AS
   DECLARE @tinserted TABLE ( id int) 
   INSERT INTO @tinserted select id from inserted;
   DELETE FROM other WHERE id in (SELECT id from deleted)
   DELETE FROM other WHERE id in (SELECT id from inserted)
   INSERT INTO other() VALUES() WHERE id in (SELECT id from @tinserted)

GO

Используя переменную таблицы, она теперь запускается мгновенно (менее 1 секунды).

Хотя я не уверен, почему.Есть ли какая-то причина, почему переход на табличную переменную будет иметь такое значение?

1 Ответ

4 голосов
/ 14 декабря 2011

Не знаю, зачем вам вообще понадобится предложение WHERE для операции INSERT.

INSERT INTO other(column1, column2, ...)
    SELECT column1, column2, ...
        FROM inserted;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...