在外键上创建聚簇索引通常会连接到另一个表

时间:2017-11-09 15:08:47

标签: sql-server performance tsql indexing sql-tuning

我最近在表上进行了一些性能优化/查询调优,并且有一个关于使用外键作为聚簇索引的问题。表结构/关系如下:

我正在使用发票应用程序,并且可以在发票和发票的订单项上定义指南,以确定要提交的最大允许金额。

有一个父表仅存储应用指南的条件,例如创建发票的状态,zip或订单项类型。 GuidelineCondition

有两个子表仅定义了能够提交的货币限额。 GuidelineInvoiceAllowable, GuidelineLineItemAllowable

这两个子表几乎只能通过连接到父条件表来访问。两个子表都在一个无关联的无意义键上聚集了索引。我将聚集索引交换为GuideLineCondition表的外键GuidelineConditionID。父表的聚簇索引是合成键/主键GuidelineConditionID这允许优化器在这些表上有效地进行合并连接,因为连接中的两个表现在都在同一连接列上排序了聚簇索引。

使聚簇索引像这样的外键违反了选择聚簇索引的一些最佳实践,但由于表的访问模式,它似乎是正确的调用。

请参阅此帖子,了解我所考虑的一些最佳做法。 SQL Server - When to use Clustered vs non-Clustered Index?

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

1 个答案:

答案 0 :(得分:1)

这些是指南,而不是绝对的。简短的回答是,没有一种通用的方法。要确定您的聚簇索引是否有效,您需要进行测试。是的 - 像你这样的设置,你有一个父/细节关系,细节通常通过父(直接或间接)访问是一种情况,通常适合聚类在父pk上。我将更进一步,并建议详细信息表的pk应包括父表pk值(s) - 这意味着它将包含至少2列。

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