小编Ebr*_*ani的帖子

旧值的时态表性能不佳

我在访问时态表中的历史记录时遇到了一个奇怪的问题。通过 AS OF 子句访问临时表中较旧条目的查询比对最近历史条目的查询花费的时间更长。

历史表是由 SQL Server 生成的(包括日期列上的聚集索引并使用页面压缩),我向历史表添加了 5000 万行,我的查询检索了大约 25,000 行。

我试图确定问题的根本原因,但无法确定。到目前为止,我已经测试过:

  • 创建一个包含 5000 万行并带有聚集索引的测试表,以查看速度变慢是否仅仅是由于数量所致。我能够在恒定时间(~400 毫秒)检索 25K 行。
  • 从历史表中删除页面压缩。这对检索时间没有影响,但确实显着增加了表的大小。
  • 我尝试使用 ID 列与日期列直接访问历史记录表的行。这是事情更有趣的地方。我可以在 ~400 毫秒内访问表中较旧的行,而与 AS OF 子子句一样,它需要 ~1200 毫秒。我尝试在日期列上的测试表上进行过滤,并注意到与 ID 列上的过滤相比有类似的减速。这让我相信日期比较是一些放缓的原因。

我想多看看这个,但我也想确保我没有吠错树。首先,是否有其他人在访问时态表中的旧历史数据时遇到过同样的行为(我们只注意到速度超过 1000 万行)?其次,我可以使用哪些策略来进一步隔离性能问题的根本原因(我刚刚开始研究执行计划,但对我来说仍然有点神秘)?

执行计划

这些是简单的检索查询:第一个访问较旧的行,第二个访问较新的行。

较旧的行~1200 毫秒执行时间

最近行~350ms 执行时间

表详细信息

这些是时态表中的列。历史表具有相同的列但没有主键(根据历史表要求): 时态表列

以下是历史表上的索引: 历史表上的索引

performance sql-server temporal-tables

10
推荐指数
1
解决办法
3877
查看次数

标签 统计

performance ×1

sql-server ×1

temporal-tables ×1