为什么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使用它吗?

解决方法

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

使用您设想的嵌套循环联接,PostgreSQL将必须扫描listings_searchresult上的索引2000万次。

PostgreSQL通过使用哈希联接来在较小的表中构建一个哈希表,并针对较大的表中的每一行探测该哈希表,这样会更好。

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

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...