Postgres缓慢的位图堆扫描

时间:2014-01-11 19:06:28

标签: postgresql

我有messages phones个表,大约有6M行。这个查询性能非常差

SELECT t1.id, t2.number, t1.name, t1.gender
        FROM messages t1
        INNER JOIN phones t2 ON t2.id = t1.parent_id
        INNER JOIN regions t6 ON t6.id = t1.region_id
        WHERE t2.number IS NOT NULL AND t1.entity AND NOT t2.type AND t1.region_id = 50
        ORDER BY t1.id LIMIT 100

EXPLAIN ANALYZE结果:http://explain.depesz.com/s/Pd6D

Btree索引所有列中的条件。所有id列上的主键,messages上的parent_id表中的外键以及region_id。所有桌子上的真空也都运行了。

但仅仅100行超过15秒就太慢了。有什么问题?

Postgres 9.3,ubuntu 13.10,cpu 2x 2.5Ghz,4gb ram,pg config http://pastebin.com/mPVH1YJi

1 个答案:

答案 0 :(得分:0)

这完全取决于您的读取与写入负载,但一种解决方案可能是为最常见/一般情况创建复合索引。

例如,将堆扫描转换为索引扫描的BTREE(parent_id,region_id)将是巨大的。由于您有动态查询,因此其他查询可能需要一些复合索引的其他组合,但我建议现在只在复合索引中使用两列(因为每个查询都不同)。请注意,当只需要parent_id时,也可以扫描BTREE(parent_id,region_id),因此也不需要携带BTREE(parent_id)索引。