向索引列添加外键是否会提高性能?

时间:2016-09-08 10:46:22

标签: postgresql indexing foreign-keys query-optimization

一位同事声称他过去使用外键来优化查询。我认为仅在插入或更新表中的数据时才使用外键。我不知道如何使用它们来加速搜索。

创建执行计划时外键如何帮助?我错过了什么吗?如果是这样,那么它在什么情况下会有所帮助?

(我们使用PostgreSQL,我没有多少经验。它有可能与Oracle或MySQL的行为不同吗?)

2 个答案:

答案 0 :(得分:5)

是的,外键肯定可以提高查询的性能,但这取决于您使用的数据库以及这些密钥是否“强制执行”。

在具有外键的Oracle和SQL Server中,当读取/加入外键上的多个表时,可以提高性能

为什么呢?拥有已检查/验证的外键可为查询优化器提供有关2个表的关系的额外信息。

知道,当子表内部连接到父表时:

  1. 父表具有与子表相同的记录数量
  2. 子项中的所有键都存在于父
  3. 这有助于查询优化器估计要处理的行。对于大多数(如果不是全部)查询优化器而言,这种正确的估计非常重要。

    证明这个一般事实可以通过最近以元数据的形式向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

上有一个索引是个好主意