首页 > 解决方案 > 为什么 postgres 不使用外键索引?

问题描述

为什么 postgres 拒绝使用外键?这是我的查询,连接在外键上。

EXPLAIN
SELECT *
FROM listings_searchresult
         JOIN listings_searchquery ON listings_searchresult.search_query_id = listings_searchquery.id
  Hash Cond: (listings_searchresult.search_query_id = listings_searchquery.id)
  ->  Seq Scan on listings_searchresult  (cost=0.00..4898345.08 rows=83607008 width=1129)
  ->  Hash  (cost=570499.88..570499.88 rows=20226788 width=109)
        ->  Seq Scan on listings_searchquery  (cost=0.00..570499.88 rows=20226788 width=109)

为什么 postgres 不使用外键?我删除它并重新读取它以防它被损坏,仍然无法正常工作。我可以以某种方式强制 postgres 使用它吗?

标签: postgresqlindexingforeign-keys

解决方案


除非其中一个表非常小,否则读取整个表是处理此类查询的最有效技术。

使用嵌套循环连接,这是您所设想的,PostgreSQL 将不得不扫描listings_searchresult2000 万次索引。

使用哈希连接,PostgreSQL 从较小的表在内存中构建一个哈希表,并为较大的表中的每一行探测该哈希表,这将执行得更好。

在没有附加WHERE条件的情况下连接两个大表总是很慢,并且可能会产生很大的结果集。


推荐阅读