MS-SQL 2000: отключить ведение журнала во время хранимой процедуры - PullRequest
2 голосов
/ 14 января 2009

Вот мой сценарий:

У меня есть простая хранимая процедура, которая удаляет определенный набор строк из таблицы (скажем, около 30 000 строк), а затем вставляет примерно такое же количество строк. Обычно это занимает всего несколько секунд; однако в таблице есть триггер, который отслеживает вставки / удаления и пытается имитировать то, что произошло со связанной таблицей на другом сервере.

Этот процесс, в свою очередь, является невероятно медленным из-за триггера, и таблица также блокируется во время этого процесса. Итак, вот мои два вопроса:

  1. Полагаю, что приличная часть замедления связана с журналом транзакций. Есть ли способ указать мне в моей хранимой процедуре, что я не хочу, чтобы то, что в процедуре, было зарегистрировано?
  2. Есть ли способ для меня выполнять команды «УДАЛИТЬ ИЗ» и «ВСТАВИТЬ В» без блокировки таблицы в течение всего процесса?

Спасибо!

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

Ответы [ 5 ]

2 голосов
/ 14 января 2009

1) нет, также вы не выполняете минимально зарегистрированную операцию, такую ​​как TRUNCATE или BULK INSERT

2) Нет, как иначе вы бы предотвратили коррупцию?

1 голос
/ 14 января 2009

Вы можете временно отключить триггер, запустить свой процесс, а затем сделать то, что триггер делал более эффективным образом.

-- 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
1 голос
/ 14 января 2009

Это не поможет с вашим триггером, но решение проблемы блокировки заключается в выполнении транзакций меньшими партиями.

Вместо

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
1 голос
/ 14 января 2009

Вы не можете отключить транзакционную целостность при изменении данных. Вы можете игнорировать блокировки, когда выбираете данные, используя select * from table (nolock) ; тем не менее, вы должны быть очень осторожны и убедиться, что ваше приложение может обрабатывать грязные чтения.

1 голос
/ 14 января 2009

Я бы не стал автоматически предполагать, что проблема с производительностью связана с ведением журнала. Фактически, вполне вероятно, что триггер написан таким образом, что вызывает проблемы с производительностью. Я рекомендую вам изменить исходный вопрос и показать код для триггера.

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