优化加入GreenPlum

Posted

技术标签:

【中文标题】优化加入GreenPlum【英文标题】:Optimize Join GreenPlum 【发布时间】:2021-10-25 22:45:28 【问题描述】:

我的表 A 有 2000 万条记录。表 B 有 200,000 条记录。 我想做一个像这样的连接:

select *
from tableA a 
left join tableB b
on ((a.name1 = b.name1 OR a.name1 = b.name2) OR a.id = b.id)
and a.time > b.time
;

这非常耗时。 我正在使用 GreenPlum,所以我不能使用索引。 我该如何优化呢? 表 B 中的行数是递增的,并且会增加。

【问题讨论】:

I am using GreenPlum so I cannot make use of indexes. 如果这是真的,你真的应该放弃 Greenplum。 【参考方案1】:

Greenplum 确实支持索引。但是,此查询很棘手,因为您的分布列是什么无关紧要,由于以下原因,无法共同定位连接。

    a.time 或 b.time 不适合分发,因为它是 ">" 运算符 您可以按 (name1, id) 分配 tableA,按 (name1, name2, id) 分配 tableB。但是要查看 a.time > b.time 是否满足,您仍然需要查看所有元组。

恐怕这个查询对 MPP 非常友好。

【讨论】:

您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。

以上是关于优化加入GreenPlum的主要内容,如果未能解决你的问题,请参考以下文章

优化查询:在自身上加入表

我如何在没有加入的情况下优化这个存储过程

条件连接 | SQL |优化性能并减少数量。加入数

RethinkDB - 优化执行地理定位、然后加入、然后分组的查询

Oracle 优化——奇怪的执行计划左加入一个不相关的子查询

使用奇怪的查询优化器行为加入 SQL Server 中的视图