Рекомендации и ограничения темпоральной таблицы
Область применения: SQL Server 2016 (13.x) и более поздних версий База данных SQL Azure Управляемый экземпляр SQL Azure
Из-за характера системного управления версиями существуют некоторые рекомендации и ограничения, которые следует учитывать при работе с темпоральными таблицами:
Темпоральная таблица должна иметь первичный ключ, чтобы сопоставить записи между текущей таблицей и таблицей журнала. В таблице журнала не может быть определен первичный ключ.
SYSTEM_TIME
Столбцы периода, используемые для записиValidFrom
иValidTo
значения, должны быть определены с типом данных datetime2.Темпоральный синтаксис работает с таблицами или представлениями, которые хранятся локально в базе данных. С удаленными объектами, такими как таблицы на связанном сервере или внешних таблицах, нельзя использовать
FOR
предложение или предикаты периодов непосредственно в запросе.Если при создании таблицы журнала указывается ее имя, следует также указать имя схемы и таблицы.
По умолчанию таблица журнала сжимается с использованием метода
PAGE
.Если текущая таблица секционирована, таблица журнала создается в файловой группе по умолчанию, так как конфигурация секционирования не реплицируется автоматически из текущей таблицы в таблицу журнала.
Таблицы темпоральных и журналов не могут использовать FileTable или FILESTREAM. FileTable и FILESTREAM позволяют управлять данными за пределами SQL Server, поэтому системное управление версиями не может быть гарантировано.
Таблицу узлов или граничную таблицу невозможно создать как темпоральную или преобразовать в нее.
Хотя темпоральные таблицы поддерживают типы данных BLOB-объектов, такие как (n)varchar(max), varbinary(max), (n)text и image, они несут значительные затраты на хранение и влияют на производительность из-за их размера. Таким образом, при проектировании системы следует использовать эти типы данных с осторожностью.
Таблицу журнала нужно создавать в той же базе данных, в которой создавалась текущая таблица. Темпоральные запросы по связанным серверам не поддерживаются.
Таблица журнала не может содержать ограничения (первичный ключ, внешний ключ, таблица или ограничения столбцов).
Индексированные представления не поддерживаются поверх темпоральных запросов (запросов, использующих
FOR SYSTEM_TIME
предложение).Параметр Online (
WITH (ONLINE = ON
) не влияет наALTER TABLE ALTER COLUMN
системную темпоральную таблицу с версиями.ALTER
Столбец не выполняется в виде оперативной операции, независимо от того, какое значение было указано дляONLINE
параметра.INSERT
иUPDATE
операторы не могут ссылаться наSYSTEM_TIME
столбцы периода. Попытки вставки значений непосредственно в эти столбцы блокируются.TRUNCATE TABLE
не поддерживаетсяON
в то время какSYSTEM_VERSIONING
.Запрещено изменять данные в таблице журнала напрямую.
ON DELETE CASCADE
иON UPDATE CASCADE
не разрешены в текущей таблице. Другими словами, если темпоральная таблица ссылается на таблицу в связи внешнего ключа (соответствующаяparent_object_id
sys.foreign_key
в )CASCADE
параметры не допускаются. Чтобы обойти это ограничение, используйте логику приложения или после триггеров для поддержания согласованности при удалении в таблице первичного ключа (соответствующейreferenced_object_id
).sys.foreign_key
Если таблица первичного ключа является темпоральной, а ссылочная таблица — нет, это ограничение отсутствует.
INSTEAD OF
Триггеры не разрешены в текущей или таблице журнала, чтобы избежать недопустимой логики DML.AFTER
триггеры разрешены только в текущей таблице. Эти триггеры блокируются в таблице журнала, чтобы избежать недопустимой логики DML.Использование технологий репликации ограничено.
Группы доступности: полностью поддерживается
Отслеживание изменений и отслеживания изменений: поддерживается только в текущей таблице
Моментальный снимок и репликация транзакций: поддерживается только для одного издателя без включения темпоральных данных, а один подписчик с темпоральным включенным. Использование нескольких подписчиков не поддерживается из-за зависимости от локальных системных часов, что может привести к несогласованным темпоральным данным. В этом случае издатель используется для рабочей нагрузки OLTP, а подписчик служит для разгрузки отчетов (включая
AS OF
запросы). При запуске агент распространения открывает транзакцию, которая удерживается открытой до тех пор, пока агент распространения не остановится.ValidFrom
иValidTo
заполняются временем начала первой транзакции, запускаемой агентом распространителя. Возможно, предпочтительнее запускать агент распространителя по расписанию, а не поведение по умолчанию для его непрерывного выполнения, еслиValidFrom
ValidTo
время, близкое к текущему системному времени, важно для приложения или организации. Дополнительные сведения см . в сценариях использования темпоральных таблиц.Репликации слиянием — не поддерживается в темпоральных таблицах.
Обычные запросы влияют только на данные в текущей таблице. Чтобы запросить данные в таблице журнала, необходимо использовать темпоральный запрос. Дополнительные сведения см. в статье "Запрос данных" в системной темпоральной таблице.
Оптимальная стратегия индексирования включает в себя индекс хранилища кластеризованных столбцов и (или) индекс хранилища строк B-дерева в текущей таблице, а также кластеризованный индекс columnstore в таблице журнала для оптимального размера хранилища и производительности. Если вы создаете или используете собственную таблицу журнала, настоятельно рекомендуется создать этот тип индекса, состоящий из столбцов периодов, начиная с конца столбца периода. Этот индекс ускоряет темпоральные запросы и ускоряет запросы, которые являются частью проверки согласованности данных. Таблица журнала по умолчанию содержит кластеризованный индекс rowstore, созданный на основе столбцов периода (с конца или с начала). Мы советуем использовать хотя бы некластеризованный индекс rowstore.
При создании таблицы журнала из текущей таблицы в нее не реплицируются следующие объекты и свойства:
- определение периода;
- определение идентификатора;
- Индексы
- Статистика
- Проверочные ограничения
- Триггеры
- конфигурация секционирования;
- Разрешения
- предикаты безопасности на уровне строк.
Таблицу журнала невозможно настроить в качестве текущей в цепочке таблиц журнала.
Примечание.
В документации термин B-tree обычно используется в ссылке на индексы. В индексах rowstore ядро СУБД реализует дерево B+. Это не относится к индексам columnstore или индексам в таблицах, оптимизированных для памяти. Дополнительные сведения см. в руководстве по архитектуре и проектированию индексов SQL Sql Server и Azure.
Связанный контент
- Темпоральные таблицы
- Начало работы с системными темпоральными таблицами
- Проверки согласованности систем темпоральных таблиц
- Секционирование с темпоральными таблицами
- Безопасность темпоральной таблицы
- Управление хранением исторических данных в системных темпоральных таблицах
- Системные темпоральные таблицы с оптимизированными для памяти таблицами
- Представления и функции темпоральных метаданных таблицы