FK上的连接比没有FK的连接更快吗?

时间:2011-06-27 13:57:25

标签: performance sql-server-2005 join foreign-key-relationship relationship

3 个答案:

答案 0 :(得分:5)

最佳实践

  1. 外键是关系完整性工具,而非性能工具。您应该始终在FK列上创建索引以减少查找。 SQL Server不会自动执行此操作。
  2. 如此处Foreign keys boost performance
  3. 所述

    从逻辑上讲,这提供了以下排名绩效

    1. a.fk设置为b.pk上的外键 - b.pk已编入索引
    2. 表之间没有任何关系 - b.pk已编入索引
    3. a.fk设置为b.pk上的外键 - b.pk未编入索引
    4. 表之间没有任何关系 - b.pk未编入索引

答案 1 :(得分:1)

索引和非索引版本之间的性能差异最大,但是它是更快还是更慢取决于它是选择还是插入。索引和外键约束减慢了插入速度,但加速选择(索引)或使数据更可靠(FK)。由于通常大多数插入物的速度都没有明显减慢(除非您正在进行大型体积插入),因此获得FK和索引通常符合您的最佳利益。

答案 2 :(得分:1)

我会同意Lieven的回答。只是回答你的奖金问题,即你从创建索引中获得了多少性能提升,答案就是“这取决于”。

如果一个或两个表都很小并且它们是查询中唯一的两个表,则性能增益可能会小到零。当记录数量很少时,有时只读取所有记录而不是使用索引更快。数据库引擎应该足够聪明,可以解决这个问题 - 这就是“查询优化的全部内容”。

同样,如果您涉及其他表和其他选择标准,则数据库引擎可能决定不使用此索引,并且查找记录的其他方式更快。<​​/ p>

另一方面,如果您有两个非常大的表,则在用于连接它们的字段上创建索引可以将运行时间缩短99%或更多。

这就是为什么学习阅读数据库引擎上的解释计划是一个好主意。如果查询需要很长时间,请运行解释计划并查看它正在执行的操作。通常,创建一个好的索引可以显着改善查询。