超过阈值时查询执行停止
query execution stops when overtake a threshold
我正在对 j2ee 页面进行优化。在页面的一部分,有一些框可以应用一些过滤器来生成不同类型的报告。之后,我们显示一个包含所有结果的 table,但有时根据所选的过滤器,有大量数据需要绘制,我们正在考虑将其直接导出到 Excel 文件。
我们有一个查询来计算我们拥有的大纲数量。但该查询可能需要一些时间,具体取决于所选的过滤器。我们已经决定设置一个阈值来决定何时在网页中绘制结果或何时在 excel 文件中绘制结果。但是我们想加速 de 'count query' 以仅知道最终计数是高于还是低于阈值,我们不需要仅在高于或低于阈值时才知道确切的行数,但我们需要尽可能快的查询尽可能。
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;**
这是我们的主要想法,但我很迷茫如何继续以及是否可以添加一个子句以在超过阈值时停止查询。
您似乎是在尝试估计计数而不是实际计算计数,对吗?
有一篇有趣的文章解释了如何做到这一点。
它指出它比自己执行查询快得多,因此它可能正是您所需要的:
https://wiki.postgresql.org/wiki/Count_estimate
基本上,您可以查询目录 table 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;
我正在对 j2ee 页面进行优化。在页面的一部分,有一些框可以应用一些过滤器来生成不同类型的报告。之后,我们显示一个包含所有结果的 table,但有时根据所选的过滤器,有大量数据需要绘制,我们正在考虑将其直接导出到 Excel 文件。
我们有一个查询来计算我们拥有的大纲数量。但该查询可能需要一些时间,具体取决于所选的过滤器。我们已经决定设置一个阈值来决定何时在网页中绘制结果或何时在 excel 文件中绘制结果。但是我们想加速 de 'count query' 以仅知道最终计数是高于还是低于阈值,我们不需要仅在高于或低于阈值时才知道确切的行数,但我们需要尽可能快的查询尽可能。
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;**
这是我们的主要想法,但我很迷茫如何继续以及是否可以添加一个子句以在超过阈值时停止查询。
您似乎是在尝试估计计数而不是实际计算计数,对吗?
有一篇有趣的文章解释了如何做到这一点。 它指出它比自己执行查询快得多,因此它可能正是您所需要的: https://wiki.postgresql.org/wiki/Count_estimate
基本上,您可以查询目录 table 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;