📣

TiDB Cloud Serverless が
Starter
に変わりました!このページは自動翻訳されたものです。
原文はこちらからご覧ください。

拡張統計入門

TiDBは以下の2種類の統計情報を収集できます。このドキュメントでは、拡張統計を使用してオプティマイザをガイドする方法について説明します。このドキュメントを読む前に、まず統計入門読むことをお勧めします。

  • 基本統計:ヒストグラムやCount-Min Sketchなど、主に個々の列に焦点を当てた統計。これらは、オプティマイザがクエリコストを見積もるために不可欠です。詳細は統計入門ご覧ください。
  • 拡張統計: 指定された列間のデータの相関関係に焦点を当てた統計。クエリされた列が相関している場合に、オプティマイザーがクエリ コストをより正確に見積もることを可能にします。

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

拡張統計はデフォルトで無効になっています。拡張統計を収集するには、まず拡張統計を有効にし、必要な拡張統計オブジェクトを1つずつ作成する必要があります。オブジェクトの作成後、次にANALYZEステートメントが実行されると、TiDBは作成されたオブジェクトの基本統計と対応する拡張統計の両方を収集します。

制限事項

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

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

一般的な操作

拡張統計を有効にする

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

SET GLOBAL tidb_enable_extended_stats = ON;

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

拡張統計オブジェクトを作成する

拡張統計オブジェクトの作成は一度限りの作業ではありません。拡張統計オブジェクトごとに作成を繰り返す必要があります。

拡張統計オブジェクトを作成するには、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 はテーブルtcol1col2ピアソン相関係数計算し、オブジェクトをテーブル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の値より小さい場合、オプティマイザは独立仮定を使用しますが、ヒューリスティックに推定値も増加させます。5 tidb_opt_correlation_exp_factor値が大きいほど、推定結果は大きくなります。相関係数の絶対値が大きいほど、推定結果は大きくなります。

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