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

PolarDB:IMCIオプティマイザの結合再順序の指定

最終更新日:Jun 03, 2024

メモリ内列インデックス (IMCI) が複雑なクエリを処理する機能を向上させるために、IMCIオプティマイザは、変換ルールをテーブル内の各列の統計と組み合わせて、コストに基づいて効率的な実行計画を生成します。 このトピックでは、IMCIクエリ最適化機能について説明します。

制御ポリシー機能の動作

SQLは宣言型クエリ言語であり、SQLステートメントのクエリプランを具体的に記述するものではありません。 SQL文の正しい結果を得るために、いくつかのクエリプランを使用することができる。 例:

SELECT * FROM t0, t1, t2, t3 WHERE t0.a = t1.a AND t1.a = t2.a AND t2.a = t3.a AND t3.b = t1.b;

上記のSQL文では、次の2つのクエリプランを使用して、正しいクエリ結果を取得できます。 执行方式プランAとプランBは同等のクエリプランです。 検索フレームワークとして、クエリオプティマイザは、あるクエリプランを別の等価クエリプランに変換することによって、現在のSQLステートメントに対応する等価クエリプランを検索する。 たとえば、t1 INNER JOIN t2t2 INNER JOIN t1は同等のクエリプランです。 クエリオプティマイザは、同等のクエリプランを変換することで、t1 INNER JOIN t2t2 INNER JOIN t1に変換できます。 オプティマイザによるこの変換は、クエリ変換ルールと呼ばれる。

クエリオプティマイザは次のように機能します。

  1. SQL文を解析して取得した初期クエリプランを開始します。

  2. クエリ変換ルールを使用して、初期状態のクエリプランから同等のクエリプランを生成します。

  3. 統計とコストモデルを組み合わせて、同等のクエリプランから実行コストが最も低いクエリプランを選択し、最終的な実行プランとして実行レイヤーに送信します。

クエリ最適化機能は、最良のクエリプランを決定するためのカーディナリティ推定およびコスト計算を実行するために統計に依存する。 IMCIでは、テーブルの統計には次の項目が含まれます。

  • ヒストグラム。異なる列の値の分布を示し、主に単一のテーブル上の値の範囲と同等の述語の選択率を推定するために使用されます。

  • 主にGroup Byのグループ数を推定するために使用され、同等の述語の選択率を推定するのにも使用できます。

  • 他の制約 (列に一意のインデックスがあるかどうか、または列に他の列との外部キー制約があるかどうかなど) 。

クエリオプティマイザは、次の項目に基づいて、クエリプランの各ノード演算子のコストを計算します。

  • クエリプランで演算子によって処理された行の総数。 統計を使用して、行の総数を推定できます。

  • クエリプランの各演算子で使用されるアルゴリズムの複雑さ。

クエリプラン内の演算子によって処理される行の総数は、アルゴリズム複雑度関数のパラメータである。 クエリプラン全体の実行コストは、すべてのノードの演算子コストの合計です。 上の図の2つのクエリプランで、結合実行アルゴリズムとしてハッシュ結合を使用する場合、コスト式は次のようになります。

コスト参加 =カードインナー + カードアウター

2つの実行計画のコストは次のとおりです。

コストA ==10000 + 1 + 1000 + 100 + 10000 + 10=21111

コストB =10000 + 1 + 100 + 10 + 1000 + 10=11121

プランBの実行コストは低くなります。 したがって、クエリオプティマイザは、プランBを最終実行プランとして選択します。

前提条件

PolarDBクラスターでは、次のいずれかのバージョンを使用します。

  • リビジョンバージョンが8.0.1.1.31以降のPolarDB for MySQL 8.0.1のクラスター。

  • リビジョンバージョンが8.0.2.2.12以降のPolarDB for MySQL 8.0.2のクラスター。

制限事項

次の条件は、カーディナリティ推定に大きなエラーをもたらす可能性があり、したがって、オプティマイザに次善のクエリ計画を選択させる。 ヒントを使用して、最適なクエリプランを生成するようにオプティマイザに指示できます。

  • 述語を含むクエリの場合、比較演算子はテーブルのさまざまな列をクエリするために使用されます。 例: t1.c1>t1.c2

  • 述語を含むクエリの場合、クエリステートメントで使用される演算子は、推定に統計を使用できません。 例: t1.c1 MOD 2=1およびt1.c2 LIKE '% ABC %

  • 述語を含むクエリの場合、クエリ文には式があり、最適化機能は計算に使用できません。 例: t1.c1 + t1.c3>100

  • クエリ文の演算子に含まれる列には、述語の選択率を推定するための統計がありません。 例: SELECT a, SUM(b) FROM t1 HAVING SUM(b) > 10

  • 複数の述語は、AND演算子を使用して結合されます。 例: t1.c1>10 AND t1.c3<5

  • クエリ文には、多くのネストされたレイヤーが含まれます。

  • クエリステートメントは、多くのテーブルを結合します。 loose_imci_max_enum_join_pairsパラメーターの値を変更して、IMCIオプティマイザが使用できる結合の数を指定できます。

パラメーター

IMCIクエリ最適化機能を有効にして使用するには、PolarDBコンソールで次の表に示すパラメーターを設定します。 PolarDBコンソールでパラメーターを設定する方法の詳細については、「クラスターパラメーターとノードパラメーターの設定」をご参照ください。

パラメーター

説明

loose_imci_optimizer_switch

IMCIクエリ最適化機能を有効にするかどうかを指定します。 有効な値:

  • use_imci_card_est: IMCIのカーディナリティ推定およびコスト計算機能を有効にするかどうかを指定します。 有効な値:

    • OFF (デフォルト)

    • オン

  • use_imci_join_reorder: IMCIの結合再順序を有効にするかどうかを指定します。 有効な値:

    • OFF (デフォルト)

    • オン

    説明

    クエリステートメントに含まれるテーブルに統計情報がない場合、または濃度推定およびコスト計算機能がIMCIで有効になっていない場合、このパラメーターがONに設定されていても、IMCIの結合順序は有効になりません。

loose_imci_auto_update_statistic

統計が最新でない場合に、IMCIクエリオプティマイザーが統計を再収集するかどうかを指定します。 有効な値:

  • ASYNC (デフォルト): 統計が最新でない場合、IMCIクエリオプティマイザーは非同期サンプリングを実行し、統計を再収集します。

  • SYNC: IMCIクエリオプティマイザは、同期サンプリングを実行し、統計が最新でない場合に統計を再収集します。

  • OFF: 統計が最新でない場合、IMCIクエリオプティマイザは統計を再収集しません。

loose_imci_max_enum_join_pairs

IMCIおよびjoin reorder機能が有効になっている場合に、IMCIクエリオプティマイザーが取得できる同等の実行プランの数。

有効な値: 0 ~ 4294967295 デフォルト値: 2000。

Usage

IMCIクエリ最適化機能を使用するには、まず選択した情報収集ポリシーに基づいて統計を収集する必要があります。 情報が収集されたら、IMCIクエリ最適化機能を有効にして、クエリ文を実行します。

  1. 統計を収集します。

    次の情報収集ポリシーに基づいて統計を収集できます。

    • IMCIクエリ最適化機能を使用して最新の統計を作成するテーブルを含むデータベースで、ANALYZE TABLEステートメントを定期的に実行します。

    • (推奨) IMCIが新しく作成されたテーブルでは、読み取り専用ノードでANALYZE tableステートメントを実行して、初期統計を作成します。 次に、loose_imci_auto_update_statisticパラメーターをASYNCに設定して、統計を自動的に更新します。

  2. IMCIクエリ最適化機能を有効にします。

    PolarDBコンソールでloose_imci_optimizer_switchパラメーターをONに設定して、IMCIクエリ最適化機能を有効にすることができます。

  3. クエリ文を実行します。

クエリ結果の比較

次の例では、TPCH-Q8を使用します。 クエリステートメントには複数のテーブルが含まれ、集計関数が含まれます。

SELECT
  o_year,
  SUM (
    CASE
      国=「ブラジル」のボリューム
      ELSE 0
    END
  ) / SUM (ボリューム) AS mkt_share
から
  (
    SELECT
      エキス (
        year
        FROM
          o_orderdate
      ) o_yearとして、
      l_extendedprice * (1 - l_discount) ASボリューム、
      n2.n_名AS国家
    FROM
      lineitem,
      注文、
      部分,
      サプライヤー,
      顧客、
      国家n1,
      国家n2,
      region
    WHERE
      p_partkey = l_partkey
      AND s_suppkey = l_suppkey
      AND l_orderkey = o_orderkey
      AND o_custkey = c_custkey
      AND c_nationkey = n1.n_nationkey
      AND n1.n_regionkey = r_regionkey
      AND r_name = 'AMERICA'
      AND s_nationkey = n2.n_nationkey
      および日付 '1995-01-01 'の間のo_orderdate
      そして日付「1996-12-31」
      AND p_type = 'ECONOMY ANODIZED STEEL'
  ) AS all_nations
によるグループ
  o_year
注文によって
  o_year; 
  • 次の図は、IMCIクエリ最適化機能が無効になっている場合のクエリプランを示しています。 未开启列存索引优化功能クエリプランには複数の結合が含まれ、大きな結果セットが生成されます。 これにより、オペレータが処理するデータ行と処理コストが増加し、レイテンシが長くなります。 テストでは、32コアクラスタとTPCH SF100データが使用されます。 クエリ期間は7,017ミリ秒です。

  • 次の図は、IMCIクエリ最適化機能が有効になっている場合のクエリプランを示しています。 开启列存索引优化功能クエリオプティマイザは結合を再ソートして、ほぼすべての結合演算子の出力データを数百万行に減らします。 これにより、後続のオペレータの処理コストが削減される。 テストでは、32コアクラスタとTPCH SF100データが使用されます。 クエリ期間は1,900ミリ秒です。 クエリの期間は、IMCIクエリ最適化機能が無効になっている場合よりも73% に短くなります。