超过阈值时查询执行停止

时间:2015-10-05 22:17:45

标签: sql postgresql query-optimization

我正在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;**

这是我们的主要想法,但我很遗憾如何继续,如果有可能在超过阈值时添加一个句子来停止查询。

1 个答案:

答案 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;