このトピックでは、ヒントを使用して自動結合順序調整機能を無効にした後に、結合順序を手動で調整する方法について説明します。
概要
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;
クエリ結果
実行計画の各結合の次の一時的な結果が返されます。
説明実行プランをクエリする方法については、「実行プランを使用してクエリを分析する」をご参照ください。
customer
テーブルと注文
テーブルが結合されると、57,069行がtmp1
の一時結果セットで返されます。tmp1
一時結果セットとlineitem
テーブルが結合された後、114,705行がtmp2
一時結果セットで返されます。tmp2
の一時結果セットと国
テーブルが結合された後、114,705行が最終結果として返されます。
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
クエリ結果
実行計画の各結合の次の一時的な結果が返されます。
説明実行プランをクエリする方法については、「実行プランを使用してクエリを分析する」をご参照ください。
customer
テーブルと注文
テーブルが結合されると、57,069行がtmp1
の一時結果セットで返されます。tmp1
一時結果セットとnation
テーブルが結合された後、57,069行がtmp2
一時結果セットで返されます。tmp2
の一時結果セットとlineitem
テーブルが結合された後、114,705行が最終結果として返されます。
3つの結合から返される行の総数は、次の式を使用して計算されます。57,069 + 57,069 + 114,705 = 228,843。
調整後に返される行の総数は20% 減少します。 上記の比較は、異なる結合順序が中間一時結果セットのサイズに影響することを示しています。 AnalyticDB for MySQLの結合順序が不適切な場合は、結合順序を手動で調整してクエリのパフォーマンスを向上させることができます。