拡張統計の概要

TiDB は、次の 2 種類の統計を収集できます。

  • 基本統計: ヒストグラムや Count-Min Sketch などの統計。詳細については統計入門を参照してください。
  • 拡張統計: テーブルと列によってフィルターされた統計。

ヒント:

このドキュメントを読む前に、まず統計入門を読むことをお勧めします。

ANALYZEステートメントが手動または自動で実行される場合、TiDB はデフォルトで基本統計のみを収集し、拡張統計は収集しません。これは、拡張統計は特定のシナリオでのオプティマイザの推定にのみ使用され、それらの収集には追加のオーバーヘッドが必要になるためです。

拡張統計はデフォルトでは無効になっています。拡張統計を収集するには、まず拡張統計を有効にしてから、個々の拡張統計オブジェクトを登録する必要があります。

登録後、次回ANALYZEステートメントが実行されると、TiDB は基本統計と登録された拡張統計の両方を収集します。

制限事項

拡張統計は、次のシナリオでは収集されません。

  • インデックスのみの統計収集
  • ANALYZE INCREMENTALコマンドを使用した統計収集
  • システム変数tidb_enable_fast_analyzeの値がtrueに設定されている場合の統計収集

共通操作

拡張統計を有効にする

拡張統計を有効にするには、システム変数tidb_enable_extended_statsからONを設定します。

SET GLOBAL tidb_enable_extended_stats = ON;

この変数のデフォルト値はOFFです。このシステム変数の設定は、すべての拡張統計オブジェクトに適用されます。

拡張統計の登録

拡張統計の登録は 1 回限りのタスクではないため、拡張統計オブジェクトごとに登録を繰り返す必要があります。

拡張統計を登録するには、SQL ステートメントALTER TABLE ADD STATS_EXTENDEDを使用します。構文は次のとおりです。

ALTER TABLE table_name ADD STATS_EXTENDED IF NOT EXISTS stats_name stats_type(column_name, column_name...);

構文では、収集する拡張統計のテーブル名、統計名、統計タイプ、および列名を指定できます。

  • table_name拡張統計が収集されるテーブルの名前を指定します。
  • stats_name統計オブジェクトの名前を指定します。この名前はテーブルごとに一意である必要があります。
  • stats_type統計のタイプを指定します。現在、相関タイプのみがサポートされています。
  • column_name列グループを指定します。列グループには複数の列が含まれる場合があります。現在、指定できる列名は 2 つだけです。
使い方

アクセス パフォーマンスを向上させるために、各 TiDB ノードは拡張統計用にシステム テーブルmysql.stats_extendedにキャッシュを維持します。拡張統計を登録した後、次回ANALYZEステートメントが実行されると、システム テーブルmysql.stats_extendedに対応するオブジェクトがある場合、TiDB は拡張統計を収集します。

mysql.stats_extendedテーブルの各行にはversion列があります。行が更新されると、 versionの値が増加します。このように、TiDB はテーブルを完全ではなく段階的にメモリにロードします。

TiDB は、キャッシュがテーブル内のデータと同じに保たれるように、定期的にmysql.stats_extendedをロードします。

拡張統計の削除

拡張統計オブジェクトを削除するには、次のステートメントを使用します。

ALTER TABLE table_name DROP STATS_EXTENDED stats_name;
使い方

ステートメントを実行すると、TiDB はオブジェクトを直接削除するのではなく、 mysql.stats_extendedの列status2に対応するオブジェクトの値をマークします。

他の TiDB ノードはこの変更を読み取り、メモリキャッシュ内のオブジェクトを削除します。バックグラウンドのガベージコレクション、最終的にオブジェクトは削除されます。

拡張統計のエクスポートとインポート

拡張統計をエクスポートまたはインポートする方法は、基本統計をエクスポートまたはインポートする方法と同じです。詳細については統計の概要 - 統計のインポートとエクスポートを参照してください。

相関型拡張統計の使用例

現在、TiDB は相関タイプの拡張統計のみをサポートしています。このタイプは、範囲クエリ内の行数を推定し、インデックス選択を改善するために使用されます。次の例は、相関タイプの拡張統計を使用して範囲クエリの行数を推定する方法を示しています。

ステップ 1. テーブルを定義する

テーブルt次のように定義します。

CREATE TABLE t(col1 INT, col2 INT, KEY(col1), KEY(col2));

テーブルtcol1col2両方とも、行の順序で単調増加する制約に従うと仮定します。これは、 col1col2の値が順番に厳密に相関しており、相関係数が1であることを意味します。

ステップ 2. 拡張統計を使用せずにクエリ例を実行する

拡張統計を使用せずに次のクエリを実行します。

SELECT * FROM t WHERE col1 > 1 ORDER BY col2 LIMIT 1;

前述のクエリを実行する場合、TiDB オプティマイザーにはテーブルtにアクセスするための次のオプションがあります。

  • col1のインデックスを使用してテーブルtにアクセスし、結果をcol2でソートしてTop-1を計算します。
  • col2のインデックスを使用して、 col1 > 1を満たす最初の行を検索します。このアクセス方法のコストは主に、TiDB がcol2の順序でテーブルをスキャンするときにフィルターで除外される行の数によって決まります。

拡張統計がないと、TiDB オプティマイザーはcol1col2が独立していると想定するだけであり、これが重大な推定誤差につながります

ステップ 3. 拡張統計を有効にする

tidb_enable_extended_statsONに設定し、 col1col2に拡張統計オブジェクトを登録します。

ALTER TABLE t ADD STATS_EXTENDED s1 correlation(col1, col2);

登録後にANALYZEを実行すると、TiDB はテーブルtcolcol2ピアソン相関係数計算し、オブジェクトをmysql.stats_extendedテーブルに書き込みます。

ステップ 4. 拡張統計がどのような違いを生むかを確認する

TiDB が相関に関する拡張統計を取得すると、オプティマイザーはスキャンする行数をより正確に推定できるようになります。

このとき、 ステージ 2. 拡張統計を使用せずにクエリ例を実行するのクエリでは、 col1col2が順に厳密に対応付けられます。 TiDB がcol2のインデックスを使用してテーブルtにアクセスし、 col1 > 1を満たす最初の行を検索すると、TiDB オプティマイザーは行数の推定を次のクエリに変換します。

SELECT * FROM t WHERE col1 <= 1 OR col1 IS NULL;

前述のクエリ結果に 1 を加えたものが、行数の最終推定値となります。この方法では、独立した仮定を使用する必要がなくなり、重大な推定誤差が回避されます

相関係数 (この例では1 ) がシステム変数tidb_opt_correlation_thresholdの値より小さい場合、オプティマイザーは独立した仮定を使用しますが、推定値もヒューリスティックに増加します。 tidb_opt_correlation_exp_factorの値が大きいほど、推定結果は大きくなります。相関係数の絶対値が大きいほど、推定結果は大きくなります。

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

Playground
新規
登録なしで TiDB の機能をワンストップでインタラクティブに体験できます。
製品
TiDB Cloud
TiDB
価格
PoC お問い合わせ
エコシステム
TiKV
TiFlash
OSS Insight
© 2024 PingCAP. All Rights Reserved.
Privacy Policy.