У меня в системе много тупиков.
Я бы хотел использовать Snapshot Isolation для их исправления, но у моего администратора есть резервы.
Одна из его проблем заключается в том, что изоляция моментальных снимков замедляет запись. Это потому, что он должен записать в кеш, а затем в TempDb (версия строки), а затем он может вернуться к вызывающей стороне.
«Нормальная» запись может быть просто записана в кеш, а затем выполнена.
Так работает версионность строк? Или это сложнее, чем это? Это как-то делает это параллельно?
Или запись идет медленнее с изоляцией снимка?
Ответы:
Нет, это неверно Это как-то подразумевает, что записи при наличии версий имеют большую задержку, так как каждая запись должна касаться диска (для tempdb), что не соответствует действительности. Запись в базу данных tempdb также является записью в «кэш». Единственное «ожидание» происходит во время COMMIT, когда необходимо укрепить журнал. Верно, что при управлении версиями необходимо укреплять как журнал БД, так и журнал tempdb, но это не обязательно подразумевает более высокую задержку (IO должен быть параллельным на разных путях хранения, база данных tempdb хранится на отдельном диске от вашего интенсивно используемого LDF, правильно?). Полное объяснение см. В разделе « Как это работает: презентация ввода-вывода SQL Server» Боба Дорра. Я действительно надеюсь, что ваш администратор БД понимает это лучше, чем вы здесь это передаете.
Как я уже упоминал в вашем другом посте: снимок не имеет затрат на ВСТАВКИ, а стоимость обновлений и удалений может быть легко уменьшена. Использование ресурсов управления версиями строк объясняет компромиссы. В этот момент вы, вероятно, должны проводить тестирование с реалистичной рабочей нагрузкой, которая является единственным способом правильно оценить воздействие, которое вы испытаете.
источник
sys.dm_db_file_space_usage
на рабочем сервере. Еслиversion_store_reserved_page_count
не ноль, вы уже используете магазин версий .Я считаю, что есть другие проблемы в приложении, если вы получаете тупики. Изоляция моментальных снимков обычно помогает уменьшить блокировки ожидания, но корень тупиковых ситуаций обычно заключается в различных методах доступа в приложении, которые следует предотвращать, придерживаясь согласованного шаблона. Дискуссии о взаимоблокировках сложны, и есть много ресурсов, посвященных им.
Ваш администратор БД имеет право беспокоиться об изменении уровня изоляции на снимок, поскольку это увеличивает нагрузку на базу данных tempDB. В общем, я рекомендую использовать изоляцию моментальных снимков, но я думаю, что это только один из способов устранения ваших тупиков. Вы можете получить грязную запись, где одна транзакция обновляет строку A, затем B, а другая транзакция обновляет строку B, а затем A.
источник