外键是否提高查询性能?

假设我有两个表,产品和ProductCategories。 两个表在CategoryId上都有关系。 这是查询。

select p.ProductId, p.Name, c.CategoryId, c.Name AS Category from Products p inner join ProductCategories c on p.CategoryId = c.CategoryId where c.CategoryId = 1; 

当我创build执行计划时,ProductCategories表执行聚簇索引查找,这是期望的。 但是对于表产品,它执行集群索引扫描,这让我怀疑。 为什么FK不能帮助提高查询性能?

所以我必须在Products.CategoryId上创build索引。 当我再次创build执行计划时,两个表都执行索引查找。 估计的子树成本大大降低了。

我的问题是:

  1. 除了FK有助于关系约束,它还有其他用处吗? 它提高了查询性能吗?

  2. 我应该在所有表中的所有FK列(喜欢Products.CategoryId)上创build索引吗?

外键是一个参照完整性工具,而不是一个性能工具。 至less在SQL Server中,创buildFK不会创build关联的索引,您应该在所有FK字段上创build索引以提高查找时间。

外键可以提高(和伤害)性能

  1. 如此处所述: 外键提升性能

  2. 您应该始终在FK列上创build索引以减less查找。 SQL Server不会自动执行此操作。

编辑

由于现在这个环节似乎已经死了(对克里斯的注意) ,以下显示了为什么外键可以提高(和伤害)性能的要点。

外键可以提高性能

在读取数据时,外键约束提高了性能,但同时也降低了插入/修改/删除数据时的性能。

在阅读查询的情况下,优化器可以使用外键约束来创build更有效的查询计划,因为外键约束是预先声明的规则。 这通常涉及跳过查询计划的某些部分,因为例如优化器可以看到由于外键约束,执行该计划的特定部分是不必要的。

外键是确保数据库完整性的DBMS概念。

任何性能影响/改进都将针对正在使用的数据库技术而特定,并且是外键的次要目的。

在SQL Server中确保所有外键至less有一个非聚集索引是最好的做法。

我希望这个清除了你的东西,但请随时要求更多的细节。

你最好的performance是在你经常使用的字段上使用索引。 如果您使用SQL Server,则可以使用事件探查器来分析特定的数据库,并使用输出的文件并使用调整向导来接收有关索引放置位置的build议。 我也喜欢使用Profiler来清理长时间运行的存储过程,每周发布前十名最差的犯罪者名单,让人们诚实:D。

您可以使用它来帮助提高查询效率。 它确实允许您重新构buildSQL Server中的查询,以使用外部联接而不是内部联接,从而删除sql服务器,必须检查列中是否存在空值。 你不需要把这个限定符放进去,因为外键关系已经为你实现了。

所以这:

  select p.ProductId, p.Name, c.CategoryId, c.Name AS Category from Products p inner join ProductCategories c on p.CategoryId = c.CategoryIdwhere c.CategoryId = 1; 

变成这样:

 SELECT p.ProductId, p.Name, c.CategoryId, c.Name AS Category FROM ProductCategories c LEFT OUTER JOIN Products P ON c.CategoryId = p.CategoryId WHERE c.CategoryId = 1; 

这不一定会在小型查询中发挥巨大的性能,但是当表格变大时,效率会更高。

我对SQL服务器知之甚less,但在Oracle的情况下,有一个外键列会降低数据加载的性能。 这是因为数据库需要检查每个插入的数据完整性。 是的,正如已经提到的那样,有一个关于外键列的索引是一个好的做法。

在表中添加一个外键不会提高性能,只是说如果你在一个ProductCategories表中插入一条logging的数据库,就会试图find这个外键列中存在的一个值,这个值存在于一个产品表的主键值中,每次在ProductCategories表中添加一个新条目时,操作都会在数据库上开销。 所以通过添加一个外键不会提高你的数据库性能,但是它会关心你的数据库的完整性。 是的,如果使用外键检查完整性,而不是运行许多查询来检查程序中的数据库中是否存在logging,那么它会提高db的性能。

从SQL Server 2008起,外键可以通过影响数据库引擎select优化查询的方式来影响性能。 请参阅下面的文章中的Starjoin启发式: https : //technet.microsoft.com/en-us/library/2008.04.dwperformance.aspx