У меня есть приложение MVC, которое включает в себя несколько длительных пакетных процессов для отправки информационных бюллетеней, создания отчетов и т. Д.
Ранее я сталкивался с множеством проблем с тупиками, где один из этих длительных запросов мог бы бытьудержание блокировки строки, которая затем должна быть обновлена другим процессом.
Первоначально я решил, что нужно создать запланированное задание, которое создает моментальные снимки базы данных, например ...
CREATE DATABASE MyDatabase_snapshot_[yyyyMMddHHmmss]... AS SNAPSHOT OF MyDatabase
Тогда мое приложение имеет некоторую логику, которая найдет последний доступный моментальный снимок и использует его для подключения только для чтения для длительных процессов или в любом другом месте, где требовалось подключение только для чтения.
Текущая настройка отлично функционирует и надежна. Однако, зависимость от этого запланированного задания не делает меня счастливым. Я могу себе представить, что на каком-то этапе в будущем, если кто-то еще присматривает за этим проектом, это может быть легким источником запутанных проблем. Например, если база данных была перенесена на другой сервер, и запланированная задача создания снимка не была настроена правильно.
С тех пор я понял, что могу достичь аналогичного результата, используя изоляцию транзакции моментального снимка и избегая всехдополнительная сложность управления созданием и очисткой моментальных снимков базы данных.
Однако теперь мне интересно, могут ли быть какие-либо недостатки в производительности при использовании транзакций по сравнению с продолжением использования статических моментальных снимков.
Рассмотрим следующий сценарий.
Система периодически отправляет персонализированные списки заданий примерно 20 000 подписчикам. Для каждого из этих подписчиков выполняется поиск в базе данных для создания соответствующего списка заданий.
Что делает, выполняет цикл по всему списку получателей, и для каждого ...
- Открытие подключения к снимку базы данных
- Выполнение запроса для поиска подходящих заданий
- Закрытие подключения снимка базы данных
Если вместо этого выполняется следующее. ..
- Открыть соединение базы данных с обычной базой данных (без снимка)
- Создать изолированную транзакцию моментального снимка
- Запустить запрос, чтобы найти подходящие задания
- Закрыть транзакцию
- Закрыть соединение с базой данных
Означает ли это на самом деле дополнительную работу для сервера базы данных?
В частности, мне интересночто нужно сделать на шаге № 2.
Удаление сложности из приложения - это хорошо, но не за счет производительности. Тем более что этот конкретный процесс уже достаточно интенсивен для сервера и требует довольно много времени для запуска.