sql - 无需进行两次查询即可限制 COUNT 聚合窗口函数的方法
问题描述
我们经常使用 COUNT 聚合窗口函数来返回查询将匹配的总行数,以便为最终用户提供轻松的分页。例子:
SELECT *, COUNT(*) OVER () total
FROM table
WHERE <condition>
LIMIT 20
OFFSET 0;
这对于我们的大多数表都非常有效,实际上总数不会超过几百行,因此对性能的影响可以忽略不计。
我们想做的是LIMIT
计数到 10,000 并在达到 10,000 时停止计数。这是因为一些资源可能会无限增长,并且总数可能是 1M+ 行,这对于计算来说是非常昂贵的。
一种天真的方法是发出两次查询,应用限制为 10,000 并计算这些结果:
SELECT COUNT(*)
FROM (
SELECT *
FROM table
WHERE <condition>
LIMIT 10000
OFFSET 0
) q;
我已经尝试过窗框并做类似的事情
ROWS BETWEEN 1 FOLLOWING AND 10000 FOLLOWING
这实际上返回了正确的东西,然而,EXPLAIN ANALYZE
证明它比获得最终计数更昂贵的执行时间(当10000
数字较小时它会更少)!
谁能想到一种方法(在单个查询中)使total
最大值达到 10k 并有效地停止有效计数?
谢谢!
解决方案
推荐阅读
- shell - 无法在 JupyterLab 中导出 PATH
- html - XHTML2FO.xsl 在转换为 PDF 时为嵌套的 html 表格标签提供错误
- java - 如何返回包含 xs 和 ys 的所有点的列表。在java中使用流时?
- vb.net - 我怎样才能让计时器越来越慢,直到它停止?
- pytorch - PyTorch Geometric 如何输入一个样本而不是小批量?
- inheritance - 部分定义函数的名称“如果存在”,可以继承的“像抽象”是什么?
- r - tf_idf 单词和结果矩阵之间的不匹配
- javascript - 将变量从Flask传递给JavaScript而不刷新页面?
- postgresql - 这个查询可以进一步优化吗?即使在较差的硬件上也可以使其快速运行吗?
- c# - Cefsharp WPF C# Count not Find File(s) after cleaning solution