在外键上创建聚集索引经常连接到另一个 table

Creating a clustered index on a foreign key is frequently joined to another table

我最近在对 table 进行一些性能 optimization/query 调优,并且对使用外键作为聚簇索引有疑问。 tablestructure/relationships如下:

我正在开发一个发票应用程序,可以在发票和发票的行项目上定义允许提交的最大金额的准则。

有一个 parent table 仅存储应用准则的条件,例如发票的创建状态、邮编或行项目类型。 GuidelineCondition

有两个 child table 仅定义能够提交的货币限制。 GuidelineInvoiceAllowable, GuidelineLineItemAllowable

这两个 child table 几乎只能通过连接到 parent 条件 table 来访问。 child table 都在合成的 non-meaningful 键上有聚簇索引。我将聚簇索引交换为 GuideLineCondition table、GuidelineConditionID 的外键。 parent table 的聚集索引是合成的 key/primary 键 GuidelineConditionID 这允许优化器有效地对这些 table 进行合并连接,因为两者 tables 在连接中现在已经在同一个连接列上排序聚簇索引。

像这样将聚簇索引设为外键违反了一些选择聚簇索引的最佳实践,但由于 table 的访问模式,这似乎是正确的选择。

查看此 post 了解我想到的一些最佳做法。 SQL Server - When to use Clustered vs non-Clustered Index?

数据库专家可以评论我是否做出了正确的决定吗?

这些是准则,不是绝对的。简短的回答是没有一种放之四海而皆准的方法。要确定您的聚集索引是否有效,您需要进行测试。是的 - 像您这样的设置,您有 parent/detail 关系并且通常通过父级(直接或间接)访问详细信息,这种情况通常适合在父级的 pk 上进行集群。我将更进一步并建议细节 table 的 pk 应该包括父 table pk 值——这意味着它将至少包含 2 列。

再说一次 - 了解您的解决方案是否有效的唯一方法是尝试并测试。你已经做到了。