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