为什么在postgresql 9.1中hashjoin缓慢?

我使用Postgresql 9.1将我的数据库从Postgresql 8.4转移到了新的服务器上。 数据库的大小是9.9GB数据目录位于ssd 60GB磁盘上。 而服务器有16GB内存和16个处理器内核。

但今天的平均负荷增长到70。

我计算出查询使用计划中的散列连接和我在16m执行的查询之一,但是当我设置enable_hashjoin =closures它在5m执行时,我设置enable_mergejoin =closures它成为使用嵌套循环,并在12ms执行。

为什么postgresql不使用最佳查询计划?

EXPLAIN ANALYZE结果粘贴到http://explain.depesz.com/s/764(with enable_hashjoin = on) http://explain.depesz.com/s/weY (使用嵌套循环)

因为它认为这将是一个更快的计划。

你有非常复杂的cu表连接。 Postgres无法预测这个连接会返回多less行,这是非常复杂的 – 它认为当它实际返回4时,它将返回超过1 600 000行。

试着简化你的查询 – 不要在连接中使用coalescecase ,也许单独的c.user_id=?c.expert_id=? 分为2个查询并将它们union all起来。 如果explain.depesz.com上的rows x列中有任何红色单元,那么查询的糟糕和良好的性能将是非常随机的。