优化 PostgreSql 查询以获取找到的记录总数和基于多个 group by 的分页所需的有限行数

Posted

技术标签:

【中文标题】优化 PostgreSql 查询以获取找到的记录总数和基于多个 group by 的分页所需的有限行数【英文标题】:Optimising PostgreSql query to fetch the total number of records found and required limited number of rows for pagination based on multiple group by's 【发布时间】:2013-09-30 13:48:57 【问题描述】:

我有这个查询,我试图根据给定的过滤器获取记录总数,并尝试在单个查询中获取分页所需的有限数量的数据。 早些时候,我在一个两步过程中执行此操作,我首先根据 Optimising Select number of rows in PostgreSql for multiple group by fields 然后根据页面大小和所需的偏移量在不同的查询中获得所需的行数

EXPLAIN select count (1) OVER () AS numrows , lower(column1) as column1, column2, column3, column4, column5, column6, column7, column8, sum(column9) as column9, sum(column10) as column10 
from tableName tablename 
where 
    column8 in (SOME 50-100 sets) 
    and column_date >= '2013-09-01' 
    and column_date < '2013-09-30' 
    group by lower(column1), column2, column3, column4, column5, column6, column7, column8 
    ORDER BY column9 desc 
    LIMIT 1000 OFFSET 0

XN Limit  (cost=1000134721702.61..1000134721702.63 rows=1000 width=67)
  ->  XN Merge  (cost=1000134721702.61..1000135118514.84 rows=158724893 width=67)
        Merge Key: sum(column9)
        ->  XN Network  (cost=1000134721702.61..1000135118514.84 rows=158724893 width=67)
              Send to leader
              ->  XN Sort  (cost=1000134721702.61..1000135118514.84 rows=158724893 width=67)
                    Sort Key: sum(column9)
                    ->  XN Window  (cost=107149638.61..113101822.10 rows=158724893 width=67)
                          ->  XN Network  (cost=107149638.61..108340075.31 rows=158724893 width=67)
                                Send to slice 0
                                ->  XN HashAggregate  (cost=107149638.61..108340075.31 rows=158724893 width=67)
                                      ->  XN Seq Scan on tableName tablename  (cost=0.00..67468415.44 rows=1587248927 width=67)
                                            Filter: ((column_date < '2013-09-30'::date) AND (column_date >= '2013-09-01'::date) AND (column8 = ANY ('SOME 50-100 sets'::integer[])))

版本详情

PostgreSQL 8.0.2 on i686-pc-linux-gnu, compiled by GCC gcc (GCC) 3.4.2 20041017 (Red Hat 3.4.2-6.fc3), Redshift 1.0.666 

谢谢

【问题讨论】:

旁注:您需要将您的 postgres 至少升级到 8.4 。 8.2 已过时且不受支持。 @IgorRomanchenko:他/她一定已经在使用 8.4,因为以前的版本中没有窗口函数。 您确定您使用的是 Postgres 吗?解释计划似乎表明您正在使用一些 Postgres 分支。 @a_horse_with_no_name 它是 Postgresql 8.2 从解释输出来看,数据库是基于 postgresql 8.0.2 但heavily modified的amazon redshift 【参考方案1】:

Redshift 未针对分页记录返回进行优化。它旨在最大限度地提高涉及许多记录但仅返回少量输出的分析查询的性能。

如果您打算对结果进行分页,我强烈建议您先将 SELECT 的输出发送到临时表。然后,您可以对该表执行一个简单(且快速!)的 COUNT(*) 并对它进行分页,而无需强制重新执行查询。

【讨论】:

以上是关于优化 PostgreSql 查询以获取找到的记录总数和基于多个 group by 的分页所需的有限行数的主要内容,如果未能解决你的问题,请参考以下文章

优化查询以获取日志表中每个人的最新记录

在日志表上按顺序使用多个连接优化 MySQL 查询以找到最大差异(最佳记录)

优化查询以从不同的表中获取唯一(用户)记录

查询返回语句 - PostgreSQL

在同一查询中选择和更新 PostgreSQL 以进行优化

Postgresql 遍历一个数组字段并将记录用于另一个查询