在PostgreSQL中执行MAX(id)聚合的提高查询速度的最佳方法是什么?
我有一个与id相关的适度记录数,我可以在一秒内COUNT(),例如
select count(id) as cnt from mytable where ref_id=2660
row cnt
1 2844
但是,当我尝试使用MAX()查找最新的记录ID时,查询需要将近5分钟。
select max(id) as id from mytable where ref_id=2660
这是令人惊讶的,因为我已经发现PG出乎意料地快得多,查询复杂得多。为什么查询时间会有这么大的差异,特别是对于这么少的记录?什么是改善这种表现的最佳方法?
编辑:这是上面MAX()选择的查询计划:
"Result (cost=219.84..219.85 rows=1 width=0)"
" InitPlan 1 (returns $0)"
" -> Limit (cost=0.00..219.84 rows=1 width=4)"
" -> Index Scan Backward using mytable_pkey on mytable (cost=0.00..773828.42 rows=3520 width=4)"
" Filter: ((id IS NOT NULL) AND (ref_id = 2660))"
答案 0 :(得分:3)
我google了一下,看起来像PostgreSQL(最多8.4)不喜欢MAX
和MIN
,它会对表进行连续扫描以获得结果。如果没有查询计划和版本,很难说这是你的情况。
您可以尝试此解决方法。
SELECT id from mytable WHERE ref_id=2660 ORDER BY id DESC LIMIT 1
编辑:确保你有一个索引(ref_id,id),否则表扫描/排序是不可避免的。
答案 1 :(得分:0)
我正在使用Postgres 8.4并且可以说Postgres优化器中的错误可能是不使用索引来包含最小和最大聚合函数。
从更改我的查询后
从表格中选择最大(字段)到
按字段限制1从表格顺序中选择字段
我的查询执行时间从10秒提高到不到1秒。
当然,您可以为相关列定义和索引,否则postgres将执行seq_scan。