2010-11-12 2 views
4

У нас есть хранимая процедура обслуживания (SQL Server 2005), которая удаляет данные из нашей таблицы журналов.Сохранение хранимой процедуры - как удалить без блокировки репликации

Мы хотим избежать блокировки, так как наша таблица журналов реплицируется на сервер отчетов.

Есть ли что-нибудь, что я могу сделать, чтобы настроить запрос, чтобы предотвратить блокировку? Выполнение DELETE с NOLOCK не будет доступна в будущих версиях SQL Server: http://msdn.microsoft.com/en-us/library/ms187373.aspx

Обратите внимание, что процедура технического обслуживания выполняется еженедельно и потенциально может удалить тысячи строк (или миллионы, если включить ведение подробного журнала).

ответ

8

Я нашел, что лучший способ сделать это - использовать цикл для удаления небольшими партиями. Я делал от 100 до 10000 строк за раз в зависимости от БД и его загрузки.

while (1=1) begin 
    delete top(1000) 
     from YourTable 
     where ... 

    if @@rowcount < 1000 break 
end /* while */ 
+2

вы также можете добавить небольшую задержку после удаления каждой партии .. что-то вроде «WAITFOR DELAY» 00: 00: 02 '; »(задержка в 2 секунды) – Sadhir

+0

+1 и, конечно же, само собой разумеется что удаленные файлы должны быть упакованы, или ваш журнал транзакций просто погибнет в одной транзакции, удалив десятки миллионов строк. –

+0

Я пытаюсь что-то подобное, чтобы избежать блокировки вставок ... если я открою две вкладки в SSMS и запустим выше в одна вкладка и вставка в другую, тогда вставка остается заблокированной до тех пор, пока цикл удаления не завершится, даже если я ввешу 10-секундное ожидание между удалениями. Есть что-то, что мне не хватает? (Запуск в базе данных Azure SQL. У меня также есть BEGIN TRANSACTION/ROLLBACK вокруг моего цикла delete, чтобы я мог протестировать, не сдувая все мои тестовые данные). – user1454265

2

Отдается в документации вы указать на это SET TRANSACTION ISOLATION LEVEL SNAPSHOT или SET TRANSACTION ISOLATION LEVEL READ COMMITTED

+0

Вы имеете в виду УРОВЕНЬ ИЗОБРАЖЕНИЯ УСТРОЙСТВА СТАВКИ ** UN ** COMMITTED, правильно? Это будет то же самое, что и использование команды NO LOCK в команде DELETE. – Cahit

3
  • Там нет DELETE with (NOLOCK). Указание nolock в операторах записи ссылается на исключительно на возможные подзапросы в DML, которые нуждаются в данных поиска. Записывает (INSERT, DELETE, UPDATE) всегда блокирует только измененные данные.
  • Уровни изоляции не влияют на записи. Justa s с подсказками замка, уровни изоляции относятся исключительно к читает. Записывает всегда блокировка модифицированных данных, под все уровни изоляции.
  • Замки не влияют на репликацию транзакций. Агент чтения lgo считывает журнал , а не таблицы. Только репликация слиянием может содержать, но публикация на сервере отчетов не может быть сценарием слияния репликации, поскольку сервер отчетов не занимается коммерческим обновлением данных.
Смежные вопросы