2013-09-24 25 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);