一位同事声称他过去使用外键来优化查询。我认为仅在插入或更新表中的数据时才使用外键。我不知道如何使用它们来加速搜索。
创建执行计划时外键如何帮助?我错过了什么吗?如果是这样,那么它在什么情况下会有所帮助?
(我们使用PostgreSQL,我没有多少经验。它有可能与Oracle或MySQL的行为不同吗?)
答案 0 :(得分:5)
是的,外键肯定可以提高查询的性能,但这取决于您使用的数据库以及这些密钥是否“强制执行”。
在具有外键的Oracle和SQL Server中,当读取/加入外键上的多个表时,可以提高性能
为什么呢?拥有已检查/验证的外键可为查询优化器提供有关2个表的关系的额外信息。
知道,当子表内部连接到父表时:
这有助于查询优化器估计要处理的行。对于大多数(如果不是全部)查询优化器而言,这种正确的估计非常重要。
证明这个一般事实可以通过最近以元数据的形式向Hadoop Hive添加外键来看到。此添加的目的是帮助CBO(基于成本的优化程序),this Hive Jira entry解释...
此外,在使用事实表时,在外键上使用(位图)索引还可以提高Oracle的性能: '应在事实表或表'的每个外键列上构建位图索引。 请参阅following链接...
外键,出于显而易见的原因,在插入/更新数据时花费你是额外的:数据库必须完成额外的工作与没有fk的
您可以通过调查解释计划在SQL服务器(例如)中轻松查看此内容。
我不知道Postgresql,但我验证FK效果的方法是查看解释计划。启用/禁用/删除FK时,它们是否有区别?
[编辑] 我实际上发现 this证明 FK可以在Postgresql中启用读取性能,但原因有所不同: BECAUSE FK已启用,示例中的查询可以改为更高效。
答案 1 :(得分:0)
主键和唯一约束创建相应的INDEX。但不是FK约束:
外键约束的声明不会自动创建 引用列的索引。
https://www.postgresql.org/docs/current/static/ddl-constraints.html
所以你是对的。但通常在FK
上有一个索引是个好主意