在 Greenplum 上分块执行查询

Posted

技术标签:

【中文标题】在 Greenplum 上分块执行查询【英文标题】:Executing query in chunks on Greenplum 【发布时间】:2013-07-18 14:32:51 【问题描述】:

我正在尝试创建一种将批量日期查询转换为增量查询的方法。例如,如果查询的 where 条件指定为

WHERE date > now()::date - interval '365 days' and date < now()::date

如果今天执行,这将获取一年的数据。现在,如果明天执行相同的查询,将再次获取 365 天的数据。但是,我已经拥有上一次运行的最后 364 天数据。我只想获取一天的数据并从系统中删除一天的数据,这样我就可以得到性能更好的 365 天数据。此数据将存储在单独的临时表中。

为了实现这一点,我创建了一个增量查询,它将在下次运行时执行。但是,当“日期”列不在 SELECT 子句中但在 WHERE 条件中出现时,删除单个日期数据被证明是棘手的,因为临时表架构将没有“日期”列。

所以我想到了以块的形式执行批量查询并为该块分配一个 ID。这样,我可以删除一个块并添加一个块,其他数据不受影响。

有没有办法在 postgres 或 greenplum 中实现相同的目标?就像一些内置功能一样。我浏览了整个文档,但找不到任何文档。

另外,如果没有,有没有更好的办法解决这个问题。

【问题讨论】:

【参考方案1】:

我认为这最好用聚合表之类的东西来处理(我认为问题是你有大量的聚合来处理大量数据)。这不一定会导致规范化问题(而且数据仓库通常会反规范化)。在这方面,您可以每天存储您需要的聚合数据,这样您就可以每天将封闭数据和非封闭数据减少到一条记录。保持聚合到无法更改的数据是避免规范化防止的正常插入/更新异常所必需的。

【讨论】:

以上是关于在 Greenplum 上分块执行查询的主要内容,如果未能解决你的问题,请参考以下文章

Greenplum 查询性能

数据库查询原来长这样!| Greenplum新功能—可视化执行计划

Greenplum问题:函数无法在段上执行,因为它访问关系

Greenplum优化--SQL调优篇

Greenplum 数据库 - Count Distinct Queries 缓慢的问题

在 OSX 上安装 Chorus 的 GreenPlum