2015-10-05 63 views
1

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

这是我们必须的主要思想,但我敢丢了怎么继续下去,是否有可能增加一个条款,停止查询时超越的门槛。

回答

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;