Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 在外键上创建聚集索引通常会连接到另一个表_Sql Server_Performance_Tsql_Indexing_Sql Tuning - Fatal编程技术网

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

Sql server 在外键上创建聚集索引通常会连接到另一个表,sql-server,performance,tsql,indexing,sql-tuning,Sql Server,Performance,Tsql,Indexing,Sql Tuning,我最近在对一个表进行性能优化/查询调优,并对使用外键作为聚集索引提出了一个问题。表结构/关系如下所示: 我在一个发票应用程序中工作,可以在发票和发票行项目上定义提交的最大允许金额 有一个父表,它只存储应用准则的条件,例如发票创建的状态、邮政编码或行项目类型指南条件 有两个子表仅定义可以提交的货币限额GuidelineInvoiceAllowed,GuidelineItemAllowed 这两个子表的访问几乎完全是通过父条件表的连接进行的。这两个子表在一个无意义的合成键上都有聚集索引。我将聚集索引

我最近在对一个表进行性能优化/查询调优,并对使用外键作为聚集索引提出了一个问题。表结构/关系如下所示:

我在一个发票应用程序中工作,可以在发票和发票行项目上定义提交的最大允许金额

有一个父表,它只存储应用准则的条件,例如发票创建的状态、邮政编码或行项目类型<代码>指南条件

有两个子表仅定义可以提交的货币限额<代码>GuidelineInvoiceAllowed,GuidelineItemAllowed

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

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

看到这篇文章,我想到了一些最佳实践


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

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


再说一遍,要知道你的解决方案是否有效,唯一的方法就是尝试并测试它。你做到了

因为你要求评论=)。这是一个很好的问题,我明白你反对最佳实践的观点。我也可以这样做,前提是:这些子表是域表,几乎从不进行插入/删除;那个连接被疯狂地击中;已使用um实际生产备份(真实数据)模拟真实工作负载(acid测试)测试了该解决方案。我可以推荐探索的另一种方法是:使用索引视图数据很少插入,也从不删除。连接是定期访问的,将在几周内使用生产质量数据对其进行测试,并且我们开发环境中的数据也不差。索引视图将是一个很好的解决方案,但在分配给解决原始问题的时间内,实现它将超出范围。我现在有一个非聚集主键,它是详细表上的合成自动编号键和父表外键上的聚集索引。您是说非聚集主键应该包括外键,还是外键上的聚集索引应该包括合成键?“合成自动编号”我们可以使用sql server的术语吗?大概是身份栏?让我们暂时忽略集群。是-明细表的主键应包含父级的fk列。以销售订单表的adventureworks数据库为例。合成键是实数,我说合成自动编号是为了表示它是一个自动编号int,而不是一个GUID,这可能会影响到是否可以将其作为外键进行集群的答案。。