大数据和AI不分家,AI助力低代码和智能运维落地,AI智能体的探索实践,本届AS会议一站聚齐!>>> 了解详情
写点什么

SQL Server 2016:时态表

  • 2015-06-17
  • 本文字数:1478 字

    阅读完需:约 5 分钟

术语“时态数据(temporal data)”是指那些在数据库中有版本的记录。任何给定的逻辑记录都有一个当前版本和零个或多个先前版本。当前版本和任意先前版本在数据库中都以物理行的形式存在,虽然未必在同一张表中。

使用时态表时要努力保证数据完整性。每次更新一个行,都需要有一种方法可以确保行的当前版本复制到存储先前版本的表中。这可以通过触发器或存储过程实现,但两种方法都有各自的问题。

同样,查询时态数据也是个挑战。虽然开发人员很容易获取一条逻辑记录的当前版本,但查询特定数据的版本,需要一个复杂而又容易出错的查询。这经常导致开发人员寄希望于专门为这种负载类型而设计的数据库。

SQL Server 2016 提供了另外一种选择——新的时态表对象。表面上看,时态表看起来跟普通表一样。它支持大多数列类型、普通索引、列存储索引、外键等等。CRUD 类的操作同使用普通 SQL 或对象关系映射一样。实际上,大多数普通表都可以转换成时态表,而不需要修改使用上述表的存储过程和应用程序。

从实现上来说,时态表实际上是两张表。一张表包含当前值,另一张表管理数据的历史版本。两张表链接在一起,普通表的任何 UPDATE 或 DELETE 操作都会自动创建一个相应的历史行。(INSERT 操作不会创建历史记录。)

访问历史数据

开发人员可以直接查询历史表,但由于它不包含当前值,所以不会经常用到它。相反,应该总是使用下面的其中一种操作查询基表:

  • 时间点:AS OF <date_time>
  • 开区间:FROM <start_date_time> TO <end_date_time>
  • 左闭右开:BETWEEN <start_date_time> AND <end_date_time>
  • 闭区间:CONTAINED IN (<start_date_time> , <end_date_time>)

比如,如果想知道 ID 为 27 的客户在第一年中哪个值是活跃的,可以使用查询:

复制代码
FROM Customer FOR SYSTEM_TIME AS OF '2015-1-1' WHERE CustomerID = 27

如果换个需求,想查看客户记录在那天的每个版本,可以使用查询:

复制代码
FROM Customer FOR SYSTEM_TIME BETWEEN '2015-1-1' AND '2015-1-2'WHERE CustomerID = 27

设计原则

  • 时态表需要有一个 SysStartTime 列和一个 SysEndTime 列,两个列均为非空 DateTime2 类型。这些列可以随意命名,由 SQL Server 管理;用户不能插入或更新这些列的值。
  • 不支持 FILESTREAM 列类型,因为它在数据库之外存储数据。
  • 对于表 Foo,历史表的默认表名为“FooHistory”。该名可以覆写。
  • 历史表不能直接修改,只能通过更新或删除当前表的数据增加它的记录。
  • 不支持 INSTEAD OF 触发器,AFTER 触发器只能用在当前表上。

索引必须手动启用。关于这一点,微软给出了一些建议:

为了获得最优的存储大小和性能,一个最优的索引策略是,在当前表上创建一个聚簇列存储索引和 / 或一个 B 树行存储索引,在历史表上创建一个聚簇列存储索引。如果创建 / 使用自己的历史表,那么我们强烈建议创建一个包含当前表主键和时间列的索引,以便提升时态数据查询的速度,以及数据一致性检查操作中一部分查询的速度。如果历史表是行存储的,那么我们建议创建一个聚簇行存储索引。在默认情况下,历史表上会创建一个聚簇行存储索引。至少,我们建议创建一个非聚簇行存储索引。

模式修改

用户不能修改时态表的模式。不过,可以在 ALTER TABLE 语句中使用 SET (SYSTEM_VERSIONING = OFF) 将时态表转换成普通表。

这样做完之后,就可以修改这两张表,然后使用 SET (SYSTEM_VERSIONING = ON) 将它们重新转换成时态表。注意,该语句需要包含历史表的表名和两个系统时间列。

更正:本文的上一个版本曾错误地将 FOR SYSTEM_TIME 表达式描述为 WHERE 子句的一部分,而实际上,它是 FROM 子句的一部分。

查看英文原文: SQL Server 2016: Temporal Tables

2015-06-17 08:322123
用户头像

发布了 1008 篇内容, 共 375.9 次阅读, 收获喜欢 342 次。

关注

评论

发布
暂无评论
发现更多内容

社招前端二面必会react面试题及答案

beifeng1996

前端 React

mate云端元宇宙系统智能合约链游开发技术

Congge420

区块链

文档还能这么写?GreptimePlay 邀你免费玩!

Greptime 格睿科技

数据库 云原生 时序数据库 Playground

上海丨阿里云 Serverless 技术实战营邀你来玩!

阿里巴巴云原生

阿里云 Serverless 云原生

“中国法研杯”司法人工智能挑战赛:基于UTC的多标签/层次分类小样本文本应用,Macro F1提升13%+

AI课程

人工智能 nlp 文本分类 小样本学习

TIDB General Log抓取分析神器

TiDB 社区干货传送门

管理与运维 故障排查/诊断

面试官让你说说react状态管理?

beifeng1996

前端 React

软件测试 | 如何运行JMeter

测吧(北京)科技有限公司

测试

NFT盲盒卡牌游戏系统开发搭建

Congge420

区块链

js事件循环与macro&micro任务队列-前端面试进阶

loveX001

JavaScript 前端

结合实例,解读华为云数字工厂信息模型配置器

华为云开发者联盟

云计算 后端 华为云 华为云开发者联盟 企业号 5 月 PK 榜

软件测试 | JMeter

测吧(北京)科技有限公司

测试

PAG动效框架源码笔记 (三)播放流程

olinone

ios android 特效

智能合约DAPP挖矿系统开发应用

Congge420

区块链

Midjourney|文心一格prompt教程[技巧篇]:生成多样性、增加艺术风格、图片二次修改、渐进优化、权重、灯光设置等17个技巧等你来学

AI课程

人工智能 AI绘画 MidJourney prompt learning

顶会ICSE-2023发布LIBRO技术,缺陷自动重现率达33%

华为云开发者联盟

人工智能 华为云 大模型 华为云开发者联盟 企业号 5 月 PK 榜

技术同学如何快速熟悉业务

老张

系统架构 业务

基于Jmeter 的接口自动化测试实践探讨

jackwang

“数据进化论”2023数智科技大会官宣:从看、用到智能,与客户共进化

奇点云

发布会 奇点云 数据云 数智科技大会

2023我的前端面试小结

loveX001

JavaScript 前端

性价比提升15%,阿里云发布第八代企业级计算实例g8a和性能增强型实例g8ae

云布道师

Cloud Studio 内核升级之持续优化

CODING DevOps

DevOps 软件工程 Cloud Studio 云端IDE

软件测试 | 开源Web性能测试

测吧(北京)科技有限公司

测试

Java常用对象映射工具的介绍和使用

echoes

软件测试 | 认识性能测试

测吧(北京)科技有限公司

测试

速下载!交通业数据安全政策汇编发布

极盾科技

数据安全

airasia Superapp × HMS Core:便捷出行,悦享全程

HMS Core

HMS Core

元宇宙链游系统开发搭建技术

Congge420

区块链

4.0 功能抢先看 | 读懂一个项目的研发效能 之 项目质量表现

思码逸研发效能

研发效能 项目质量

共享电动车生产批发厂家怎么找

共享电单车厂家

共享电动车厂家 共享电单车厂商 共享电动车生产

全球分布式云大会:AntDB超融合流式实时数仓,打造分布式数据库新纪元

亚信AntDB数据库

AntDB AntDB数据库 企业号 5 月 PK 榜

SQL Server 2016:时态表_架构_Jonathan Allen_InfoQ精选文章