本章节内容适用于版本号为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';
在文档使用中是否遇到以下问题
更多建议
匿名提交