适用于: SQL Server 2016 (13.x) 及以后版本
Azure SQL 数据库
Azure SQL 托管实例
Microsoft Fabric 中的 SQL 数据库
在使用时间表时,请注意由于系统版本控制的性质,需要注意以下考虑因素和限制:
时序表必须定义主键,以关联当前表与历史表之间的记录。 历史记录表不能有已定义的主键。
用于记录
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子句的查询)的顶部不支持索引视图。在系统版本控制的时态表中,联机选项 (
WITH (ONLINE = ON) 对ALTER TABLE ALTER COLUMN不起任何作用。 无论为ALTER选项指定的值是什么,ONLINE列都不会作为联机操作执行。INSERT和UPDATE语句无法引用SYSTEM_TIME时间段列。 已阻止将值直接插入这些列的尝试。当
TRUNCATE TABLE为SYSTEM_VERSIONING时,不支持ON。不允许直接修改历史记录表中的数据。
为避免数据操作语言 (DML) 逻辑失效,当前表和历史表上均不允许使用
INSTEAD OF触发器。 仅在当前表上允许AFTER触发器。 这些触发器在历史记录表上会被阻止,以便避免导致 DML 逻辑失效。复制技术的使用受到限制:
可用性组:完全支持
变更数据捕获和变更跟踪:仅支持当前表
快照和事务复制:仅支持未启用时态的单个发布服务器和已启用时态的单个订阅服务器。 不支持使用多个订阅服务器,因为这可能会由于依赖本地系统时钟而导致时态数据不一致。 在这种情况下,发布者用于在线事务处理(OLTP)工作负载,而订阅者则负责卸载报告(包括
AS OF查询)。 当分配代理开始时,它会打开一个事务,该事务会一直保持开放,直到分配代理停止。ValidFrom和ValidTo被填充到分发智能体启动时第一个事务的开始时间。 如果让ValidFrom和ValidTo中填入的时间接近当前系统时间对您的应用程序或组织很重要,那么最好按计划运行分发代理,而不是采用默认的持续运行方式。 有关详细信息,请参阅时态表使用方案。合并复制:不支持时态表
定期查询仅影响当前表中的数据。 若要查询历史记录表中的数据,必须使用临时查询。 有关详细信息,请参阅在系统版本控制的临时表中查询数据。
最优的索引策略包括当前表上的聚类列存储索引或B树行存储索引,以及历史表上的聚类列存储索引,以实现存储容量和性能的最佳。 如果你创建或使用自己的历史表,请创建这种类型的索引:该索引由时间段列组成,并以周期结束列开头。 该索引加快了时间查询和数据一致性检查的查询速度。 默认历史表会根据周期列(结束、开始)创建集群行存储索引。 至少应使用非聚集行存储索引。
创建历史记录表后,不会将下列对象/属性从当前表复制到历史记录表:
- 时间段定义
- 身份定义
- Indexes
- 统计信息
- 检查约束条件
- 触发器
- 分区配置
- Permissions
- 行级安全谓词
你不能把历史表配置为历史表链中的当前表。
Note
文档在提到索引时一般使用 B 树这个术语。 在行存储索引中,数据库引擎实现了 B+ 树。 这不适用于列存储索引或内存优化表上的索引。 有关详细信息,请参阅 SQL Server 以及 Azure SQL 索引体系结构和设计指南。