Questions tagged «temporal-tables»

1
使用SQL Server 2016系统版本的时态表进行慢速变化维度的查询策略
当使用系统版本的时态表(SQL Server 2016中的新增功能)时,当此功能用于处理大型关系数据仓库中的维缓慢变化时,查询创作和性能含义是什么? 例如,假设我有一个Customer带有Postal Code列的100,000行维,一个Sales带有CustomerID外键列的数十亿行事实表。并假设我要查询“按客户的邮政编码进行的2014年销售总额”。简化的DDL就是这样(为了清楚起见,省略了许多列): CREATE TABLE Customer ( CustomerID int identity (1,1) NOT NULL PRIMARY KEY CLUSTERED, PostalCode varchar(50) NOT NULL, 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); …

1
为什么我有多个(未关联的)时间历史表?
我一直在建立具有SQL Server 2017后端的概念证明系统。 系统使用临时表记录资产配置并跟踪随时间的变化。 我有一个链接到历史记录表的数据表,我们称它为dbo.MSSQL_TemporaryHistoryFor_12345678900。 到目前为止,一切都很好。我有两个问题: 今天,我关闭了表的版本控制功能,因此可以添加一个计算列。完成此操作,然后再次打开,没有错误。 现在,我发现我无法查询更改之前的任何历史数据。新数据将添加到历史记录中,但是没有任何预先设置。 在SSMS内部,我现在可以看到有多个历史记录表,它们都具有相同的名称,但带有十六进制后缀,例如dbo.MSSQL_TemporaryHistoryFor_12345678900_A0B1C2D3。它们未链接在主数据表下方。它们只是在数据库内部自行浮动。当我查询sys.tables时,这些没有显示为历史表,也没有链接到主数据表。 这些表确实包含丢失的历史数据。 因此,我的问题是: 这些附加表代表什么? 他们是如何创建的? 有什么办法可以将它们重新链接到主要历史链中,以便我可以获取历史报告吗? 这非常令人沮丧,因此将非常感谢您能提供的任何帮助。谢谢。

2
较旧值的临时表性能不佳
访问临时表中的历史记录时遇到一个奇怪的问题。通过AS OF子句访问时间表中较旧条目的查询所花的时间比对最近历史条目的查询所花的时间更长。 历史表是由SQL Server生成的(包括日期列上的聚簇索引并使用页面压缩),我向历史表中添加了5000万行,而我的查询检索了大约25,000行。 我试图确定问题的根本原因,但无法识别。到目前为止,我已经测试了: 创建一个具有聚集索引的5000万行的测试表,以查看速度下降是否仅是由于数量引起的。我能够在固定时间(〜400ms)内检索到25K行。 从历史表中删除页面压缩。这对检索时间没有影响,但是确实增加了表的大小。 我尝试使用ID列和日期列直接访问历史记录表的行。这是事情变得更有趣的地方。我可以在〜400ms处访问表中的旧行,其中与AS OF子句一样,它需要1200ms的时间。我尝试对日期列上的测试表进行过滤,并且与对ID列进行过滤相比,发现了类似的减速。这使我相信日期比较是某些放缓的原因。 我想更多地看这个,但是我也想确保我没有吠错树。首先,在访问临时表中的较旧历史数据时,是否还有其他人遇到过相同的行为(我们仅注意到速度下降超过1000万行)?其次,我可以使用哪些策略来进一步隔离性能问题的根本原因(我刚刚开始研究执行计划,但对我来说仍然有点神秘)? 执行计划 这些是简单的检索查询:第一个访问较旧的行,第二个访问较新的行。 旧行〜1200ms执行时间 最近的行〜350ms执行时间 表格详情 这些是时间表中的列。历史记录表具有相同的列,但没有主键(根据历史记录表的要求): 以下是历史记录表上的索引:

3
为什么时态表记录事务的开始时间?
更新临时表中的行时,该行的旧值存储在历史记录表中,事务开始时间为SysEndTime。当前表中的新值将使事务开始时间为SysStartTime。 SysStartTime并SysEndTime在datetime2使用时态表来记录当行是当前版本列。事务开始时间是包含更新的事务开始的时间。 BOL说: 系统datetime2列中记录的时间基于事务本身的开始时间。例如,在单个事务中插入的所有行将在与SYSTEM_TIME周期开始相对应的列中记录相同的UTC时间。 示例:我开始从以下位置更新“订单”表中的所有行,20160707 11:00:00并且该事务需要5分钟才能运行。这将在历史记录表中为每行创建一行,并用SysEndTimeas 20160707 11:00:00。在当前表中的所有行会产生SysStartTime的20160707 11:00:00。 如果有人要20160707 11:01:00在更新运行时执行查询,他们将看到旧值(假设默认读取已提交隔离级别)。 但是,如果有人随后使用AS OF语法查询时态表,那么20160707 11:01:00他们将看到新值,因为它们SysStartTime将是20160707 11:00:00。 对我来说,这意味着它不会显示当时的行。如果它使用事务结束时间,则该问题将不存在。 问题:这是设计使然吗?我想念什么吗? 我可以认为它正在使用事务开始时间的唯一原因是,它是事务开始时唯一的“已知”时间。它不知道事务在开始时将在何时结束,并且在结束时应用结束时间将花费一些时间,这将使正在应用的结束时间无效。这有意义吗? 这应该允许您重新创建问题。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.