2013-09-24 51 views
1

我有這個查詢來獲取給定過濾器的行數,由於db太大而需要很長時間才能得到結果,有沒有什麼辦法可以優化它我使用PostgreSQL 8.2優化在PostgreSql中爲多個分組按字段選擇行數

SELECT COUNT(1) as numrows from (select lower(column1) as column1, column2, column3, column4, sum(column5) as column5, sum(column6) as column6 
    from table_name tablename 
    where column_date >= 'SOME DATE' and column_date < 'SOME DATE' 
    group by lower(column1) as column1, column2, column3, column4 ORDER BY column5 desc) allRows 

這裏是我得到EXPLAIN查詢

XN Aggregate (cost=849751.05..849751.05 rows=1 width=0) 
    -> XN Subquery Scan allrows (cost=805802.05..842426.22 rows=2929933 width=0) 
     -> XN HashAggregate (cost=805802.05..813126.89 rows=2929933 width=26) 
       -> XN Seq Scan on table_name tablename (cost=0.00..512808.79 rows=29299326 width=26) 
        Filter: ((column_date < 'SOME DATE'::date) AND (column_date >= 'SOME DATE'::date)) 
+0

顯示我們從EXPLAIN分析輸出。 – zero323

+1

另外(1),sum()調用和「order by」的原因是什麼? (2)你爲什麼使用大約兩年前達到報廢時間的版本? http://www.postgresql.org/support/versioning/ –

回答

1

優化性能的最好辦法是升級到PostgreSQL的當前版本,@Richard already commented。 8.2已經很久沒有被遺忘,幾乎無法跟上。這也是一個安全風險。

此外,擺脫sum()計算和ORDER BY,因爲既沒有貢獻的結果。其實,整個SELECT名單是沒有用的。

SELECT COUNT(*) AS numrows 
FROM (
    SELECT 1 
    FROM table_name 
    WHERE column_date >= 'SOME DATE' 
    AND column_date < 'SOME DATE' 
    GROUP BY lower(column1), column2, column3, column4 
    ) sub 

除此之外,您的EXPLAIN輸出表明你缺乏一個指數,如:

CREATE INDEX table_name_column_date_idx ON table_name(column_date);