オプティマイザー修正コントロール
製品が繰り返し進化するにつれて、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 の新機能
- デフォルト値:
OFF
- 可能な値:
ON
、OFF
- この変数は、パーティション化されたテーブルに対してプラン キャッシュを許可するかどうかを制御します。
ON
に設定されている場合、 パーティションテーブルに対して準備されたステートメントプランキャッシュも非プリペアドステートメントプランキャッシュ有効になりません。
44262
v6.5.3 および v7.2.0 の新機能
- デフォルト値:
OFF
- 可能な値:
ON
、OFF
- この変数は、 グローバル統計が欠落している場合に、パーティションテーブルにアクセスするために動的プルーニングモードの使用を許可するかどうかを制御します。
44389
v6.5.3 および v7.2.0 の新機能
- デフォルト値:
OFF
- 可能な値:
ON
、OFF
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
- 可能な値:
ON
、OFF
- この変数は、物理的な最適化中に生成された
PointGet
演算子を使用してプラン キャッシュが実行プランをキャッシュできるかどうかを制御します。
44855
v6.5.4 および v7.3.0 の新機能
- デフォルト値:
OFF
- 可能な値:
ON
、OFF
- シナリオによっては、
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
- 可能な値:
ON
、OFF
- この変数は、 Plan Cache が生成された列アクセスする実行プランをキャッシュできるかどうかを制御します。
46177
v6.5.6、v7.1.3、v7.5.0 の新機能
- デフォルト値:
OFF
- 可能な値:
ON
、OFF
- この変数は、強制されていないプランを見つけた後、クエリの最適化中にオプティマイザーが強制されたプランを探索するかどうかを制御します。
52869
v8.1.0 の新機能
- デフォルト値:
OFF
- 可能な値:
ON
、OFF
- インデックスマージを使用したステートメントの説明の注記に記載されているように、オプティマイザがクエリ プランに対して単一インデックス スキャン メソッド (フル テーブル スキャン以外) を選択できる場合、オプティマイザはインデックス マージを自動的に使用しません。
- この制限は、この修正コントロールを有効にすることで解除できます。この制限を解除すると、オプティマイザーはより多くのクエリでインデックス マージを自動的に選択できるようになりますが、オプティマイザーが最適な実行プランを無視する可能性があります。したがって、この制限を解除する前に、実際の使用例で十分なテストを実施して、パフォーマンスの低下が発生しないことを確認することをお勧めします。
56318
注記:
これはTiDB Cloudサーバーレスのみ利用可能です。
- デフォルト値:
ON
- 可能な値:
ON
、OFF
- この変数は、
ORDER BY
のステートメントで使用される重い式を 2 回計算しないようにするかどうかを制御します。