Postgres中的快速近似计数

时间:2012-11-20 17:05:45

标签: sql postgresql

我正在使用以下内容查询我的数据库(Postgres 8.4):

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

这是O(N)的复杂性,因为Postgres必须计算每一行。 Postgres 9.2具有仅索引扫描,但遗憾的是升级不是一种选择。

然而,获得精确的行数似乎有些过分,因为我只需要知道以下三种情况中的哪一种是真的:

  • 查询不返回任何行。
  • 查询返回一行。
  • 查询返回两行或更多行。

所以我不需要知道查询返回10,421行,只是返回两行以上。

我知道如何处理前两种情况:

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

如果存在一行或多行且false不存在,则返回true。

有关如何将此扩展到高效包含所有三种情况的任何想法?

2 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分: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