【问题标题】:Fast approximate counting in PostgresPostgres 中的快速近似计数
【发布时间】:2012-11-22 10:15:26
【问题描述】:

我正在使用以下内容查询我的数据库(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%');

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

关于如何以有效的方式扩展它以涵盖所有三种情况的任何想法?

【问题讨论】:

  • 感谢提供版本,但实际上并没有任何 "8.x" 。 8.1 和 8.4 之间的差异是巨大的。见postgresql.org/support/versioning
  • 我没有意识到版本号的第二部分表示主要版本。帖子已更新。
  • 是的……我不喜欢这个版本控制方案,但是改变它有很多阻力。

标签: sql postgresql


【解决方案1】:
SELECT COUNT(*) FROM (
  SELECT * FROM table WHERE indexed_varchar LIKE 'bar%' LIMIT 2
) t;

【讨论】:

    【解决方案2】:

    应该很简单。您可以使用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-13
      • 1970-01-01
      • 1970-01-01
      • 2011-06-22
      • 1970-01-01
      • 1970-01-01
      • 2011-06-29
      • 2015-05-24
      • 1970-01-01
      相关资源
      最近更新 更多