我正在j2ee页面进行优化。在页面的一部分中,有一些框用于应用一些过滤器来生成不同类型的报告。之后我们会显示一个包含所有结果的表格,但有时根据所选的过滤器,需要绘制大量数据,我们正在考虑将其直接导出到Excel文件中。
我们有一个查询,用于计算我们拥有的大纲数量。但该查询可能需要一些时间,具体取决于所选的过滤器。我们决定设置一个阈值来决定何时在网页中绘制结果或在excel文件中绘制时。但是我们想要加速“计数查询”以仅知道最终计数是高于还是低于阈值,我们不需要知道确切的行数,只要它在上面或下面但是我们需要查询的速度和可能的。
SELECT
COUNT(*) count
FROM
TABLE_X
INNER JOIN TABLE_Y ON X.a = Y.a
WHERE
X
AND Y
GROUP BY
X, Y
**Having
COUNT(*) > THRESHOLD;**
这是我们的主要想法,但我很遗憾如何继续,如果有可能在超过阈值时添加一个句子来停止查询。
答案 0 :(得分:2)
看起来你正在试图估计计数而不是实际计算它,对吗?
有一篇有趣的文章解释了如何做到这一点。 它声明它比自己执行查询要快得多,因此它可能正是您所需要的: https://wiki.postgresql.org/wiki/Count_estimate
基本上,您的想法是查询目录表pg_class
:
SELECT reltuples FROM pg_class WHERE relname = 'tbl';
或者,如果您有更复杂的查询:
SELECT count_estimate('SELECT * FROM tbl WHERE t < 100');
其中count_estimate
是分析执行计划以获得估算的函数:
CREATE FUNCTION count_estimate(query text) RETURNS INTEGER AS
$func$
DECLARE
rec record;
ROWS INTEGER;
BEGIN
FOR rec IN EXECUTE 'EXPLAIN ' || query LOOP
ROWS := SUBSTRING(rec."QUERY PLAN" FROM ' rows=([[:digit:]]+)');
EXIT WHEN ROWS IS NOT NULL;
END LOOP;
RETURN ROWS;
END
$func$ LANGUAGE plpgsql;