オプティマイザー修正コントロール

+3
t
d
t
l

製品が繰り返し進化するにつれて、TiDB オプティマイザーの動作が変化し、より合理的な実行プランが生成されます。ただし、特定のシナリオでは、新しい動作によって予期しない結果が生じる可能性があります。例:

  • 一部の動作の効果は特定のシナリオに依存します。ほとんどのシナリオに改善をもたらす変更が、他のシナリオに後退を引き起こす可能性があります。
  • 場合によっては、動作の詳細の変化とその結果の関係が非常に複雑になることがあります。特定の動作の改善が全体的な退行を引き起こす可能性があります。

そのため、TiDB は、一連の修正の値を設定することで TiDB オプティマイザの動作を細かく制御できるオプティマイザ修正制御機能を提供します。このドキュメントでは、オプティマイザ修正制御機能とその使用方法について説明し、現在 TiDB がオプティマイザ修正制御でサポートしているすべての修正を一覧表示します。

tidb_opt_fix_controlの紹介

v6.5.3 および v7.1.0 以降、TiDB は、オプティマイザーの動作をより細かく制御するためのtidb_opt_fix_controlシステム変数を提供します。

各修正は、特定の目的のために TiDB オプティマイザーの動作を調整するために使用される制御項目です。動作変更の技術的な詳細を含む GitHub の問題に対応する番号で示されます。たとえば、修正44262の場合、 問題 44262でそれが制御するものを確認できます。

tidb_opt_fix_controlシステム変数は、複数の修正をカンマで区切られた 1 つの値 ( , ) として受け入れます。形式は"<#issue1>:<value1>,<#issue2>:<value2>,...,<#issueN>:<valueN>"で、 <#issueN>修正番号です。例:

SET SESSION tidb_opt_fix_control = '44262:ON,44389:ON';

オプティマイザー修正コントロールリファレンス

33031 v8.0.0 の新機能

44262 v6.5.3 および v7.2.0 の新機能

  • デフォルト値: OFF
  • 可能な値: ONOFF
  • この変数は、テーブルの世界の統計が欠落している場合に、パーティションテーブルにアクセスするために動的プルーニングモードの使用を許可するかどうかを制御します。

44389 v6.5.3 および v7.2.0 の新機能

  • デフォルト値: OFF
  • 可能な値: ONOFF
  • c = 10 and (a = 'xx' or (a = 'kk' and b = 1))などのフィルターの場合、この変数はIndexRangeScanのより包括的なスキャン範囲を構築するかどうかを制御します。

44823 v7.3.0 の新機能

  • デフォルト値: 200
  • 可能な値: [0, 2147483647]
  • メモリを節約するために、プラン キャッシュはこの変数で指定された数を超えるパラメータを持つクエリをキャッシュしません。1 0制限がないことを意味します。

44830 v6.5.7 および v7.3.0 の新機能

  • デフォルト値: OFF
  • 可能な値: ONOFF
  • この変数は、物理的な最適化中に生成されたPointGet演算子を使用してプラン キャッシュが実行プランをキャッシュできるかどうかを制御します。

44855 v6.5.4 および v7.3.0 の新機能

  • デフォルト値: OFF
  • 可能な値: ONOFF
  • シナリオによっては、 IndexJoin演算子のProbe側にSelection演算子が含まれている場合、TiDB は行数IndexScanを大幅に過大評価します。これにより、 IndexJoinではなく、最適ではないクエリ プランが選択される場合があります。
  • この問題を軽減するために、TiDB では改善が導入されました。ただし、クエリ プランのフォールバックのリスクが発生する可能性があるため、この改善はデフォルトで無効になっています。
  • この変数は、前述の改善を有効にするかどうかを制御します。

45132 v7.4.0 の新機能

  • デフォルト値: 1000
  • 可能な値: [0, 2147483647]
  • この変数は、アクセス パスを選択するためのオプティマイザのヒューリスティック戦略のしきい値を設定します。アクセス パスの推定行数 ( Index_Aなど) が他のアクセス パスの推定行数 (デフォルトは1000倍) よりもはるかに小さい場合、オプティマイザはコストの比較をスキップし、直接Index_A選択します。
  • 0このヒューリスティック戦略を無効にすることを意味します。

45798 v7.5.0 の新機能

  • デフォルト値: ON
  • 可能な値: ONOFF
  • この変数は、 Plan Cache が生成された列アクセスする実行プランをキャッシュできるかどうかを制御します。

46177 v6.5.6、v7.1.3、v7.5.0 の新機能

  • デフォルト値: ON 。v8.5.0 より前では、デフォルト値はOFFです。
  • 可能な値: ONOFF
  • この変数は、強制されていないプランを見つけた後、クエリの最適化中にオプティマイザーが強制されたプランを探索するかどうかを制御します。

47400 v8.4.0 の新機能

  • デフォルト値: ON
  • 可能な値: ONOFF
  • クエリ プラン内の各プラン ステップの対象となる行数を正確に見積もることは難しいため、オプティマイザーはestRowsの値を小さく見積もる場合があります。この変数は、最小値estRowsを制限するかどうかを制御します。
  • ON : 最小値estRowsを 1 に制限します。これは、v8.4.0 で導入された新しい動作であり、Oracle や DB2 などの他のデータベースと一致しています。
  • OFF : 最小行推定制限を無効にします。これにより、v8.4.0 より前のバージョンと一貫した動作が維持されます。この場合、 estRowsゼロになる可能性があります。

52592 v8.4.0 の新機能

  • デフォルト値: OFF

  • 可能な値: ONOFF

  • この変数は、クエリ実行でPoint GetおよびBatch Point Get演算子を無効にするかどうかを制御します。デフォルト値OFF 、クエリ実行にPoint GetおよびBatch Point Get使用できることを意味します。 ONに設定すると、オプティマイザはPoint GetおよびBatch Point Get無効にし、クエリ実行にコプロセッサーの選択を強制します。

  • Point GetBatch Point Get列投影をサポートしていません (つまり、列のサブセットのみを返すことはできません)。そのため、シナリオによっては、実行効率がコプロセッサーよりも低くなる可能性があります。この変数をONに設定すると、クエリのパフォーマンスが向上します。この変数をONに設定する推奨シナリオは次のとおりです。

    • 多数の列を持つ幅の広いテーブルで、少数の列のみがクエリされます。
    • 大きな JSON 値を持つテーブルで、JSON 列がクエリされないか、JSON 列のごく一部のみがクエリされます。

52869 v8.1.0 の新機能

  • デフォルト値: OFF
  • 可能な値: ONOFF
  • インデックスマージを使用したステートメントの説明注記に記載されているように、オプティマイザがクエリ プランに対して単一インデックス スキャン メソッド (フル テーブル スキャン以外) を選択できる場合、オプティマイザはインデックス マージを自動的に使用しません。
  • この制限は、この修正コントロールを有効にすることで解除できます。この制限を解除すると、オプティマイザーはより多くのクエリでインデックス マージを自動的に選択できるようになりますが、オプティマイザーが最適な実行プランを無視する可能性があります。したがって、この制限を解除する前に、実際の使用例で十分なテストを実施して、パフォーマンスの低下が発生しないことを確認することをお勧めします。

54337 v8.2.0 の新機能

  • デフォルト値: OFF
  • 可能な値: ONOFF
  • 現在、TiDB オプティマイザーには、各結合が範囲のリストで構成されている複雑な結合条件のインデックス範囲を導出する際に制限があります。これは、一般的な範囲の交差を適用することで解決できます。
  • この修正コントロールを有効にすると、この制限がなくなり、オプティマイザーが複雑な範囲の交差を処理できるようになります。ただし、多数の結合子 (10 個以上) を含む条件の場合、最適化時間が長くなるリスクがわずかにあります。

このページは役に立ちましたか?