Использование моментального снимка базы данных и транзакции уровня моментального снимка - PullRequest
0 голосов
/ 10 ноября 2019

У меня есть приложение MVC, которое включает в себя несколько длительных пакетных процессов для отправки информационных бюллетеней, создания отчетов и т. Д.

Ранее я сталкивался с множеством проблем с тупиками, где один из этих длительных запросов мог бы бытьудержание блокировки строки, которая затем должна быть обновлена ​​другим процессом.

Первоначально я решил, что нужно создать запланированное задание, которое создает моментальные снимки базы данных, например ...

CREATE DATABASE MyDatabase_snapshot_[yyyyMMddHHmmss]... AS SNAPSHOT OF MyDatabase

Тогда мое приложение имеет некоторую логику, которая найдет последний доступный моментальный снимок и использует его для подключения только для чтения для длительных процессов или в любом другом месте, где требовалось подключение только для чтения.

Текущая настройка отлично функционирует и надежна. Однако, зависимость от этого запланированного задания не делает меня счастливым. Я могу себе представить, что на каком-то этапе в будущем, если кто-то еще присматривает за этим проектом, это может быть легким источником запутанных проблем. Например, если база данных была перенесена на другой сервер, и запланированная задача создания снимка не была настроена правильно.

С тех пор я понял, что могу достичь аналогичного результата, используя изоляцию транзакции моментального снимка и избегая всехдополнительная сложность управления созданием и очисткой моментальных снимков базы данных.

Однако теперь мне интересно, могут ли быть какие-либо недостатки в производительности при использовании транзакций по сравнению с продолжением использования статических моментальных снимков.

Рассмотрим следующий сценарий.

Система периодически отправляет персонализированные списки заданий примерно 20 000 подписчикам. Для каждого из этих подписчиков выполняется поиск в базе данных для создания соответствующего списка заданий.

Что делает, выполняет цикл по всему списку получателей, и для каждого ...

  1. Открытие подключения к снимку базы данных
  2. Выполнение запроса для поиска подходящих заданий
  3. Закрытие подключения снимка базы данных

Если вместо этого выполняется следующее. ..

  1. Открыть соединение базы данных с обычной базой данных (без снимка)
  2. Создать изолированную транзакцию моментального снимка
  3. Запустить запрос, чтобы найти подходящие задания
  4. Закрыть транзакцию
  5. Закрыть соединение с базой данных

Означает ли это на самом деле дополнительную работу для сервера базы данных?

В частности, мне интересночто нужно сделать на шаге № 2.

Удаление сложности из приложения - это хорошо, но не за счет производительности. Тем более что этот конкретный процесс уже достаточно интенсивен для сервера и требует довольно много времени для запуска.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...