Не удалять устаревшие данные в соответствии с политикой HISTORY_RETENTION_PERIOD

Среда: SQL Server 2017 Enterprise под управлением Windows Server 2016 Standard

Тестовый пример

Создайте 2 идентичные темпоральные таблицы (отличаются только именем), где 1 таблица имеет HISTORY_RETENTION_PERIOD значение 1 день. Для другой таблицы установлено значение INFINITE.

КОД:

CREATE TABLE dbo.TemporalPurgeTestNew
(   TemporalPurgeTestNewId          int             IDENTITY(1,1)
,   InsertedDate                    datetime2(0)           
,   ModifiedDate                    datetime2(0)        
,   UpdateNum                       int         
,   CONSTRAINT  pk_TemporalPurgeTestNew  
        PRIMARY KEY (TemporalPurgeTestNewId)
,   SysStartTime        datetime2 GENERATED ALWAYS AS ROW START NOT NULL
,   SysEndTime          datetime2 GENERATED ALWAYS AS ROW END   NOT NULL
 ,  PERIOD FOR SYSTEM_TIME (SysStartTime,SysEndTime)) 
 WITH (SYSTEM_VERSIONING = ON 
    (   HISTORY_TABLE = dbo.TemporalPurgeTestNewHistory
    ,   DATA_CONSISTENCY_CHECK = ON
    ,   HISTORY_RETENTION_PERIOD = 1 DAY
    ));

GO

CREATE TABLE dbo.TemporalPurgeTestExistTbl
(   TemporalPurgeTestNewId          int             IDENTITY(1,1)
,   InsertedDate                    datetime2(0)           
,   ModifiedDate                    datetime2(0)      
,   UpdateNum                       int           
,   CONSTRAINT  pk_TemporalPurgeTestExistTbl
        PRIMARY KEY (TemporalPurgeTestNewId)
,   SysStartTime        datetime2 GENERATED ALWAYS AS ROW START NOT NULL
,   SysEndTime          datetime2 GENERATED ALWAYS AS ROW END   NOT NULL
 ,  PERIOD FOR SYSTEM_TIME (SysStartTime,SysEndTime)) 
 WITH (SYSTEM_VERSIONING = ON 
    (   HISTORY_TABLE = dbo.TemporalPurgeTestExistTblHistory
    ));

GO

Вставил по 1 записи в каждую таблицу

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

На 3-й день проверьте, что в таблице с периодом хранения 1 день данные за первый день удалены из связанной таблицы истории, а во 2-й таблице истории все еще содержатся данные с первого дня.

Измените 2-ю таблицу, чтобы установить период хранения на 1 день.

КОД:

ALTER TABLE dbo.TemporalPurgeTestExistTbl
SET (SYSTEM_VERSIONING = ON 
    (   HISTORY_TABLE = dbo.TemporalPurgeTestExistTblHistory
    ,   DATA_CONSISTENCY_CHECK = ON
    ,   HISTORY_RETENTION_PERIOD = 1 DAY
    ));

ОЖИДАЕТСЯ: данные будут удалены из 2-й исторической таблицы таким же образом, как и из 1-й темпоральной таблицы.

ACTUAL: устаревшие данные во 2-й исторической таблице не удаляются в зависимости от набора политик хранения.

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


person E Woo    schedule 17.08.2020    source источник
comment
Пожалуйста, поделитесь DDL вашей таблицы. В документе Microsoft говорится: важно отметить, что только таблицы истории с кластеризованным индексом (B-tree или columnstore) могут иметь настроенную политику конечного хранения. может быть, это так   -  person FLICKER    schedule 18.08.2020
comment
Включены операторы DDL.   -  person E Woo    schedule 18.08.2020
comment
Кластеризованный индекс создается в таблице истории так же, как он создается по умолчанию. В любом случае, если индекс не существует, изменение таблицы на конечный срок хранения вызовет ошибку.   -  person E Woo    schedule 18.08.2020


Ответы (1)


ОБНОВЛЕНИЕ: у меня было неправильное предположение относительно очистки исторической таблицы. Я ожидал, что самые старые данные будут удалены из таблицы, но SQL Server не гарантирует порядок удаления данных. Когда я проверяю количество записей, я вижу, что данные удаляются.

person E Woo    schedule 01.09.2020