在PostgreSQL中应用where之前获取结果计数

时间:2014-12-10 15:45:06

标签: postgresql count

我遵循了这个post,更确切地说是answer,以便能够在应用LIMIT和OFFSET之前从PostgreSQL查询中获取行数。

因此使用这种代码:

SELECT foo
      ,count(*) OVER() AS filtered_count
FROM   bar
WHERE  <some condition>
ORDER  BY <some col>
LIMIT  <pagesize>
OFFSET <offset>

我获得了适合WHERE子句的每一行的计数。

这很酷,我想知道在制作WHERE之前是否有类似的方法来获得完整的行数?

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

我会说不。不是你想要的方式。

你所建议的是在同一个查询中基本上有2个不同的WHERES并且没有意义。

我会首先得到所有数据并在之后应用WHERE。这样,您只需一个查询,就可以在WHERE之后应用count(*)

-- Option 1
SELECT *
FROM
(
    SELECT *
          ,count(*) OVER() AS filtered_count
    FROM bar
) baz
WHERE  <some condition>

修改

如果您只想要完整 bar 表的计数(*),那么性能可能会更好:

-- Option 2
SELECT *, (SELECT count(*) FROM bar)
FROM bar
WHERE  <some condition>

bar = table w / 500000行,成本为436(ANALYZE命令):

  

选项1: 1541 选项2: 1326

bar =复杂查询,费用为7477:

  

选项1: 7691 选项2: 15005

出于两个原因,我会一直选择选项1 。首先,与整个操作的成本相比,我们在第一种情况下获得的加速是可忽略的。第二,因为选项1 ,您只需要指定一次