2

我有一个要针对 PostgreSQL 9.2 优化的查询:

select coalesce(max(id),0) as m from tbl

它需要永远运行,所以我想我可以将它重写为

select id from tbl order by id desc limit 1

0除非表中没有行,否则它需要返回。我尝试了一些案例陈述的组合,但它们似乎不起作用。有什么建议么?

计划一个空表:

Aggregate (cost=11.25..11.26 rows=1 width=4)
 -> Seq Scan on tbl (cost=0.00..11.00 rows=100 width=4)

成本为 58k,表有 1,190,000 行,但执行计划相同。

4

2 回答 2

4

除非如果表中没有行,则需要返回 0

SELECT COALESCE((SELECT max(id) FROM tbl), 0)

由于没有返回行,因此您不能简单地使用COALESCE()为这种特殊类型NULL(无行)提供默认值。把它放在一个子查询中。
要点:0如果所有现有行tblhave ,这也会返回id IS NULL

性能的关键是可能是主(或唯一)键约束的索引,它通过列上的唯一索引或任何普通的 b-tree 索引来实现tbl.id

CREATE index foo on tbl(id)

密切相关的问题:
如何在查询中找不到匹配项时显示默认值?

于 2013-01-14T02:07:58.750 回答
0

也许是这样:

select
    case
        when (select id from tbl limit 1) is null then 0
        else (select id from tbl order by id desc limit 1)
    end;
于 2013-01-13T19:11:12.923 回答