現在、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 (parition_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のGLOBALレベルの統計情報を収集し、データ分布が不均等な列のヒストグラムのみを収集する
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も用意されています。