我一直注意到Postgres(8.3)中简单聚合性能的一些问题。问题是,如果我有一个表(比如200M行),它是(customer_id,order_id)唯一的,那么查询select customer_id,max(order_id) from larger_table group by customer_id
比一个简单的Java / JDBC程序慢一个数量级。以下内容:
1)初始化一个空的HashMap customerMap(这将映射id - >最大订单大小) 2)执行“select_ customer_id,order_id from greater_table”,并获得流式结果集 3)迭代结果集,在每一行执行如下操作:
long id = resultSet.getLong("customer_id");
long order = resultSet.getLong("order_id");
if (!customerMap.containsKey(id))
customerMap.put(id,order);
else
customerMap.put(id,Math.max(order,customerMap.get(id)));
预计会有这种性能差异吗?我不应该想,因为我认为上面的内容与内部发生的情况非常接近。是否证明db有错误/错误调整?
答案 0 :(得分:6)
可能你的work_mem
设置太低了。我先检查一下。我最近被这个咬了。第二个最可能的问题是你错过了一个外键索引。
博览会如下。
通常,只要数据库性能看起来低于标准,就需要提出几个问题:
work_mem
设置开箱即用,我自己遇到了涉及GROUP BY
的情况,人为地选择了错误的计划,因为它根本不认为它有足够的工作记忆来对结果进行排序英寸在不检查查询计划的情况下,猜测PostgreSQL为给定查询选择的实现策略并不是一个好主意。