我遵循了这个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之前是否有类似的方法来获得完整的行数?
提前感谢您的帮助!
答案 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 ,您只需要指定一次