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

PolarDB:自動インデックス推奨

最終更新日:Jan 24, 2025

このトピックでは、自動インデックス推奨機能の背景情報と使用方法について説明します。

前提条件

PolarDB for PostgreSQL (Compatible with Oracle) クラスターは、次のエンジンを実行します。

改訂版が2.0.14.19.0以降のPolarDB for PostgreSQL (Oracleと互換) 2.0。

説明

次のステートメントを実行して、PolarDB for PostgreSQL (Compatible with Oracle) クラスターのリビジョンバージョンを表示できます。

ショーpolar_version;

背景情報

データベースのパフォーマンス最適化は、データベース管理の鍵です。 インデックスは、SQLクエリのパフォーマンスを向上させる上で重要な役割を果たします。 最適化されたインデックスにより、データベースはテーブル内の特定の行をすばやく検索し、ソートされたデータを取得できます。 これにより、クエリ時間が大幅に短縮されます。

ただし、すべてのインデックスでデータベースのパフォーマンスが向上するわけではありません。 適切なインデックスは、クエリのパフォーマンスを大幅に向上させます。 ただし、不適切なインデックスは、データベースの全体的なパフォーマンスを低下させる追加のメンテナンスオーバーヘッドを引き起こす可能性があります。 無効なインデックスも追加のストレージスペースを占有します。 クエリの実行パスとデータ分散を詳細に分析して、どの列にインデックスを作成するかを決定する必要があります。 これには、この分野での強力な技術スキルと豊富な経験が必要です。

PolarDB for PostgreSQL (Compatible with Oracle) は、この課題を克服し、データベースのパフォーマンスを最適化するのに役立つ自動インデックス推奨機能を提供します。 この機能により、インデックスの作成プロセスが簡素化され、インデックスの開発と保守の難しさが軽減されます。 EXPLAINステートメントを実行して、低速SQLステートメントのパフォーマンスを分析できます。 システムは、分析に基づいて、適切なインデックスを作成する方法と、クエリ性能の改善についての推定とに関する提案を提供することができる。

自動インデックス推奨機能には、次の主な利点があります。

  • 正確な推奨: データベースとオプティマイザーコストモデルによって自動的に収集される統計を使用して、特定のSQLクエリに適切なインデックス構成を推奨します。 これにより、無効なインデックスによって引き起こされるパフォーマンスの負担と試行錯誤のコストを回避できます。

  • 効率の向上: 低速クエリの手動分析に必要な時間を短縮します。 これにより、パフォーマンスの問題の特定と解決を高速化できます。

  • 使いやすい: シンプルなEXPLAINステートメントを使用して、インデックスの推奨情報、インデックスを作成するためのSQLステートメント、およびパフォーマンスの向上の見積もりを提供します。 これにより、後続の操作が最適化されます。

使用法

説明
  • 推奨インデックスが要件を満たしていない場合、またはインデックスが推奨されていない場合は、トラブルシューティングと最適化についてお問い合わせください

  • DMSクライアントは通知プロンプトを表示しないため、PostgreSQLクライアントを使用して次の操作を実行することを推奨します。

自動インデックス推奨の設定

  1. polar_advisorsession_preload_librariesに追加して、すべてのユーザーのpolar_advisorを読み込みます。

    -- デフォルトでは、session_preload_librariesの値は空です。 この例では、polar_advisorが追加されます。
    すべてのセットsession_preload_librariesを 'polar_advisor' に変更します。
  2. すべてのユーザーの特定のノードでインデックスの推奨を有効にします。 プライマリノードでコンピューティングリソースを消費しないように、読み取り専用ノードでのみインデックスの推奨を有効にすることをお勧めします。

    -- 読み取り専用ノードでのみインデックス推奨を有効にします (推奨) 。
    alter role all set polar_advisor_typeを 'index(ro)'; 
    -- すべてのノードでインデックス推奨を有効にします。
    alter role all set polar_advisor_typeを 'index' に設定します。

自動インデックス推奨の使用

ANALYZE句なしでEXPLAINステートメントを実行して、低速SQLクエリの実行計画を生成します。 推奨インデックスが検出されると、自動インデックス推奨機能が自動的に実行され、次の情報が返されます。

  • advise: 推奨インデックスの作成に使用されるステートメント。

  • 古いコスト: 現在の計画のコスト。

  • newコスト: 推奨インデックスが作成された後のプランの推定コスト。

  • 節約コスト: 古い計画と比較した新しい計画によって節約されたコスト。

  • estimate: 推定加速度。

自動インデックス推奨機能は、次のタイプの演算子をサポートし、Bツリーインデックスのみを推奨できます。 例:

次のステートメントを使用して、テーブルを作成し、データを挿入します。

テーブルt( a int、b int) を作成します。insert select i,i from generate_series(1,10000)i;
分析t; 
  • 同値条件に基づいて単一列インデックスを推奨します。

    /* FORCE_SLAVE */ explain select * from t where a = 1;
    情報: IND ADV: 「public.tを使用してbtree (a) を作成する」ことをお勧めします
    通知: IND ADV: 古いコスト0.00 .. 170.00
    通知: IND ADV: 新しいコスト0.04 .. 2.25
    通知: IND ADV: 節約されたコスト-0.04 .. 167.75
    通知: IND ADV: 推定75.5倍高速
                        クエリ計画
    ---------------------------------------------------
     tのSeqスキャン (コスト=0.00 .. 170.00行=1幅=8)
       フィルター :( a = 1)
    (2行) 
  • 比較条件に基づいて単一列のインデックスを推奨します。

    /* FORCE_SLAVE */ explain select * from tここでa > 10; -- 返されるデータの量が少ない。 インデックスは推奨されません。
                          クエリ計画
    ------------------------------------------------------
     tのSeqスキャン (コスト=0.00 .. 170.00行=9990幅=8)
       フィルター :( a > 10)
    (2行)
    
     /* FORCE_SLAVE */ explain select * from tここでa < 10;
    情報: IND ADV: 「public.tを使用してbtree (a) を作成する」ことをお勧めします
    通知: IND ADV: 古いコスト0.00 .. 170.00
    通知: IND ADV: 新しいコスト0.04 .. 2.39
    通知: IND ADV: 節約されたコスト-0.04 .. 167.61
    通知: IND ADV: 推定71.1倍高速
                        クエリ計画
    ---------------------------------------------------
     tのSeqスキャン (コスト=0.00 .. 170.00行=9幅=8)
       フィルター :( a < 10)
    (2行)
    
  • 複数の等価条件または比較条件に基づいて結合インデックスを推奨します。

    /* FORCE_SLAVE * /select * from t (a = 1およびb = 1) を説明します。情報: IND ADV: 「btree (b、a) を使用してpublic.tでINDEX CONCURRENTLYを作成する」にアドバイスします
    通知: IND ADV: 古いコスト0.00 .. 195.00
    通知: IND ADV: 新しいコスト0.04 .. 1.16
    通知: IND ADV: 節約されたコスト-0.04 .. 193.84
    通知: IND ADV: 推定168.8倍高速
                        クエリ計画
    ---------------------------------------------------
     tのSeqスキャン (コスト=0.00 .. 195.00行=1幅=8)
       フィルター :( (a = 1) AND (b = 1))
    (2行) 
  • Order BY演算子に基づいて単一列インデックスを推奨します。

    /* FORCE_SLAVE */ explain select * from t order by a limit 10;
    情報: IND ADV: 「public.tを使用してbtree (a) を作成する」ことをお勧めします
    通知: IND ADV: 古いコスト361.10 .. 361.12
    通知: IND ADV: 新しいコスト0.04 .. 0.26
    通知: IND ADV: 節約されたコスト361.06 .. 360.86
    通知: IND ADV: 推定1366.8倍高速
                                クエリ計画
    -------------------------------------------------------------------
     制限 (コスト=361.10 .. 361.12行=10幅=8)
       -> 並べ替え (コスト=361.10 .. 386.10行=10000幅=8)
             ソートキー: a
             -> Seqスキャンon t (コスト=0.00 .. 145.00行=10000幅=8)
    (4行) 
  • Group BY演算子に基づいて単一列のインデックスを推奨します。

    /* FORCE_SLAVE */ explain select a,sum(b) from t group a < 10;
    情報: IND ADV: 「public.tを使用してbtree (a) を作成する」ことをお勧めします
    通知: IND ADV: 古いコスト170.14 .. 170.30
    通知: IND ADV: 新しいコスト0.04 .. 2.53
    通知: IND ADV: 節約されたコスト170.11 .. 167.77
    通知: IND ADV: 推定67.4倍高速
                              クエリ計画
    ---------------------------------------------------------------
     GroupAggregate (コスト=170.14 .. 170.30行=9幅=12)
       グループキー: a
       -> 並べ替え (コスト=170.14 .. 170.17行=9幅=8)
             ソートキー: a
             -> tのSeqスキャン (コスト=0.00 .. 170.00行=9幅=8)
                   フィルター :( a < 10)
    (6行) 
  • 等結合操作に基づいて単一列インデックスを推奨します。

    /* FORCE_SLAVE * /select * from t t1,t t2ここでt1.a = t2.a limit 10;
    情報: IND ADV: 「public.tを使用してbtree (a) を作成する」ことをお勧めします
    通知: IND ADV: 古いコスト270.00 .. 270.28
    通知: IND ADV: 新しいコスト0.07 .. 0.70
    通知: IND ADV: 節約されたコスト269.93 .. 269.58
    通知: IND ADV: 推定384.3倍高速
                                     クエリ計画
    ----------------------------------------------------------------------------
     制限 (コスト=270.00 .. 270.28行=10幅=16)
       -> ハッシュ参加 (コスト=270.00 .. 552.50行=10000幅=16)
             ハッシュコンド :( t1.a = t2.a)
             -> t t1のSeqスキャン (コスト=0.00 .. 145.00行=10000幅=8)
             -> ハッシュ (コスト=145.00 .. 145.00行=10000幅=8)
                   -> t t2のSeqスキャン (コスト=0.00 .. 145.00行=10000幅=8)
    (6行)