#sql-server #deadlock
#sql-server #взаимоблокировка
Вопрос:
Чтобы устранить взаимоблокировки (возникающие при индексированном представлении), я попытался использовать RCSI в sql server. Я включил этот режим с помощью:
ALTER DATABASE MyDatabase SET READ_COMMITTED_SNAPSHOT ON
ALTER DATABASE MyDatabase SET ALLOW_SNAPSHOT_ISOLATION ON
и проверил, что он установлен с помощью:
DBCC useroptions
SELECT * FROM sys.databases
В моей базе данных 8 временных баз данных, и они настроены на автоматическое увеличение на 64 МБ. После приема тысяч записей я не вижу никакого роста во временных базах данных. На основе документации RCSI активно использует базу данных tempdb и значительно увеличивает ее размер. Я ожидал увидеть некоторое увеличение базы данных tempdb. Трассировка 1117, 1118 также включена. Но размер базы данных tempdb не увеличивается. Я не включил разрешить изоляцию моментального снимка для базы данных Tempddb.
Спасибо
Ответ №1:
На основе документации RCSI активно использует базу данных tempdb и значительно увеличивает ее размер.
Существует много необоснованных опасений по поводу RCSI. И вставки создают версии строк только в том случае, если в таблице есть триггер.
Ответ №2:
Из BOL
Когда включен уровень изоляции моментальных снимков, при каждом обновлении строки компонент SQL Server Database Engine сохраняет копию исходной строки в базе данных tempdb и добавляет порядковый номер транзакции к строке.
Это означает, что если вы обновляете одну строку, одна строка будет помещена в базу данных TempDB, если вы изменяете или обновляете всю таблицу, вся таблица будет помещена в базу данных TempDB. Таким образом, вполне возможно, что ваша конкретная рабочая нагрузка не требует, чтобы большие объемы данных были версифицированы в базе данных TempDB. Мне нужно было значительно увеличить размер базы данных TempDB (или отключить RSCI) во время больших обновлений, чтобы избежать этой проблемы.
В этом вопросе также обсуждается много вещей, которые следует учитывать при использовании базы данных TempDB.