为解决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执行对比计划如下所示。

执行计划对比