Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.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
Performance FK上的连接是否比没有FK的连接更快?_Performance_Sql Server 2005_Join_Foreign Key Relationship_Relationship - Fatal编程技术网

Performance FK上的连接是否比没有FK的连接更快?

Performance FK上的连接是否比没有FK的连接更快?,performance,sql-server-2005,join,foreign-key-relationship,relationship,Performance,Sql Server 2005,Join,Foreign Key Relationship,Relationship,假设我有两张桌子,a和b: 我想在如下查询中加入a和b: FROM a JOIN b on a.fk = b.pk 以下哪种情况会更快 a、 fk被设置为b.pk上的外键-b.pk被索引 a、 fk设置为b.pk上的外键-b.pk未编制索引 表之间没有关系-b.pk已编制索引 表之间没有关系-b.pk没有索引 额外问题-每个场景的速度/速度会有多快 如果你能用推荐信来支持你的答案,那就太棒了。谢谢大家! 最佳做法 外键是关系完整性工具,而不是性能工具。您应该始终在FK列上创建索引以减少查找。S

假设我有两张桌子,a和b:

我想在如下查询中加入a和b:

FROM a
JOIN b on a.fk = b.pk
以下哪种情况会更快

a、 fk被设置为b.pk上的外键-b.pk被索引 a、 fk设置为b.pk上的外键-b.pk未编制索引 表之间没有关系-b.pk已编制索引 表之间没有关系-b.pk没有索引 额外问题-每个场景的速度/速度会有多快

如果你能用推荐信来支持你的答案,那就太棒了。谢谢大家!

最佳做法 外键是关系完整性工具,而不是性能工具。您应该始终在FK列上创建索引以减少查找。SQL Server不会自动执行此操作。 如前所述 从逻辑上讲,这将提供以下性能方面的排名 a、 fk被设置为b.pk上的外键-b.pk被索引 表之间没有关系-b.pk已编制索引 a、 fk设置为b.pk上的外键-b.pk未编制索引 表之间没有关系-b.pk没有索引
索引版本和非索引版本之间的性能差异最大,但是它是更快还是更慢取决于它是选择还是插入。使用索引和外键约束会降低插入速度,但加快会选择索引或使数据在FK中更可靠。由于通常大多数插入都不会明显变慢,除非您正在进行大批量插入,因此通常使用FK和索引最符合您的利益

我也要听利文的回答。要回答您的奖金问题,即创建一个索引会给您带来多大的性能提升,答案是,这要视情况而定

如果一个或两个表都很小,并且它们是查询中仅有的两个表,那么性能增益可能很小,甚至为零。当记录数较少时,有时只读取所有记录比使用索引更快。数据库引擎应该足够聪明来解决这个问题——这就是查询优化的全部内容

同样,如果涉及到其他表和其他选择条件,DB引擎可能会决定不使用此索引,并且其他查找记录的方法会更快

在另一个极端,如果您有两个非常大的表,那么在用于连接它们的字段上创建索引可以将运行时间减少99%或更多


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

谢谢!非常有用。你知道排名中1和2之间的表现差异有多大吗?如果有差异,可以忽略不计。
FROM a
JOIN b on a.fk = b.pk