ほとんどの場合、インデックスの最適化では、データベース管理者または開発者が、データベースエンジンによるクエリの実行方法と最適化方法を学習する必要があります。 PolarDB-Xは、ユーザーエクスペリエンスを向上させ、クエリの最適化を容易にするインデックス推奨機能を提供します。 この機能は、コストベースのオプティマイザを使用してクエリを分析し、インデックスを推奨します。 これにより、ラウンドトリップ時間 (RTT) が短縮され、データベースのパフォーマンスが向上します。
注意事項
インデックス推奨機能は、指定したSQLクエリのみを分析し、インデックスを推奨します。 推奨インデックスを作成する前に、他のクエリに対するインデックスの影響を評価します。
インデックス推奨のしくみ
TPC-Hは業界で一般的に使用されているベンチマークです。 TPC-Hは、クエリを分析するデータベースエンジンの機能を評価するために、トランザクション処理パフォーマンス評議会によって定義およびリリースされます。 TPC-Hベンチマークには、8つのテーブルと22の複雑なSQLクエリ (Q1からQ22まで) が含まれます。 次の図は、Q17クエリに対して返される情報を示しています。 TPC-Hベンチマークでは、Q17は少量注文の収益を照会するために使用されます。 返された情報は、クエリの処理に28.76秒が消費されたことを示します。 このトピックでは、インテリジェントインデックス推奨機能を使用してQ17クエリを高速化する方法について説明します。

- 推奨インデックス情報の照会特定のクエリに推奨されるインデックス情報をクエリするには、クエリの開始時にEXPLAIN ADVISORを指定するだけです。 次のコードブロックに例を示します。
PolarDB-Xが上記のクエリを処理した後、PolarDB-Xは、推奨されるインデックス作成ステートメントと、推奨されるインデックスが作成される前後のコストを含むインデックス情報を返します。 次のコードブロックは、インデックス情報とコメントを示しています。EXPLAIN ADVISOR SELECT sum(l_extendedprice) / 7.0 AS avg_yearly ラインアイテムから、 部分 WHERE p_partkey = l_partkey AND p_brand = 'ブランド #23' そしてp_container = 'MED BOX AND l_quantity < (SELECT 0.2 * avg ('L_quantity') ラインアイテムから WHERE l_partkey = p_partkey);説明- この例では、ディスクI/Oコストが3024.7% 削減されています。 これは、推奨インデックスがパフォーマンスを大幅に向上させることを示します。
- PolarDB-Xがインデックスの推奨に失敗した場合、PolarDB-Xは、ピーク時以外にベーステーブルに対してANALYZE TABLEステートメントを実行するように求めるメッセージを返します。 ANALYZE TABLE文はキー配布情報を更新し、大量のI/Oリソースを消費します。 キー配布情報が更新された後、推奨インデックスに関するより正確な情報を取得できます。
IMPROVE_VALUE: 2465.3%# 全体的なコスト削減の推定割合。 IMPROVE_CPU: 59377.4%# CPUコスト削減の推定割合。 IMPROVE_MEM: 0.4%# メモリコスト削減の推定割合。 IMPROVE_IO: 3024.7%# ディスクI/Oコスト削減の推定割合。 IMPROVE_NET: 2011.1%# ネットワーク伝送コストの推定削減率。 BEFORE_VALUE: 4.711359845E8# 推奨インデックスが使用される前の推定全体コスト。 BEFORE_CPU: 1.19405577E7# 推奨インデックスが使用される前の推定CPUコスト。 BEFORE_MEM: 426811.2# 推奨インデックスが使用される前の推定メモリコスト。 BEFORE_IO: 44339# 推奨インデックスが使用される前の推定ディスクI/Oコスト。 BEFORE_NET: 47.5# 推奨インデックスが使用される前の推定ネットワーク伝送コスト。 AFTER_VALUE: 1.83655008E7# 推奨インデックスを使用した後の推定全体コスト。 AFTER_CPU: 20075.8# 推奨インデックスを使用した後の推定CPUコスト。 AFTER_MEM: 425016# 推奨インデックスが使用された後の推定メモリコスト。 AFTER_IO: 1419# 推奨インデックスを使用した後の推定ディスクI/Oコスト。 AFTER_NET: 2.2# 推奨インデックスが使用された後の推定ネットワーク伝送コスト。 ADVISE_INDEX: ALTER TABLE 'lineitem' ADD INDEX '__advise_index_lineiteml_partkey' ('L_partkey'); /* ADVISE_INDEXの値は、推奨されるインデックス作成ステートメントです。 */ NEW_PLAN: # 推奨インデックスを使用する実行プラン。 プロジェクト (avg_yearly="$f0 / ?0") HashAgg($f0="SUM(l_extendedprice)") フィルター (条件="l_quantity < $16 * f17w0$o0") SortWindow(p_partkey="p_partkey" 、l_partkey="l_partkey" 、l_quantity="l_quantity" 、l_extendedprice="l_extendedprice" 、$16="$16" 、f5w0$o0="window#0AVG($2)" 、リファレンスWindows="window#0=window (パーティション {1} order by [] UNBOUNDED PRECEDINGとUNBOUNDED PRECEDING aggs [AVG($2)])") MemSort(sort="l_partkey ASC") BKAJoin(condition="l_partkey = p_partkey", type="inner") 収集 (concurrent=true) LogicalView(tables="[0000,0001].part", shardCount=2, sql="SELECT 'p_partkey' FROM 'part' AS 'part' WHERE (('p_brand' = ?) AND ('p_container' = ?)))") 収集 (concurrent=true) LogicalView(tables="[0000,0001].lineitem", shardCount=2, sql="SELECT 'l_partkey', 'l_quantity', 'l_extendedprice', ? AS '$16' FROM 'lineitem' AS 'lineitem' WHERE ('L_partkey' IN (...))") INFO: LOCAL_INDEX# その他の情報。
- 推奨インデックスの作成
- 推奨インデックスで有効になっているパフォーマンスの向上を評価します。 次に、ADVISE_INDEXで返されたSQL文を実行して、推奨インデックスを作成します。
ALTER TABLE 'lineitem' ADD INDEX '__advise_index_lineiteml_partkey' ('L_partkey'); - Q17クエリを再度実行します。 クエリの処理には1.41秒しかかかりません。 クエリの効率が大幅に向上します。

- 推奨インデックスで有効になっているパフォーマンスの向上を評価します。 次に、ADVISE_INDEXで返されたSQL文を実行して、推奨インデックスを作成します。