Pure SQL
自 2008 年以来情况发生了变化。您可以使用窗函数得到完整的计数and一次查询的结果有限。介绍与2009 年 PostgreSQL 8.4.
SELECT foo
, count(*) OVER() AS full_count
FROM bar
WHERE <some condition>
ORDER BY <some col>
LIMIT <pagesize>
OFFSET <offset>;
请注意,这可能比没有总数的情况下贵得多。必须对所有行进行计数,并且仅从匹配索引中获取顶部行的可能快捷方式可能不再有帮助。
对于小桌子或小桌子来说并不重要full_count
<= OFFSET
+ LIMIT
。对于更大的事情来说full_count
.
角箱: when OFFSET
至少与基本查询的行数一样大,no row被返回。所以你也得不到full_count
。可能的替代方案:
- 使用 LIMIT/OFFSET 运行查询并获取总行数
事件的顺序SELECT
query
( 0. CTE 是单独评估和具体化的。在 Postgres 12 或更高版本中,规划者可以在开始工作之前内联子查询之类的内容。)这里不。
-
WHERE
条款(和JOIN
条件(尽管您的示例中没有)从基表中过滤符合条件的行。其余的基于过滤后的子集。
( 2. GROUP BY
聚合函数将放在这里。)不在这里。
( 3. 其他SELECT
列表表达式是根据分组/聚合列求值的。)这里不。
-
窗口函数的应用取决于OVER
子句和函数的框架规范。简单的count(*) OVER()
基于所有符合条件的行。
-
ORDER BY
( 6. DISTINCT
or DISTINCT ON
会去这里。)不在这里。
-
LIMIT
/ OFFSET
根据既定顺序应用以选择要返回的行。
LIMIT
/ OFFSET
随着表中行数的增加,效率变得越来越低。如果您需要更好的性能,请考虑替代方法:
获得最终计数的替代方案
有完全不同的方法来获取受影响的行数(not之前的完整计数OFFSET
& LIMIT
被应用)。 Postgres 有内部簿记有多少行受到最后一个 SQL 命令的影响。某些客户端可以访问该信息或自行计算行数(例如 psql)。
例如,您可以检索受影响的行数plpgsql执行 SQL 命令后立即:
GET DIAGNOSTICS integer_var = ROW_COUNT;
手册中有详细说明。
或者你可以使用pg_num_rows in PHP。或者其他客户端中的类似功能。
Related: