Вот мой сценарий: у нас есть база данных, назовем ее Logging, с таблицей, содержащей записи из Log4Net (через MSMQ). Режим восстановления базы данных установлен на Simple: нам не нужны журналы транзакций - они могут пролонгироваться.
У нас есть работа, которая использует данные из sp_spaceused, чтобы определить, достигли ли мы определенного порога размера. Если порог превышен, мы определяем, сколько строк необходимо удалить, чтобы уменьшить размер до x процентов от этого порога. (Кроме того, я использую exec sp_spaceused MyLogTable
, TRUE
, чтобы получить количество строк и приблизительную аппроксимацию их среднего размера, хотя я не уверен, что это лучший способ сделать это. Но это другая проблема.)
Затем я пытаюсь выполнить частичное удаление (скажем, 5000 за раз), зацикливая вызов sproc, который в основном делает это:
DELETE TOP (@RowsToDelete) FROM [dbo].[MyLogTable]
пока я не удалил то, что нужно удалить.
Вот проблема: если мне нужно удалить много строк, заполняется файл журнала транзакций. Я могу наблюдать за его ростом, запустив
dbcc sqlperf (logspace)
Что меня озадачивает, так это то, что при сбое задания ВСЕ удаленные строки откатываются. Другими словами, кажется, что все фрагменты (каким-то образом) обертываются в неявную транзакцию.
Я пытался явно отключить неявные транзакции, оборачивая каждый оператор DELETE в BEGIN и COMMIT TRAN, но безрезультатно: либо все удаленные чанки успешно выполняются, либо ни одного вообще.
Я знаю простой ответ: сделайте ваш файл журнала достаточно большим, чтобы обрабатывать максимально возможное количество записей, которое вы когда-либо удаляли, но тем не менее, почему это рассматривается как одна транзакция?
Извините, если что-то упустил, но я просмотрел множество постов, касающихся увеличения размера файла журнала, режимов восстановления и т. Д., И не могу понять это.
Еще одна вещь: после сбоя задания файл журнала некоторое время остается заполненным примерно на 95–100%, а затем возвращается обратно. Тем не менее, если я бегу
checkpoint
dbcc dropcleanbuffers
снижается до 5%.
ТИА.