В SQL Server 2008 R2 чем отличаются эти два отката:
Выполните
ALTER
оператор в течение нескольких минут, а затем нажмите «Отменить выполнение». Для полного отката требуется несколько минут.Выполните ту же
ALTER
инструкцию, но убедитесь, чтоLDF
файл недостаточно велик для успешного завершения. Как толькоLDF
предел достигнут, и «автоматический рост» не разрешен, выполнение запроса немедленно останавливается (или происходит откат) с этим сообщением об ошибке:
The statement has been terminated.
Msg 9002, Level 17, State 4, Line 1
The transaction log for database 'SampleDB' is full.
To find out why space in the log cannot be reused, see the
log_reuse_wait_desc column in sys.databases
Как эти два отличаются по следующим пунктам?
Почему второй «откат» происходит мгновенно? Я не совсем уверен, можно ли это назвать откатом. Я предполагаю, что журнал транзакций записывается по мере выполнения и, как только он осознает, что не хватает места для полного завершения задачи, он просто останавливается с каким-то сообщением «конец», без фиксации.
Что происходит, когда первый откат занимает столько времени (откат однопоточный)?
2.1. SQL Server возвращается и отменяет записи, сделанные вLDF
файле?
2.2. РазмерLDF
файла становится меньше в конце отката (сDBCC SQLPERF(LOGSPACE)
)Еще один вопрос: во втором сценарии SQL Server начинает
LDF
довольно быстро использовать файл. В моем случае он увеличился с 18% до 90% за первые несколько минут (<4 минут). Но как только он достиг 99%, он оставался там в течение еще 8 минут, в то время как его использование колебалось от 99,1% до 99,8%. Он поднимается (99,8%) и падает (99,2%), а затем снова (99,7%) и падает (99,5%) несколько раз, прежде чем выдается ошибка. Что происходит за кулисами?
Любые ссылки MSDN, которые могли бы помочь объяснить это больше, приветствуются.
По предложению Али Разеги я добавляю perfmon: Disk Bytes/sec
Ответы:
Как указано выше, после выполнения большего количества тестов я пришел к расчетным выводам. Я собрал их всех в блоге здесь , но я скопирую часть контента в этот пост для потомков.
Гипотеза (на основе некоторых тестов)
На данный момент у меня нет четкого объяснения, почему это так. Но ниже приведены мои оценки, основанные на артефактах, собранных во время испытаний.
Откат происходит в обоих сценариях. Один - явный откат (пользователь нажимает кнопку «Отмена»), другой - неявный (Sql Server принимает это решение внутренне).
В обоих сценариях трафик, идущий в файл журнала, является согласованным. Смотрите изображения ниже:
Сценарий 1:
Сценарий 2:
Один из артефактов, который усилил эту линию мышления, - захват Sql Trace в обоих сценариях.
Необъяснимое поведение:
Любые идеи, которые помогут объяснить это поведение лучше, приветствуются.
источник
Я попробовал следующий эксперимент и получил похожие результаты. В обоих случаях fn_dblog () показывает, что происходит откат, и в сценарии 2 это происходит быстрее, чем в сценарии 1.
Кстати, я поместил и MDF, и LDF на один и тот же внешний (USB 2.0) диск.
Мой первоначальный вывод состоит в том, что в этом случае нет разницы в операции отката, и, вероятно, любая очевидная разница в скорости связана с подсистемой ввода-вывода. Это только моя рабочая гипотеза на данный момент.
Сценарий 1:
Сценарий 2:
Результаты монитора производительности:
Сценарий 1:
Сценарий 2:
Код:
источник