我一直认为一个表应该按照最常见的查询或性能命中者排序,因此表的聚集索引应该与最困难或最常见的查询一致。
主键不必是聚集索引,所以我知道您可能想知道我将如何处理,但我更关心的是聚集索引而不是主键(老实说,它们通常相互跟随)。
所以对我来说最初的问题不是“我应该在事实表上有一个代理主键吗?” 但更像是“我应该在事实表上有一个聚集索引吗?” 我认为答案是肯定的,你应该有一个(是的,这个网站上还有其他帖子涵盖了这个问题,但我仍然认为在这里值得一提,以防这是人们真正提出的问题,尽管措辞错误)
有时您需要代理键,但我衷心建议代理键不是表的聚集索引。这样做会按照无意义的代理键对表进行排序。(通常人们在表中添加一个代理标识列,并使其成为主键,默认情况下也是聚集索引)
那么在哪些列上创建聚集索引?我个人喜欢事实表的日期,为此您可能会添加一些其他维度的 FK 以获得唯一性,但这会增加大小并且可能不会提供任何好处,因为为了使索引有用,必须引用相关维度(在生成密钥的重要性顺序)。
为了解决这个问题(以及我在这里回答这个问题的原因),我认为您应该添加一个代理项,然后在日期键上创建聚集索引,然后是代理项(按此顺序)。我这样做是因为单独的日期不会成为唯一的行,而是添加代理将。这使数据按日期排序,这有助于所有其他非聚集索引,并保持聚集索引大小合理。
此外,随着数据的增长,您可能希望对其进行分区,在这种情况下,您将需要一个分区键,该分区键始终是日期。以日期作为键的主要部分构建聚集索引使这更容易。通过分区,您现在可以使用滑动窗口技术来归档旧数据或加载。