优化加入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的主要内容,如果未能解决你的问题,请参考以下文章
RethinkDB - 优化执行地理定位、然后加入、然后分组的查询