postgresql - 为什么 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
条件的情况下连接两个大表总是很慢,并且可能会产生很大的结果集。