Использование ресурсов при управлении версиями строк

Платформа управления версиями строк поддерживает следующие функции, доступные в SQL Server.

  • Триггеры

  • Режим MARS

  • Индексирование в сети

Платформа управления версиями строк также поддерживает следующие уровни изоляции транзакций на основе версий строк, которые не включены по умолчанию:

  • Если параметр базы данных READ_COMMITTED_SNAPSHOT имеет значение ON, транзакции READ_COMMITTED обеспечивают согласованность чтения на уровне инструкций с помощью управления версиями строк.

  • Если параметр базы данных ALLOW_SNAPSHOT_ISOLATION имеет значение ON, транзакции SNAPSHOT обеспечивают согласованность чтения на уровне транзакций с помощью управления версиями строк.

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

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

Пространство, используемое в базе данных tempdb

Для каждого экземпляра компонента Database Engine в базе данных tempdb должно быть достаточно места, чтобы хранить версии строк, формируемые для каждой базы данных этого экземпляра. Администратор баз данных должен обеспечить достаточно места в базе данных tempdb для поддержки хранилища версий. В базе данных tempdb имеются два хранилища версий:

  • Хранилище версий построения индекса в сети используется для построения индексов в сети во всех базах данных.

  • Стандартное хранилище версий используется для всех прочих операций изменения данных во всех базах.

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

  • В транзакции используется изоляция на основе управления версиями строк.

  • Используются триггеры, режим MARS или операции построения индекса в сети.

  • Транзакция формирует версии строк.

ПримечаниеПримечание

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

Если в базе данных tempdb не хватает места, компонент Database Engine выполняет принудительное сжатие хранилища версий. В процессе сжатия наиболее длительные запущенные транзакции, в которых еще не сформированы версии строк, помечаются как жертвы. Для каждой транзакции-жертвы в журнале ошибок формируется сообщение 3967. Если транзакция помечена как жертва, для нее отключается возможность считывания версий строк в хранилище версий. При попытке считывания транзакцией версий строк формируется сообщение 3966 и выполняется откат транзакции. В случае успешного сжатия в базе данных tempdb появляется доступное пространство. В противном случае место в базе данных tempdb заканчивается, и происходит следующее:

  • Выполнение операций записи продолжается, но версии не формируются. В журнале ошибок отображается информационное сообщение (3959), но на транзакцию, записывающую данные, это не влияет.

  • Транзакции, пытающиеся получить доступ к версиям строк, которые не были сформированы из-за полного отката базы данных tempdb, завершаются с ошибкой 3958.

Пространство, используемое в строках данных

Для каждой строки базы данных доступно до 14 байт в конце строки для хранения сведений об управлении версиями. Сведения для управления версиями строки содержат последовательный номер транзакции, зафиксировавшей версию, а также указатель на строку этой версии. Эти 14 байт добавляются при первом изменении строки либо при вставке новой строки, если выполняется любое из следующих условий:

  • Параметры READ_COMMITTED_SNAPSHOT или ALLOW_SNAPSHOT_ISOLATION установлены в ON.

  • В таблице имеется триггер.

  • Используется режим MARS.

  • В данный момент в таблице выполняются фоновые операции построения индекса.

Данные 14 байт удаляются из строки базы данных при первом изменении строки, если выполняется каждое из следующих условий:

  • Параметры READ_COMMITTED_SNAPSHOT и ALLOW_SNAPSHOT_ISOLATION установлены в OFF.

  • В таблице больше не существует триггера.

  • Режим MARS больше не используется.

  • Фоновые операции построения индекса в данный момент не выполняются.

Если используются любые функции управления версиями строк, необходимо выделить достаточно места на диске: по 14 байт на строку базы данных. Добавление сведений для управления версиями строк может привести к разбиению страниц индекса или выделению новой страницы данных, если в текущей странице места недостаточно. Например, если средняя длина строки составляет 100 байт, то дополнительные 14 байт вызовут увеличение существующей таблицы на 14 процентов (или менее).

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

Пространство, используемое большими объектами

Компонент SQL Server Database Engine поддерживает шесть типов данных, которые могут содержать строки длиной до 2 гигабайт (ГБ): nvarchar(max), varchar(max), varbinary(max), ntext, text и image. Большие строки, сохраненные с помощью этих типов данных, хранятся в рядах фрагментов данных, связанных со строкой данных. Сведения о версиях строк хранятся в каждом из фрагментов, используемых для хранения этих больших строк. Фрагменты данных представляют собой коллекцию страниц, выделенную для больших объектов таблицы.

По мере добавления в базу данных новых больших значений выделяются фрагменты, размером максимум в 8040 байт данных на фрагмент. Более ранние версии компонента Database Engine поддерживали хранение до 8080 байт данных типа ntext, text или image на фрагмент.

Когда база данных обновляется с более ранних версий SQL Server на SQL Server, существующие большие объекты (LOB) типа ntext, text и image не обновляются, чтобы освободить пространство для информации о версиях строк. Однако при первом обновлении данные LOB динамически обновляются для включения хранения сведений для управления версиями. Это происходит даже в случае, если версии строк не формируются. После обновления данных LOB максимальное число байтов на фрагмент уменьшается с 8080 до 8040 байт. Процесс обновления равнозначен удалению значения LOB и повторной вставки того же значения. Данные LOB обновляются даже при изменении только одного байта. Это одноразовая операция для каждой строки типа ntext, text или image, но при каждой операции, в зависимости от размера данных LOB, может формироваться большое число операций выделения страниц и операций ввода-вывода. Может также формироваться большое число операций записи в журнал, если изменения полностью записываются в журнал. Операции WRITETEXT и UPDATETEXT записываются в журнал в минимальном объеме, если режим восстановления базы данных не установлен в FULL.

Типы данных nvarchar(max), varchar(max) и varbinary(max) в более ранних версиях SQL Server недоступны. Поэтому проблем, связанных с их обновлением, возникнуть не может.

Для соответствия данному требованию необходимо выделить достаточно места на диске.

Контроль управления версиями строк и хранилища версий

Для контроля за управлением версиями строк, за хранилищем версий и процессами изоляции моментальных снимков с целью увеличения производительности и диагностики в SQL Server имеются средства в виде динамических административных представлений (DMV) и счетчиков производительности в системном мониторе Windows.

Представления DMV

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

sys.dm_db_file_space_usage Возвращает сведения о пространстве, используемом каждым файлом базы данных. Дополнительные сведения см. в разделе sys.dm_db_file_space_usage (Transact-SQL).

sys.dm_db_session_space_usage Возвращает сведения об активности по выделению и освобождению страниц по сеансам для базы данных. Дополнительные сведения см. в разделе Представление sys.dm_db_session_space_usage.

sys.dm_db_task_space_usage Возвращает сведения об активности по выделению и освобождению страниц по задачам для базы данных. Дополнительные сведения см. в разделе sys.dm_db_task_space_usage.

sys.dm_tran_top_version_generators Возвращает виртуальную таблицу для объектов, формирующих большинство версий в хранилище версий. В ней 256 максимальных значений совокупной длины записей сгруппированы по database_id и rowset_id. Эта функция позволяет определить самых крупных потребителей в хранилище версий. Дополнительные сведения см. в разделе sys.dm_tran_top_version_generators.

sys.dm_tran_version_store Возвращает виртуальную таблицу, в которой отображаются все записи о версиях в стандартном хранилище версий. Дополнительные сведения см. в разделе sys.dm_tran_version_store.

ПримечаниеПримечание

Выполнение функций sys.dm_tran_top_version_generators и sys.dm_tran_version_store потенциально является весьма затратным, так как обеими функциями выполняется запрос ко всему хранилищу версий, которое может быть довольно объемным.

sys.dm_tran_active_snapshot_database_transactions Возвращает виртуальную таблицу для всех активных транзакций во всех базах данных экземпляра SQL Server, использующего управление версиями строк. Системные транзакции в данном представлении не отображаются. Дополнительные сведения см. в разделе sys.dm_tran_active_snapshot_database_transactions.

sys.dm_tran_transactions_snapshot Возвращает виртуальную таблицу, в которой отображаются моментальные снимки, сделанные каждой транзакцией. Моментальный снимок содержит последовательные номера активных транзакций, использующих управление версиями строк. Дополнительные сведения см. в разделе sys.dm_tran_transactions_snapshot.

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

sys.dm_tran_current_snapshot Возвращает виртуальную таблицу, в которой отображаются все активные транзакции на момент начала текущей транзакции с изоляцией моментальных снимков. Если в текущей транзакции используется изоляция моментальных снимков, данная функция не возвращает никаких строк. Функция sys.dm_tran_current_snapshot работает подобно sys.dm_tran_transactions_snapshot, но она возвращает только активные транзакции для текущего моментального снимка. Дополнительные сведения см. в разделе sys.dm_tran_current_snapshot.

Счетчики производительности

Счетчики производительности SQL Server предоставляют сведения о системной производительности, на которую влияют процессы SQL Server. Следующие счетчики производительности контролируют базу данных tempdb и хранилище версий, а также транзакции, использующие управление версиями строк. Счетчики производительности содержатся в объекте производительности SQLServer:Transactions.

Свободное место в базе данных tempdb (КБ) Позволяет контролировать объем (в килобайтах (КБ)) свободного места в базе данных tempdb. В базе данных tempdb должно быть достаточно свободного места для обработки хранилища версий, поддерживающего изоляцию моментальных снимков.

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

[размер стандартного хранилища версий] = 2 * [создаваемые данные для хранилища версий за минуту] * [наиболее длительное время выполнения транзакции (в минутах)]

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

Размер хранилища версий (КБ) Контролирует размер всех хранилищ версий в килобайтах. Эти сведения помогают определить объем пространства, которое необходимо выделить в базе данных tempdb для хранилища версий. Наблюдение за этим счетчиком в течение некоторого периода времени полезно для оценки дополнительного пространства, необходимого для базы данных tempdb.

Скорость формирования версий (КБ/с) Контролирует скорость формирования версий во всех хранилищах версий, КБ/с.

Скорость очистки версий (КБ/с) Контролирует скорость очистки версий во всех хранилищах версий, КБ/с.

ПримечаниеПримечание

Сведения счетчиков Скорость формирования версий (КБ/с) и Скорость очистки версий (КБ/с) можно использовать для предсказания требований к пространству для базы данных tempdb.

Число записей в хранилище версий Контролирует число записей в хранилище версий.

Создание записей в хранилище версий Контролирует общее число записей в хранилище версий, созданных для хранения версий строк с момента запуска экземпляра.

Усечение записей в хранилище версий Контролирует общее число записей в хранилище версий, усеченных с момента запуска экземпляра. Усечение записи в хранилище версий выполняется в случае, когда SQL Server определяет, что для запуска активных транзакций не требуется ни одной из строк версий, хранящихся в хранилище.

Процент конфликтов обновления Контролирует процент транзакций с обновлением моментальных снимков, в которых возникают конфликты обновления, в общем числе транзакций с обновлением моментальных снимков.

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

Транзакции Контролирует общее число активных транзакций. В этот показатель не включаются системные транзакции.

Транзакции моментальных снимков Контролирует общее число активных транзакций моментальных снимков.

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

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

ПримечаниеПримечание

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