すべてのプロダクト
Search
ドキュメントセンター

AnalyticDB:STRAIGHT_JOIN

最終更新日:Feb 11, 2025

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';