4

次のような方法でデータベース (Postgres 8.4) にクエリを実行しています。

SELECT COUNT(*) FROM table WHERE indexed_varchar LIKE 'bar%';

Postgres は各行をカウントする必要があるため、これの複雑さは O(N) です。Postgres 9.2 にはインデックスのみのスキャンがありますが、残念ながらアップグレードはオプションではありません。

ただし、次の 3 つのケースのどれが true かを知る必要があるだけなので、正確な行数を取得するのはやり過ぎのように思えます。

  • クエリは行を返しません。
  • クエリは 1 行を返します。
  • クエリは 2 つ以上の行を返します。

したがって、クエリが 10,421 行を返すことを知る必要はありません。2 つ以上の行が返されるだけです。

最初の 2 つのケースを処理する方法を知っています。

SELECT EXISTS (SELECT COUNT(*) FROM table WHERE indexed_varchar LIKE 'bar%');

1 つ以上の行が存在し、false が存在しない場合は true を返します。

効率的な方法で 3 つのケースすべてを網羅するようにこれを拡張する方法についてのアイデアはありますか?

4

2 に答える 2

6
SELECT COUNT(*) FROM (
  SELECT * FROM table WHERE indexed_varchar LIKE 'bar%' LIMIT 2
) t;
于 2012-11-20T17:16:13.703 に答える
1

シンプルであるべきです。ステートメントを使用LIMITして、必要なことを実行し、データ (カウント) を返すために使用できます。CASE

SELECT CASE WHEN c = 2 THEN 'more than one' ELSE CAST(c AS TEXT) END 
FROM 
     (
      SELECT COUNT(*) AS c 
      FROM   (
              SELECT 1 AS c FROM table WHERE indexed_varchar LIKE 'bar%' LIMIT 2
             ) t
     ) v
于 2012-11-20T17:19:51.693 に答える