假设您有一个具有类型 2 渐变维度的表。
让我们用以下列来表示这个表:
* [Key]
* [Value1]
* ...
* [ValueN]
* [StartDate]
* [ExpiryDate]
在此示例中,假设 [StartDate] 实际上是系统知道给定 [Key] 的值的日期。所以我们的主键将由 [StartDate] 和 [Key] 组成。
当给定 [Key] 的一组新值到达时,我们将 [ExpiryDate] 分配给一些预定义的高代理值,例如“12/31/9999”。然后,我们将该 [Key] 的现有“最近”记录设置为具有等于新值的 [StartDate] 的 [ExpiryDate]。基于联接的简单更新。
因此,如果我们总是想获取给定 [Key] 的最新记录,我们知道我们可以创建一个聚集索引:
* [ExpiryDate] ASC
* [Key] ASC
尽管键空间可能非常宽(例如,一百万个键),但我们可以通过最初按 [ExpiryDate] 对它们进行排序来最小化读取之间的页数。而且由于我们知道给定密钥的最新记录将始终具有 [ExpiryDate] '12/31/9999',因此我们可以利用它来发挥我们的优势。
但是...如果我们想在给定时间获取所有 [Key] 的时间点快照怎么办?从理论上讲,整个键空间并不是同时更新的。因此,对于给定的时间点,[StartDate] 和 [ExpiryDate] 之间的窗口是可变的,因此按 [StartDate] 或 [ExpiryDate] 排序永远不会产生您要查找的所有记录的结果连续的。当然,您可以立即丢弃 [StartDate] 大于您定义的时间点的所有记录。
本质上,在典型的 RDBMS 中,哪种索引策略提供了最小化读取次数以检索给定时间点的所有键值的最佳方法?我意识到我至少可以通过 [Key] 对表进行分区来最大化 IO,但这当然不是理想的。
或者,是否有不同类型的缓慢变化维度以更高效的方式解决此问题?