Поделиться через


Системные темпоральные таблицы с оптимизированными для памяти таблицами

Область применения: SQL Server 2016 (13.x) и более поздних версий База данных SQL Azure Управляемый экземпляр SQL Azure

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

Обзор

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

Аудит и анализ данных на основе времени можно запросить в различных средах, особенно в системах OLTP, которые обрабатывают очень много запросов и используют технологию In-Memory OLTP. Однако использование оптимизированных для памяти таблиц в темпоральных сценариях сложно, так как огромное количество созданных исторических данных обычно превышает предел доступной ОЗУ. В то же время использование ОЗУ для хранения исторических данных только для чтения, доступ к которым осуществляется реже, так как он становится более старым, не является оптимальным решением.

Системные темпоральные таблицы для таблиц, оптимизированных для памяти, обеспечивают высокую пропускную способность транзакций и параллелизм без блокировки. Они позволяют хранить большие объемы данных журнала с помощью таблиц в памяти для хранения текущих данных (темпоральной таблицы) и дисковых таблиц для исторических данных. Влияние операций DML уменьшается с помощью внутренней, автогенерированной промежуточной таблицы, оптимизированной для памяти, в которой хранятся последние журналы, и позволяет выполнять dmls из скомпилированного кода в собственном коде.

Эта архитектура показана на следующей диаграмме.

Схема темпоральной архитектуры в памяти.

Сведения о реализации

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

  • Только устойчивые таблицы, оптимизированные для памяти, могут быть системными версиями (DURABILITY = SCHEMA_AND_DATA).

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

  • Запросы, влияющие только на текущую таблицу в памяти, можно использовать в скомпилированных модулях T-SQL в собственном коде. Темпоральные запросы, использующие предложение, FOR SYSTEM TIME не поддерживаются в скомпилированных модулях в собственном коде. Предложение FOR SYSTEM TIME поддерживается с таблицами, оптимизированными для памяти, в нерегламентированных запросах и не собственных модулях.

  • При использовании SYSTEM_VERSIONING = ONвнутренней промежуточной таблицы, оптимизированной для памяти, автоматически создается для принятия последних системных изменений, которые являются результатами операций обновления и удаления в текущей таблице, оптимизированной для памяти.

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

  • Вы можете выполнить очистку данных вручную, выполнив sp_xtp_flush_temporal_history.

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

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

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

Внутренняя оптимизированная для памяти промежуточная таблица

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

  • Имя таблицы создается в следующем формате: Memory_Optimized_History_Table_<object_id> где <object_id> идентификатор текущей темпоральной таблицы.

  • Таблица реплицирует схему текущей темпоральной таблицы плюс один большой столбец. Этот дополнительный столбец гарантирует уникальность строк, перемещаемых во внутренний буфер журнала.

  • Дополнительный столбец имеет следующий формат имени: Change_ID[<suffix>]где <suffix> необязательно добавляется в случае, когда таблица уже имеет Change_ID столбец.

  • Максимальный размер строки для оптимизированной для системы таблицы, оптимизированной для памяти, уменьшается на 8 байт из-за дополнительного столбца bigint в промежуточной таблице. Теперь новый максимум составляет 8 052 байта.

  • Внутренняя промежуточная таблица, оптимизированная для памяти, не представлена в обозреватель объектов SQL Server Management Studio.

  • Метаданные об этой таблице и его соединении с текущей темпоральной таблицей можно найти в sys.internal_tables.

Задача очистки данных

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

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

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

Вы можете выполнить очистку данных, выполнив sp_xtp_flush_temporal_history и указав имя схемы и таблицы:

EXEC sys.sp_xtp_flush_temporal_history <schema_name>, <object_name>;

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