Мы рады сообщить, что в SQL Server 2022 достигнуты серьёзные успехи в ускорении восстановления базы данных (ADR). Это еще больше повышает доступность и масштабируемость баз данных, в первую очередь направлено на облегчение очистки и управления хранилищем версий - Persistent Version Store (PVS).

Обзор ADR

ADR ещё больше повышает доступность баз данных, особенно при наличии длинных транзакций. Обеспечивает это специальный процесс ядра, выполняющий Recovery. Функционал ADR появился ​​в SQL Server 2019 (15.x) и был сильно переработан в SQL Server 2022 (16.x).  ADR включен по умолчанию и не может быть отключен.

Рисунок 1. Фаза Recovery для журнала транзакций без ADR
Рисунок 1. Фаза Recovery для журнала транзакций без ADR
Рисунок 2. Фаза Recovery для журнала транзакций с включенным ADR. Тут SLOG - system log stream
Рисунок 2. Фаза Recovery для журнала транзакций с включенным ADR. Тут SLOG - system log stream

Основные преимущества ADR

Быстрое и последовательное восстановление базы данных 

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

Мгновенный откат транзакции 

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

Агрессивное усечение журнала 

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

В ADR полностью перестроен процесс Recovery, выполняемый ядром сервера баз данных:

  • делает его стабильно быстрым, избегая просмотра всего журнала транзакций. С новым ADR журнал транзакций начинает обрабатываться с последней успешной контрольной точки (или с самого старого LSN для «грязных» страниц). В результате этого на время восстановления не влияют длинные транзакции, если таковые есть.

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

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

Улучшения ADR в SQL Server 2022

Многопоточная очистка версии

В SQL Server 2019 (15.x) процесс очистки в ADR выполнялся единственным потоком. Начиная с SQL Server 2022 (16.x), этот процесс использует многопоточную очистку версий - Multi-Threaded Version Cleanup (MTVC), что позволяет параллельно очищать несколько баз данных одного экземпляра SQL Server.

В SQL Server 2022 MTVC включен по умолчанию и использует один поток для каждого экземпляра SQL. Чтобы настроить несколько потоков для очистки версии, нужна изменить конфигурацию с помощью sp_configure, указав нужное значение для параметра: «ADR Cleaner Thread Count», как это показано в примере ниже:

USE master;

GO

-- Enable show advanced option to see ADR Cleaner Thread Count

EXEC sp_configure 'show advanced option', '1';

-- List all advanced options

RECONFIGURE;

EXEC sp_configure; 

-- The following example sets the ADR Cleaner Thread Count to 4

EXEC sp_configure 'ADR Cleaner Thread Count', '4';

RECONFIGURE WITH OVERRIDE; 

-- Run RECONFIGURE to verify the number of threads allocated to ADR Version Cleaner.

RECONFIGURE;

EXEC sp_configure;

В этом примере, после настройки числа процессов очистки в ADR равным четырем для экземпляра с двумя базами данных, очистка ADR выделит только по одному потоку для каждой базы данных, а оставшиеся два потока будут бездействующими. Рекомендуется делать равным число потоков «ADR Cleaner Thread Count» и пользовательских баз данных.

Примечание. Максимальное количество потоков очистки в ADR ограничено количеством ядер, используемых экземпляром SQL Server. Например, если вы используете SQL Server на восьми-ядерном компьютере, максимальное количество потоков очистки ADR, которое будет доступно для ядра сервера баз данных, будет равно восьми, даже если число через sp_configure задано большее восьми.

Очистка пользовательских транзакций

Это улучшение позволяет транзакциям пользователей запускать очистку на страницах, которые не могут быть обработаны обычным процессом очистки из-за конфликтов блокировок. Это помогает обеспечить более эффективную работу процесса очистки ADR.

Уменьшение объема памяти для трекера PVS страниц

Это улучшение переводит отслеживание страницы хранилища версий (PVS) на уровень экстентов, что уменьшает объем памяти, необходимый для поддержки версий страниц.

Улучшение очистки в ADR

Очистка ADR стала эффективнее очищать старые версии в хранилище версий, что улучшило для SQL Server отслеживание и запись неполных страниц хранилища версий, и привело к более оптимальному использованию памяти.

Хранилище версий на уровне транзакций

ADR теперь умеет очищать версии, принадлежащие зафиксированным транзакциям, независимо от того, есть ли в системе прерванные транзакции. PVS это механизм ядра для хранения версий строк в самой базе данных, а не в традиционном хранилище версий в tempdb. PVS страницы высвобождаются, даже если очистка карты прерванных транзакций не закончена. В результате этого улучшения меньше растёт PVS, даже если очистка ADR выполняется медленно или не удаётся.

Новые Extended Events

Для телеметрии в многопоточной очистке версий ADR PVS добавлено новое событие xEvents:  tx_mtvc2_sweep_stats.

Резюме

В этой статье мы рассмотрели улучшения в ADR, которые были включены в SQL Server 2022, и еще больше повышают доступность и масштабируемость ваших баз данных. На рисунке ниже показано, насколько это может поднять эффективность Recovery на старте сервера.

Рис. 3. Массовая вставка 5 млн строк и время восстановления после перезапуска SQLServer с включенной и выключенной ADR (параллельное сравнение)
Рис. 3. Массовая вставка 5 млн строк и время восстановления после перезапуска SQLServer с включенной и выключенной ADR (параллельное сравнение)

Комментарии (2)


  1. v1000
    24.05.2023 15:36

    Максимальное количество потоков очистки в ADR ограничено количеством ядер, используемых экземпляром SQL Server.

    я правильно понимаю, что если у сервера восемь ядер но шестнадцать потоков, количество потоков очистки будет равно числу ядер?


    1. mssqlhelp Автор
      24.05.2023 15:36

      В оригинале написано так: Note: The maximum number of ADR Cleaner threads is capped at the number of cores used by the SQL Server instance. Однако, я подозреваю, что это простая оговорка... В документации пока не видел про это ограничение.