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

Mar*_*rey 2 postgresql indexing foreign-keys query-optimization

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

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

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

Rog*_*ull 5

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

在Oracle和SQL Server中,使用外键肯定可以读取/连接外键上的多个表时提高性能

为什么?具有经检查/验证的外键为查询优化器提供关于2个表具有的关系的额外信息.

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

  1. 子表相比,父表具有相同数量的记录或更少的记录.
  2. 项中的所有键都存在于父项中.

这有助于查询优化器估计要处理的行.对于大多数(如果不是全部)查询优化器而言,这种正确的估计非常重要.

最近在Hadoop Hive中以元数据的形式添加了外键,可以看出这个一般事实的证据.这个增加的目标是帮助CBO(基于成本的优化器),这个Hive Jira条目解释了......

此外,在使用事实表时,在外键上使用(位图)索引还可以提高Oracle的性能: '应在事实表或表的每个外键列上构建位图索引.请参阅以下链接...

外键在显而易见的原因下会在插入/更新数据时花费额外的费用:与没有fk的数据库相比,数据库必须完成额外的工作

您可以通过调查Explain计划在SQL服务器(例如)中轻松地看到这一点.

我不知道Postgresql,但我验证FK效果的方法是查看解释计划.启用/禁用/删除FK时它们是否不同?

[编辑]我实际上发现了这个证据,证明 FK可以在Postgresql中启用读取性能,但原因有所不同:因为启用了FK,示例中的查询可以更改为更高性能.