创建内存优化的系统版本的时态表并清理 SQL Server 历史记录表

当你想要控制命名并仍依赖系统创建具有默认配置的历史表时,使用默认历史记录表创建临时表是一个方便的选项。在下面的示例中,新的系统版本内存优化时态表链接到新的基于磁盘的历史记录表。

CREATE SCHEMA History  
GO  
CREATE TABLE dbo.Department   
(  
    DepartmentNumber char(10) NOT NULL PRIMARY KEY NONCLUSTERED,   
    DepartmentName varchar(50) NOT NULL,   
    ManagerID int  NULL,   
    ParentDepartmentNumber char(10) NULL,   
    SysStartTime datetime2 GENERATED ALWAYS AS ROW START HIDDEN NOT NULL,   
    SysEndTime datetime2 GENERATED ALWAYS AS ROW END HIDDEN NOT NULL,     
    PERIOD FOR SYSTEM_TIME (SysStartTime,SysEndTime)     
)  
WITH   
    (  
        MEMORY_OPTIMIZED = ON, DURABILITY = SCHEMA_AND_DATA,  
        SYSTEM_VERSIONING = ON ( HISTORY_TABLE = History.DepartmentHistory )   
    );  

清理 SQL Server 历史记录表随着时间的推移,历史记录表会显着增长。由于不允许从历史表中插入,更新或删除数据,因此清理历史表的唯一方法是首先禁用系统版本控制:

ALTER TABLE dbo.Employee

SET(SYSTEM_VERSIONING = OFF); 走

从历史表中删除不必要的数据:

    DELETE FROM dbo.EmployeeHistory

WHERE EndTime <=‘2017-01-26 14:00:29’;

然后重新启用系统版本控制:

ALTER TABLE dbo.Employee

SET(SYSTEM_VERSIONING = ON(HISTORY_TABLE = [dbo]。[EmployeeHistory],DATA_CONSISTENCY_CHECK = ON));

清除 Azure SQL 数据库中的历史记录表有一点不同,因为 Azure SQL 数据库内置支持清理历史记录表。首先,需要在数据库级别启用临时历史记录保留清理:

ALTER DATABASE CURRENT

设置 TEMPORAL_HISTORY_RETENTION GO

然后设置每个表的保留期限:

ALTER TABLE dbo.Employee

SET(SYSTEM_VERSIONING = ON(HISTORY_RETENTION_PERIOD = 90 天));

这将删除历史记录表中超过 90 天的所有数据。SQL Server 2016 内部部署数据库不支持 TEMPORAL_HISTORY_RETENTION 和 HISTORY_RETENTION_PERIOD,并且在 SQL Server 2016 内部部署数据库上执行上述两个查询之一,将发生以下错误。

对于 TEMPORAL_HISTORY_RETENTION,错误将是:

Msg 102, Level 15, State 6, Line 34

‘TEMPORAL_HISTORY_RETENTION’附近的语法不正确。

对于 HISTORY_RETENTION_PERIOD 错误将是:

Msg 102, Level 15, State 1, Line 39

‘HISTORY_RETENTION_PERIOD’附近的语法不正确。