当前位置:  开发笔记 > 数据库 > 正文

外键是否提高了查询性能?

如何解决《外键是否提高了查询性能?》经验,为你挑选了3个好方法。

假设我有2个表,Products和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;

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

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

我的问题是:

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

    我应该在所有表中的所有FK列(如Products.CategoryId)上创建索引吗?

cmsjr.. 181

外键是参照完整性工具,而不是性能工具.至少在SQL Server中,创建FK不会创建关联索引,您应该在所有FK字段上创建索引以改善查找时间.



1> cmsjr..:

外键是参照完整性工具,而不是性能工具.至少在SQL Server中,创建FK不会创建关联索引,您应该在所有FK字段上创建索引以改善查找时间.


好的模型(通常)表现更好.
这个答案几乎没用,因为它没有回答这个问题.很高兴知道外键不是*意图*对性能产生(正面)影响,但问题是关于现实,而不是意图.
+1:模型是一回事.表现是另一个.
"外键是一种关系完整性工具" - 请谨慎使用"关系"一词.外键是数据库概念,是参照完整性约束的简写.它们不是关系模型的一部分.我猜你弄错了.
外键*做*提高性能,至少在MySQL中.而且,你是对的,创建FK不会创建索引; 创建FK**需要**索引
@Kenny通常是的,但有时更好的模型会花费更多.例证:外键导致更多处理发生,而不是更少.

2> Lieven Keers..:

外键可以改善(和伤害)性能

    如上所述:外键可提升性能

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

编辑

由于链接现在似乎已经死了(克里斯注意到了),下面显示了为什么外键可以改善(和伤害)性能的要点.

外键可以提高性能

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

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


这是一个链接,详细说明了它们降低性能的方法http://www.devx.com/getHelpOn/10MinuteSolution/16595/0/page/2
这是有道理的,但你只会遇到一个大规模的删除声明.也许结论应该是在OLAP环境中,非索引FK会提高性能,而在OLTP环境中,它会降低性能.
Wayback Machine [链接](https://web.archive.org/web/20101219111457/http://www.microsoft.com/technet/abouttn/flash/tips/tips_122104.mspx)获胜!该文章也可以在SQLMag.com上找到,[这里](http://sqlmag.com/database-performance-tuning/foreign-key-constraints-without-nocheck-boost-performance-and-data-integ).

3> John Sansom..:

外键是用于确保数据库完整性的DBMS概念.

任何性能影响/改进都将特定于所使用的数据库技术,并且是外键的目的的次要因素.

SQL Server中的一个好习惯是确保所有外键至少具有非聚簇索引.

我希望这能为您解决问题,但请随时索取更多详细信息.


@Kenny Evitt如果你没有诚信,你的数据就没用了.我觉得很容易卖.
@Daniel Dinnyes,数据完整性与获取404错误无关.这是关于拥有可用数据.例如,由于开发人员的无能,它不会丢失报告的订单和财务数据.不使用外键没有EXCUSE.
性能比"数据库完整性"更容易出售.
我同意HLGEM.让代码处理完整性并不总是一个好主意.数据通常用于做出决策,但如果数据已损坏,则决策将不准确.
推荐阅读
乐韵答题
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有