Проблема оптимизации: копирование строк триггера INSERTED или DELETED в табличную переменную - PullRequest
0 голосов
/ 12 ноября 2010

У меня проблемы с производительностью при использовании триггера SQL. Проблема связана с выполнением SQL-запроса при использовании оператора select с таблицей триггеров INSERTED.

SELECT x FROM y WHERE x IN ( SELECT x FROM INSERTED )

План выполнения запроса указывает на ( SELECT x FROM INSERTED ), что занимает намного больше времени, чем ожидалось. Здесь мы говорим о 1000 строк.

Если я создаю табличную переменную и выбираю строки из INSERTED в табличную переменную, то использую табличную переменную в предложении IN, это НАМНОГО быстрее.

Мой вопрос: почему это быстрее? Я уже понял, что это может быть. Я читал, что таблица INSERTED - это виртуальная таблица, которая поступает из журналов транзакций и поэтому для ее чтения требуется гораздо больше времени, чем для использования переменной таблицы. Однако я бы подумал, что выбор строк из таблицы INSERTED в табличной переменной сведет на нет положительный эффект от использования табличной переменной в предложении IN.

Есть идеи, почему это намного быстрее?

1 Ответ

0 голосов
/ 12 ноября 2010

Не могли бы вы просто попробовать обычный JOIN с таблицей INSERTED?Они часто работают значительно лучше, чем эти подзапросы:

SELECT x 
FROM y 
INNER JOIN INSERTED i ON y.x = i.x

Не зная всех ваших данных, невозможно точно знать, поможет ли это вообще - но это определенно стоит попробовать!

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