Вот мой сценарий:
У меня есть простая хранимая процедура, которая удаляет определенный набор строк из таблицы (мы скажем около 30 тыс. Строк), а затем вставляет примерно такое же количество строк. Обычно это занимает всего несколько секунд; однако в таблице есть триггер, который отслеживает вставки / удаления и пытается имитировать то, что произошло со связанной таблицей на другом сервере.
Этот процесс, в свою очередь, из-за триггера происходит невероятно медленно, и таблица также заблокирована во время этого процесса. Итак, вот два моих вопроса:
Спасибо!
редактировать - Спасибо за ответы; Я подумал, что это так (я не мог сделать ни одно из вышеперечисленных), но хотел убедиться. Триггер был создан давно и выглядит не очень эффективным, поэтому похоже, что следующим шагом я займусь этим и выясню, что необходимо и как это можно улучшить. Спасибо!





1) нет, также вы не выполняете минимально регистрируемую операцию, такую как TRUNCATE или BULK INSERT
2) Нет, иначе как бы вы предотвратили коррупцию?
Я бы не стал автоматически предполагать, что проблема с производительностью связана с ведением журнала. Фактически, вполне вероятно, что триггер написан таким образом, что вызывает проблемы с производительностью. Я рекомендую вам изменить исходный вопрос и показать код триггера.
Вы не можете отключить целостность транзакций при изменении данных. Вы можете игнорировать блокировки при выборе данных с помощью select * from table (нолок); однако вам нужно быть очень осторожным и убедиться, что ваше приложение может справиться с грязным чтением.
Это не помогает с вашим триггером, но решение проблемы блокировки заключается в выполнении транзакций меньшими партиями.
Вместо
DELETE FROM Table WHERE <Condition>
Сделай что-нибудь вроде
WHILE EXISTS ( SELECT * FROM table WHERE <condition to delete>)
BEGIN
SET ROWCOUNT 1000
DELETE FROM Table WHERE <Condition>
SET ROWCOUNT 0
END
Вы можете временно отключить триггер, запустить процедуру, а затем сделать то, что триггер делал, более эффективным образом.
-- disable trigger
ALTER TABLE [Table] DISABLE TRIGGER [Trigger]
GO
-- execute your proc
EXEC spProc
GO
-- do more stuff to clean up / sync with other server
GO
-- enable trigger
ALTER TABLE [Table] ENABLE TRIGGER [Trigger]
GO