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';
文档内容是否对您有帮助?