2

PostgreSQL 9.2 用に最適化しようとしているクエリがあります。

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

実行するには永遠に時間がかかるので、次のように書き換えることができると考えました

select id from tbl order by id desc limit 1

ただし0、テーブルに行がない場合は返す必要があります。case ステートメントの組み合わせをいくつか試しましたが、うまくいかないようです。助言がありますか?

空のテーブルを計画します。

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

コストは 1,190,000 行のテーブルで 58k ですが、実行プランは同じです。

4

2 に答える 2

4

ただし、テーブルに行がない場合は 0 を返す必要があります

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

COALESCE()行が返されないため、この特別な種類の (行なし) のデフォルトを提供するために単純に使用することはできませんNULL。サブクエリに入れます。
細かい点: これは0、 の既存のすべての行が をtbl持っている場合にも返されますid IS NULL

パフォーマンスの鍵は、列の一意のインデックス、またはプレーンな B ツリー インデックスを介して実装される、プライマリ (または一意の) キー制約である可能性があるインデックスです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 に答える