STRAIGHT_JOIN与JOIN类似,区别仅在于STRAIGHT_JOIN不会调整执行计划中的左右表顺序。可用于联接优化器以次优顺序处理表的情况。

版本要求

仅3.1.3.0及以上版本的集群支持STRAIGHT_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 MySQL执行计划选择的INNER JOIN左右表不合理时的业务场景。
  • 在默认Hash JOIN场景下,选择大表在左,小表在右时,会达到较好性能。如果指定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语法相同的结果。STRAIGHT_JOIN不会被优化器自动调整JOIN顺序,region表为左表。INNER JOIN时,优化器会判断哪种顺序执行效率最高,而自动调整JOIN顺序。

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