現在、OceanBaseデータベースのオプティマイザーは、手動統計情報収集に対して2つの方法を提供しています:DBMS_STATS(推奨)およびANALYZEコマンドラインです。DBMS_STATSシステムパッケージを使用した手動統計情報収集を推奨します。これは、DBMS_STATSシステムパッケージがより豊富な機能をサポートしているためです。
DBMS_STATSシステムパッケージによる統計情報収集
OceanBaseデータベースV4.0では、OracleモードでもMySQLモードでもDBMS_STATSシステムパッケージを使用して手動で統計情報を収集できます。その中で最も一般的に使用される2つのシステムパッケージのプロシージャは以下の通りです:GATHER_TABLE_STATSとGATHER_SCHEMA_STATS。前者は特定のテーブルの統計情報を収集するために使用され、後者はデータベース内のすべてのテーブルの統計情報を収集するために使用されます。以下に2つのプロシージャの基本的な定義を示します。
説明
DBMS_STATSシステムパッケージの詳細については、DBMS_STATSの概要(MySQLモード)およびDBMS_STATSの概要(Oracleモード)を参照してください。
PROCEDURE gather_table_stats (
ownname VARCHAR2,
tabname VARCHAR2,
partname VARCHAR2 DEFAULT NULL,
estimate_percent NUMBER DEFAULT AUTO_SAMPLE_SIZE,
block_sample BOOLEAN DEFAULT FALSE,
method_opt VARCHAR2 DEFAULT DEFAULT_METHOD_OPT,
degree NUMBER DEFAULT NULL,
granularity VARCHAR2 DEFAULT DEFAULT_GRANULARITY,
cascade BOOLEAN DEFAULT NULL,
stattab VARCHAR2 DEFAULT NULL,
statid VARCHAR2 DEFAULT NULL,
statown VARCHAR2 DEFAULT NULL,
no_invalidate BOOLEAN DEFAULT FALSE,
stattype VARCHAR2 DEFAULT 'DATA',
force BOOLEAN DEFAULT FALSE
);
PROCEDURE gather_schema_stats (
ownname VARCHAR2,
estimate_percent NUMBER DEFAULT AUTO_SAMPLE_SIZE,
block_sample BOOLEAN DEFAULT FALSE,
method_opt VARCHAR2 DEFAULT DEFAULT_METHOD_OPT,
degree NUMBER DEFAULT NULL,
granularity VARCHAR2 DEFAULT DEFAULT_GRANULARITY,
cascade BOOLEAN DEFAULT NULL,
stattab VARCHAR2 DEFAULT NULL,
statid VARCHAR2 DEFAULT NULL,
statown VARCHAR2 DEFAULT NULL,
no_invalidate BOOLEAN DEFAULT FALSE,
stattype VARCHAR2 DEFAULT 'DATA',
force BOOLEAN DEFAULT FALSE
);
パラメータの詳細:
ownname:ユーザー名。ユーザー名をNULLに設定した場合、現在ログインしているユーザー名がデフォルトで使用されます。tabname:テーブル名。partname:パーティション名。デフォルトはNULLです。estimate_percent:データのどの割合を使用して分布特性を計算するかを指定します。範囲は[0.000001,100]です。NULLを指定した場合、すべてのデータを使用します。デフォルトはAUTO_SAMPLE_SIZEで、オプティマイザーが内部で使用するデータの割合を決定します。特別な要件がない限り、指定せずにデフォルト値をそのまま使用できます。block_sample:行サンプリングの代わりにブロックサンプリングを使用するかどうか。デフォルトはFALSEです。method_opt:列レベルの統計情報収集方法を設定します。主に以下の構文を使用して設定します:method_opt: FOR ALL [INDEXED | HIDDEN] COLUMNS [size_clause] | FOR COLUMNS [size clause] column [size_clause] [,column [size_clause]...] size_clause: SIZE integer | SIZE REPEAT | SIZE AUTO | SIZE SKEWONLY column: column_name | (column_name [, column_name])integer:収集する列のヒストグラムバケット数を指定します。範囲は[1-2048]です。REPEAT:既にヒストグラムを収集済みの列のみのヒストグラムを収集します。以前にヒストグラムを収集した際に設定されたバケット数を使用します。AUTO:OceanBaseデータベースのオプティマイザーが列のヒストグラムを収集するかどうかを決定します。これは列の使用状況に依存し、バケット数はデフォルト値の254を使用します。SKEWONLY:データ分布が不均一な列のみのヒストグラムを収集します。ヒストグラムバケット数はデフォルト値の254を使用します。
degree:統計情報収集時の並列度。デフォルトはNULLで、prefs設定の並列度(デフォルトは1)を使用します。granularity:統計情報収集時のパーティション粒度。現在、以下の設定をサポートしています:'GLOBAL':グローバルレベルの統計情報を収集します。'PARTITION':パーティションレベルの統計情報を収集します。'SUBPARTITION':サブパーティションレベルの統計情報を収集します。'ALL':すべての統計情報(GLOBAL、PARTITION、SUBPARTITION)を収集します。'AUTO':デフォルトの方法(GLOBAL、PARTITION、SUBPARTITION)で統計情報を収集します。これがデフォルト値です。'DEFAULT':GLOBAL、PARTITIONレベルの統計情報を収集します。'GLOBAL AND PARTITION':グローバル、パーティションレベルの統計情報を収集します。'APPROX_GLOBAL AND PARTITION':パーティションレベルの統計情報を収集し、パーティション情報からグローバルレベルの統計情報を推定します。
cascade:テーブルのインデックス統計情報を同時に収集するかどうか。デフォルトはTRUEです。stattab:未実装です。使用できません。statid:未実装です。使用できません。statown:未実装です。使用できません。no_invalidate:未実装です。使用できません。stattype:未実装です。使用できません。force:統計情報の収集を強制的に行うかどうか。ロックの状態を無視します。デフォルトはFALSEです。
例
例1:ユーザーTESTのテーブルT1のグローバルレベルの統計情報を収集し、すべての列のバケット数を128に設定します
call dbms_stats.gather_table_stats('TEST', 'T1', granularity=>'GLOBAL', method_opt=>'FOR ALL COLUMNS SIZE 128');
例2:ユーザー TEST のテーブル T_PART1 のパーティションレベルの統計情報を収集し、並列度64で、データ分布が不均一な列のヒストグラムのみを収集する
call dbms_stats.gather_table_stats('TEST', 'T_PART1', degree=>64, granularity=>'PARTITION', method_opt=>'FOR ALL COLUMNS SIZE SKEWONLY');
例3:ユーザー TEST のテーブル T_SUBPART1 のすべての統計情報を収集し、並列度128で、データの50%のみを収集し、すべての列のヒストグラムはオプティマイザー内部で決定される
call dbms_stats.gather_table_stats('TEST', 'T_SUBPART1', degree=>128, estimate_percent=> '50', granularity=>'ALL', method_opt=>'FOR ALL COLUMNS SIZE AUTO');
例4:ユーザー TEST のすべてのテーブル統計情報を収集し、並列度128
call dbms_stats.gather_schema_stats('TEST', degree=>128);
ANALYZEコマンドによる統計情報収集
DBMS_STATS システムパッケージを使用して統計情報を収集するほかに、OceanBaseデータベースのOracleモードとMySQLモードでは ANALYZE ステートメントを使用して統計情報を収集することもできます。具体的な構文は以下のとおりです:
analyze_stmt:
ANALYZE TABLE table_name [use_partition] analyze_statistics_clause
use_partition:
PARTITION (partition_name [,partition_name,....])
| SUBPARTITION(subpartition_name, [,subpartition_name,...])
analyze_statistics_clause:
COMPUTE STATISTICS [analyze_for_clause]
| ESTIMATE STATISTICS [analyze_for_clause] [SAMPLE INTNUM {ROWS | PERCENTAGE}]
analyze_for_clause:
FOR TABLE
| FOR ALL [INDEXED | HIDDEN] COLUMNS [size_clause]
| FOR COLUMNS [size clause] column [size_clause] [,column [size_clause]...]
size_clause:
SIZE integer
| SIZE REPEAT
| SIZE AUTO
| SIZE SKEWONLY
column:
column_name
| (column_name [, column_name])
例
例1:ユーザー TEST のテーブル T1 の統計情報を収集し、すべての列のバケット数を128に設定します
obclient> ANALYZE TABLE T1 COMPUTE STATISTICS FOR ALL COLUMNS SIZE 128;
例2:ユーザー TEST のテーブル T_PART1 のグローバルレベルの統計情報を収集し、データ分布が不均一な列のヒストグラムのみを収集します
obclient> ANALYZE TABLE T_PART1 PARTITION('T_PART1') COMPUTE STATISTICS FOR ALL COLUMNS SIZE skewonly;
例3:ユーザー TEST のテーブル T_SUBPART1 のパーティション p0sp0,p1ps2 の統計情報を収集します。すべての列のヒストグラムはオプティマイザー内部で決定されます
obclient> ANALYZE TABLE T_SUBPART1 SUBPARTITION('p0sp0','p1ps2') COMPUTE STATISTICS FOR ALL COLUMNS SIZE auto;
上記の ANALYZE 構文は、MySQLモードで実行する場合、システム変数 enable_sql_extension を有効にする必要がある点に注意してください。ネイティブMySQLにはこの構文がないため、拡張モードで実行する必要があります。
例4:MySQLモードで上記の構文を使用し、ユーザー TEST のテーブル T1 の統計情報を収集します。すべての列のバケット数を128に設定します
obclient> ALTER SYSTEM SET enable_sql_extension = true;
obclient> ANALYZE TABLE T1 COMPUTE STATISTICS FOR ALL COLUMNS SIZE 128;
もちろん、現在のOceanBaseデータベースのオプティマイザーは、ネイティブMySQLの ANALYZE 構文とも互換性があります。具体的な構文は以下のとおりです:
analyze_stmt:
ANALYZE TABLE table_name UPDATE HISTOGRAM ON column_name_list WITH INTNUM BUCKETS
まとめ
上記の一般的な2つのシステムパッケージのPROCEDUREによる統計情報収集に加えて、DBMS_STATS システムパッケージは、インデックス統計情報を収集するための GATHER_INDEX_STATS と、テナント内のすべてのデータベースのテーブルの統計情報を収集するための GATHER_DATABASE_STATS_JOB_PROC も提供しています。