首页 文章

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

提问于
浏览
2

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

我正在开发票应用程序中,可以在发票和发票的行项目上定义指南,以确定要提交的最大允许金额 .

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

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

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

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

查看这篇文章,了解我正在考虑的一些最佳实践 . SQL Server - When to use Clustered vs non-Clustered Index?

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

1 回答

  • 1

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

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

相关问题