我最近在表上进行了一些性能优化/查询调优,并且有一个关于使用外键作为聚簇索引的问题 . 表结构/关系如下:
我正在开发票应用程序中,可以在发票和发票的行项目上定义指南,以确定要提交的最大允许金额 .
有一个父表只存储应用指南的条件,例如创建发票的状态,zip或订单项类型 . GuidelineCondition
有两个子表仅定义了能够提交的货币限额 . GuidelineInvoiceAllowable, GuidelineLineItemAllowable
.
通过与父条件表的连接几乎可以访问这两个子表 . 两个子表都在一个无关联的无意义键上聚集了索引 . 我将聚集索引交换到 GuideLineCondition
表的外键 GuidelineConditionID
. 父表的聚簇索引是合成键/主键 GuidelineConditionID
这允许优化器在这些表上有效地进行合并连接,因为连接中的两个表现在都在同一个连接列上排序了聚簇索引 .
使聚簇索引成为这样的外键违反了选择聚簇索引的一些最佳实践,但由于表的访问模式,它似乎是正确的调用 .
查看这篇文章,了解我正在考虑的一些最佳实践 . SQL Server - When to use Clustered vs non-Clustered Index?
数据库专家可以评论我是否做出了正确的决定吗?
1 回答
那些是 guidelines ,而不是绝对的 . 简短的回答是,没有一种通用的方法 . 要确定您的聚簇索引是否有效,您需要进行测试 . 是的 - 像你这样的设置,你有一个父/细节关系,细节通常通过父(直接或间接)访问是一种情况,通常适合聚类在父pk上 . 我将更进一步,并建议详细信息表的pk应包括父表pk值(s) - 这意味着它将包含至少2列 .
再一次 - 了解您的解决方案是否有效的唯一方法是尝试并测试 . 你做到了 .