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

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

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

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

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

Спасибо!

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
2 926
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Ответ принят как подходящий

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

Другие вопросы по теме