Обслуживание хранимой процедуры - как удалить без блокировки репликации - PullRequest
4 голосов
/ 13 ноября 2010

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

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

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

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

Ответы [ 3 ]

8 голосов
/ 13 ноября 2010

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

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

    if @@rowcount < 1000 break
end /* while */
3 голосов
/ 13 ноября 2010
  • Нет DELETE with (NOLOCK). Подсказка nolock в операторах записи относится исключительно к возможным подзапросам в DML, которые должны искать данные. Пишет (INSERT, DELETE, UPDATE) всегда исключительно для блокировки измененных данных.
  • Уровни изоляции не влияют на запись. Justa с подсказками блокировки, уровни изоляции относятся исключительно к читает . Записывает всегда блокировку измененных данных, под все уровни изоляции.
  • Блокировки не влияют на репликацию транзакций. Агент чтения lgo читает log , а не таблицы. Только репликация слиянием может * зависеть от блокировок , но публикация на сервере отчетов не может быть сценарием репликации слиянием, поскольку сервер отчетов не обновляет данные.
2 голосов
/ 13 ноября 2010

В документации, на которую вы указываете, указано SET TRANSACTION ISOLATION LEVEL SNAPSHOT или SET TRANSACTION ISOLATION LEVEL READ COMMITTED

...