2017-08-29 42 views
1

我遇到了計數查詢的麻煩,它太慢了。然後我發現一篇文章談論PostgreSQL上的Count Estimate。它使用了以下功能來估計行的量:PostgreSQL的計數估計

CREATE OR REPLACE FUNCTION public.count_estimate(query text) 
    RETURNS integer AS 
$BODY$ 
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 
$BODY$ 
    LANGUAGE plpgsql VOLATILE 
    COST 100; 
ALTER FUNCTION public.count_estimate(text) 

我用它像這樣:

SELECT count_estimate('SELECT * FROM table'); 

我傳遞給函數查詢接受條件(=,>,<,LIKE ,似乎...),但是當我嘗試使用這個特定的條件~它會返回一個錯誤的計數。

有無論如何去適應此功能,使其在where子句中與~一起使用?

謝謝

+0

你是什麼意思與「返回一個錯誤的計數」?你是否知道執行計劃返回**估計**?優化器沒有足夠的信息來正確表示正則表達式匹配的數量。在執行計劃中使用正則表達式匹配,你無法靠近現實。 –

+0

我知道它會返回一個估計值,但在這種情況下,它只返回3行,實際數量爲800行。就像你在使用正則表達式時所說的,我並沒有接近現實。 :( – Andre

+1

對此你沒有辦法做到,Postgres沒有存儲足夠的統計數據能夠給你一個更好的估計。 –

回答

1

https://www.postgresql.org/docs/current/static/sql-explain.html

https://www.postgresql.org/docs/current/static/using-explain.html

使用的功能,只是運行EXPLAIN並解析輸出,顯示行的預期數量。 「適應」函數以在此顯示更好的結果的唯一方法是在EXPLAIN之後添加ANALYZE以獲取「實際」行。但是,當然這會花費你實際執行的查詢作爲參數傳遞,所以在運行實際查詢之前估計計數是沒有意義的,如果在實際運行之後進行估計的話。