为解决Hash Join多表关联时过多消耗资源问题,AnalyticDB for MySQL推出Nested Loop Join多表关联方式。本文以具体示例介绍Nested Loop Join的使用方法。
背景信息
AnalyticDB for MySQL默认使用Hash Join进行表关联,Hash Join是一种通用的表关联方式,使用时会消耗更多的资源。针对一些数据规模较小、有较好关联选择率的场景,Hash Join并不是最优选择。AnalyticDB for MySQL中的Nested Loop Join能够很好解决这一问题,Nested Loop Join内部对应右表查询,使用索引访问方式,因此Nested Loop Join也称为Index Join。
适用场景
Nested Loop Join适用于左表过滤后只查询出少量数据,且右表在Join Column上有较好选择率的场景。
注意事项
- Nested Loop Join仅支持Inner Join和Left Join,不支持Right Loin和Full Outer Join。
- 使用Nested Loop Join时右表必须有索引,且右表不支持多分区列。
- 关联列两边数据类型完全一致。
- 支持数据类型:Int、Boolean、Varchar、Time、Date、Timestamp、Datetime。
- 不支持数据类型:Float、Double、Decimal、Json、Multivalue、Geoo2d、Bytes、Array、Blob、Binary、Null、Other。
- 事实表Join维度表时:
- 维度表记录数不超过2千万条。
- 事实表Join维度表时,不限制关联条件。
- Left Join时左表不能是维度表。
- 事实表Join事实表时,关联条件必须包含分布键。
使用方法
可以通过Hint开启Nested Loop Join。
/*+nested_loop_join=true*/
不做表数量判断,所有符合条件的表都使用Nested Loop Join。
/*+nlj_index_join_small_table_max_row, nlj_index_join_large_table_max_row*/
进行左右表数量判断,小表或大表超过阈值时将使用Hash Join。
示例
/*+nested_loop_join=true */
SELECT t1.c1
FROM T1 INNER JOIN T2
ON T1.C1=T2.C1;
上述SQL执行对比计划如下所示。

在文档使用中是否遇到以下问题
更多建议
匿名提交