本章节内容适用于版本号为3.1.3及以上的AnalyticDB for MySQL实例。STRAIGHT_JOIN与JOIN类似,只是不会调整执行计划中的左右表顺序。可用于联接优化器以次优顺序处理表的情况。

语法结构

join_table:
    table_reference STRAIGHT_JOIN table_factor [join_condition]

table_reference:
    table_factor
  | join_table

table_factor:
    tbl_name [alias]
  | table_subquery alias
  | ( table_references )

join_condition:
    ON expression 
说明
  • STRAIGHT_JOIN执行结果与INNER JOIN执行结果相同。
  • a STRAIGHT_JOIN b 语法执行时a表会做连接的左表,b表会做连接的右表,且a和b直接连接,优化器不会再做表连接顺序的优化。

使用场景

本语法用于指定INNER JOIN执行时的左右表,可用于表大小明确,或发现AnalyticDB for MySQL执行计划选择的INNER JOIN左右表不合理时的业务场景。

在默认hash join场景下,我们选择大表在左小表在右,在AnalyticDB for MySQL场景下会达到较好性能。如果指定nested loop join,则应选择小表在左大表在右。

如下第一句SQL,如果已知最佳连接顺序为 region、nation、customer,则可以将第一句SQL改写为第二句SQL,指定连接顺序及左右表,提高查询效率。

SELECT count(*)
       FROM    customer, nation, region
       WHERE c_nationkey = n_nationkey
       AND n_regionkey = r_regionkey
       AND r_name = 'ASIA'; 
SELECT count(*)
       FROM    region STRAIGHT_JOIN nation on n_regionkey = r_regionkey
       STRAIGHT_JOIN customer ON c_nationkey = n_nationkey
       WHERE r_name = 'ASIA';

示例

本示例中,STRAIGHT_JOIN会生成与INNER JOIN语法相同的结果,接着优化器会决定这个连接生成的结果表和customer表连接时的左右表。

SELECT count(*)
       FROM    region STRAIGHT_JOIN nation on n_regionkey = r_regionkey
       INNER JOIN customer ON c_nationkey = n_nationkey
       WHERE r_name = 'ASIA';