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

AnalyticDB:注文の参加を手動で調整する

最終更新日:Jun 12, 2024

このトピックでは、ヒントを使用して自動結合順序調整機能を無効にした後に、結合順序を手動で調整する方法について説明します。

概要

AnalyticDB for MySQLは、複雑な結合を含むクエリをサポートし、自動結合順序調整機能を提供します。 ただし、クエリ文やテーブルのフィルタ条件はいつでも変更できます。 データ特性が複雑である場合、自動結合順序調整機能は、すべてのシナリオにおいてクエリ特性を推定すること、または最適な結合順序を選択することに失敗する可能性がある。 結合順序が不適切であると、中間結果セットのデータ拡張やメモリ使用量の増加など、クエリのパフォーマンスに影響する問題が発生する可能性があります。

上記の問題を解決するために、AnalyticDB for MySQLでは、/* + reorder_joins */ ヒントを使用して、自動結合順序調整機能を有効にするかどうかを指定できます。

  • /* + reorder_joins=true */: 自動結合順序調整機能を有効にします。 この機能を有効にすると、システムは自動的に参加注文を調整します。 デフォルトでは、この機能はAnalyticDB for MySQLで有効になっています。 SQLクエリを実行すると、ヒントを使用せずに結合順序が自動的に調整されます。

  • /* + reorder_joins=false */: 自動結合順序調整機能を無効にします。 この機能を無効にすると、クエリのデータ特性に基づいて結合順序を手動で調整できます。 これにより、SQL文の結合順序に基づいてクエリを実行できます。

説明

/* + reorder_joins */ はセッションレベルのヒントで、ヒントが適用されているSQL文にのみ有効です。

調整方法

  • 調整前

    • クエリ文

      次の例は、元のQuery 10ステートメントを示しています。

      説明
      • この例では、結合順序を手動で調整する方法と、クエリ効果を示しています。 この例では、TPC-Hベンチマークのクエリ10が使用されます。 TPC-Hベンチマークの詳細については、「TPC-Hバージョン2およびバージョン3」をご参照ください。

      • デフォルトでは、AnalyticDB for MySQLで自動結合順序調整機能が有効になっています。 次のクエリステートメントを実行すると、/* + reorder_joins=false */ ヒントを使用して、結合順序が不適切なシナリオをシミュレートします。

      SELECT c_custkey,
               c_name,
               収益としての合計 (l_extendedprice * (1 - l_discount)) 、
               c_acctbal,
               n_name、
               c_address,
               c_phone,
               c_comment
      顧客cから、
               注文o、
               lineitem l,
               国家n
      WHERE c_custkey = o_custkey
      AND l_orderkey = o_orderkey
      AND o_orderdate >= date '1993-10-01'
      AND o_orderdate < date '1993-10-01 '+ INTERVAL '3' 月
      AND l_returnflag = 'R'
      AND c_nationkey = n_nationkey
      グループBY c_custkey、
               c_name,
               c_acctbal,
               c_phone,
               n_name、
               c_address,
               c_comment
      収益による注文DESC
      LIMIT 20; 
    • 注文に参加する

      テーブルは、上記のSQL文に基づいて次の順序で結合されます。

      顧客JOIN注文JOINラインアイテムJOIN nation;
    • クエリ結果

      実行計画の各結合の次の一時的な結果が返されます。

      説明

      実行プランをクエリする方法については、「実行プランを使用してクエリを分析する」をご参照ください。

      1. customerテーブルと注文テーブルが結合されると、57,069行がtmp1の一時結果セットで返されます。1

      2. tmp1一時結果セットとlineitemテーブルが結合された後、114,705行がtmp2一時結果セットで返されます。2

      3. tmp2の一時結果セットとテーブルが結合された後、114,705行が最終結果として返されます。3

      3つの結合から返される行の総数は、次の式を使用して計算されます。57,069 + 114,705 + 114,705 = 286,479。

  • 調整後

    • クエリ文

      /* + reorder_joins=false */ ヒントをSQL文に追加して、AnalyticDB for MySQLの自動結合順序調整機能を無効にし、手動で結合順序を調整します。 調整後のSQL文の例を次に示します。

      /* reorder_joins=false * /
      SELECT c_custkey,
               c_name,
               収益としての合計 (l_extendedprice * (1 - l_discount)) 、
               c_acctbal,
               n_name、
               c_address,
               c_phone,
               c_comment
      顧客cから、
               注文o、
               国家n,
               lineitem l
      WHERE c_custkey = o_custkey
      AND c_nationkey = n_nationkey
      AND l_orderkey = o_orderkey
      AND o_orderdate >= date '1993-10-01'
      AND o_orderdate < date '1993-10-01 '+ INTERVAL '3' 月
      AND l_returnflag = 'R'
      グループBY c_custkey、
               c_name,
               c_acctbal,
               c_phone,
               n_name、
               c_address,
               c_comment
      収益による注文DESC
      LIMIT 20; 
    • 注文に参加する

      テーブルは、上記のSQL文に基づいて次の順序で結合されます。

      顧客JOIN注文JOIN nation JOIN lineitem
    • クエリ結果

      実行計画の各結合の次の一時的な結果が返されます。

      説明

      実行プランをクエリする方法については、「実行プランを使用してクエリを分析する」をご参照ください。

      1. customerテーブルと注文テーブルが結合されると、57,069行がtmp1の一時結果セットで返されます。1

      2. tmp1一時結果セットとnationテーブルが結合された後、57,069行がtmp2一時結果セットで返されます。2

      3. tmp2の一時結果セットとlineitemテーブルが結合された後、114,705行が最終結果として返されます。3

      3つの結合から返される行の総数は、次の式を使用して計算されます。57,069 + 57,069 + 114,705 = 228,843。

      調整後に返される行の総数は20% 減少します。 上記の比較は、異なる結合順序が中間一時結果セットのサイズに影響することを示しています。 AnalyticDB for MySQLの結合順序が不適切な場合は、結合順序を手動で調整してクエリのパフォーマンスを向上させることができます。