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';
文檔內容是否對您有幫助?