2015-10-05 64 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;