STRAIGHT_JOIN は JOIN に似ています。 唯一の違いは、STRAIGHT_JOIN が実行計画でテーブルを結合する順序を調整しないことです。 STRAIGHT_JOIN を使用して、オプティマイザが最適でない順序でテーブルを結合する場合、クエリを高速化できます。
前提条件
バージョン3.1.3.0 以降のAnalyticDB for MySQLクラスターが使用されている必要があります。
説明
AnalyticDB for MySQLのマイナーバージョンを照会するには
Data Lakehouse Editionクラスターで、SELECT adb_version(); 文を実行します。 クラスターのマイナーバージョンを更新するには、テクニカルサポートにお問い合わせください。
構文
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が結合されます。 オプティマイザは結合順序を最適化しません。
シナリオ
- INNER JOIN に対して特定のサイズの左右のテーブルが指定されている場合は、STRAIGHT_JOIN を使用できます。 STRAIGHT_JOIN を使用して、AnalyticDB for MySQL 実行プランの INNER JOIN に対して指定されているテーブルの結合順序を変更することもできます。
- パフォーマンスを向上させるには、ハッシュ結合では大きい左テーブルと小さい右テーブルを指定し、ネストループ結合では小さい左テーブルと大きい右テーブルを指定します。
テーブルの最適な結合順序は、リージョン、国、顧客であるとします。 クエリの効率を向上させるために STRAIGHT_JOIN を使用し、テーブルの結合順序を指定して、最初の文を 2 番目のステートメントに変更できます。
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 クエリの場合、オプティマイザは結合順序を自動的に調整しません。 リージョンテーブルは左側のテーブルとして使用されます。 INNER 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';