如果查询如下所示,sql引擎将使用hashjoin:选择from table1 t1 left join table2 t2 on t1.id=t2.id;那很好。但如果查询是这样的:从t1.id>t2.id上的table1 t1 left join table2 t2中选择;怎么处理?nestedloop连接可以工作,但是有更好的方法吗?
5hcedyr01#
对于分布式sql,是一种直接的非相等连接( t1.id > t2.id )执行起来相当昂贵。如果一侧较小,则进行广播,然后在每个节点上使用排序索引。如果两边都很大,可以将一个区域分区并构建一个排序索引,然后将其他行复制到任何可能匹配的区域。通常,有相等和不相等连接的组合,比如 t1.id = t2.id and t1.cost < t2.cost . 在这种情况下,您可以执行一个正态分布散列联接,然后保留一个二级项的排序列表来执行非相等部分。普雷斯托就是这么做的。
t1.id > t2.id
t1.id = t2.id and t1.cost < t2.cost
1条答案
按热度按时间5hcedyr01#
对于分布式sql,是一种直接的非相等连接(
t1.id > t2.id
)执行起来相当昂贵。如果一侧较小,则进行广播,然后在每个节点上使用排序索引。如果两边都很大,可以将一个区域分区并构建一个排序索引,然后将其他行复制到任何可能匹配的区域。通常,有相等和不相等连接的组合,比如
t1.id = t2.id and t1.cost < t2.cost
. 在这种情况下,您可以执行一个正态分布散列联接,然后保留一个二级项的排序列表来执行非相等部分。普雷斯托就是这么做的。