OceanBaseデータベースのオプティマイザーによる統計情報収集プロセスは時間がかかります。特に自動統計情報収集操作はそうです。収集は現在のデータベース内のすべてのテーブルに関わるため、何らかの理由で収集に失敗したテーブルが存在する可能性が高いです。収集に失敗したテーブルがタイムリーに診断されフィードバックされなければ、実行計画の生成時に利用可能な統計情報がなくなり、結果として最適でない計画が生成され、データベースシステムの異常な動作を引き起こすことになります。
OceanBaseデータベースV4.2.0バージョンから、統計情報収集のモニタリングと診断機能がサポートされています。これは主に統計情報収集の状態を監視し、統計情報収集の状況をフィードバックするために使用されます。
統計情報収集状態の監視
ユーザーが手動または自動で統計情報収集を開始した後、(G)V$OB_OPT_STAT_GATHER_MONITORビューを使用して、現在の収集タスクの実行時間、収集されたテーブルの数、収集戦略などのリアルタイム情報を照会し、統計情報の収集状況を監視できます。
GV$OB_OPT_STAT_GATHER_MONITORビューは、SYSテナントでアクセスすると、すべてのテナントのリアルタイム統計情報収集状態が表示されます。通常のテナントでアクセスすると、そのテナント自身のリアルタイム統計情報収集状態が表示されます。V$OB_OPT_STAT_GATHER_MONITORビューは、現在のテナントが現在のOBServerノード上でのリアルタイム統計情報収集状態を表示します。
ユーザーはDESCコマンドを使用して(G)V$OB_OPT_STAT_GATHER_MONITORビューのフィールド情報を照会できます。例:
obclient [none]> USE oceanbase;
Database changed
obclient [oceanbase]> DESC GV$OB_OPT_STAT_GATHER_MONITOR;
+-----------------------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------------------------+--------------+------+-----+---------+-------+
| TENANT_ID | bigint(20) | NO | | NULL | |
| SVR_IP | varchar(46) | NO | | NULL | |
| SVR_PORT | bigint(20) | NO | | NULL | |
| SESSION_ID | bigint(20) | NO | | NULL | |
| TRACE_ID | varchar(64) | NO | | NULL | |
| TASK_ID | varchar(36) | NO | | NULL | |
| TYPE | varchar(16) | NO | | | |
| TASK_START_TIME | datetime(6) | NO | | NULL | |
| TASK_DURATION_TIME | bigint(20) | NO | | NULL | |
| TASK_TABLE_COUNT | bigint(20) | NO | | NULL | |
| COMPLETED_TABLE_COUNT | bigint(20) | NO | | NULL | |
| RUNNING_TABLE_OWNER | varchar(128) | NO | | NULL | |
| RUNNING_TABLE_NAME | varchar(256) | NO | | NULL | |
| RUNNING_TABLE_DURATION_TIME | bigint(20) | NO | | NULL | |
+-----------------------------+--------------+------+-----+---------+-------+
14 rows in set
(G)V$OB_OPT_STAT_GATHER_MONITORビューの各フィールドの意味は以下の通りです:
TENANT_IDはテナントIDを表します。SVR_IPは収集タスクが存在するノードのアドレスを表します。SVR_PORTは収集タスクが存在するノードのポートを表します。SESSION_IDは収集タスクが存在するセッションIDを表します。TRACE_IDは収集タスクが存在するTrace IDを表します。TASK_IDは収集タスクのIDを表します。TYPEは収集方式を表します。現在はMANUAL GATHERとAUTO GATHERの2種類があります。TASK_START_TIMEは収集タスクの開始時間を表します。TASK_DURATION_TIMEは収集タスク全体の持続時間(単位:us)を表します。TASK_TABLE_COUNTは収集タスクで収集が必要なテーブルの数を表します。COMPLETED_TABLE_COUNTは収集タスクで既に完了したテーブルの数を表します。RUNNING_TABLE_OWNERは収集タスクがテーブルを収集しているユーザー名を表します。RUNNING_TABLE_NAMEは収集タスクがテーブルを収集しているテーブル名を表します。RUNNING_TABLE_DURATION_TIMEは収集タスクがテーブルを収集している持続時間(単位:us)を表します。
以下の例は、テーブルtest.t1に対してデフォルトの戦略を使用して手動でヒストグラム統計情報を収集する場合です。
CREATE TABLE test.t1(c1 INT, c2 INT, c3 INT, c4 INT, c5 INT, c6 INT, c7 INT, c8 INT, c9 INT, c10 INT);
CREATE TABLE t2 (c1 INT PRIMARY KEY);
INSERT INTO t2 VALUES(0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
INSERT /*+APPEND*/ INTO t1 SELECT * FROM (SELECT s0.c1 c1, s1.c1 c2, s2.c1 c3, s3.c1 c4, s4.c1 c5, s5.c1 c6, s0.c1 * 10 c7, s1.c1 * 10 c8, s2.c1 * 10 c9, s3.c1 * 10 c10 FROM t2 s0, t2 s1, t2 s2, t2 s3, t2 s4, t2 s5);
CALL DBMS_STATS.GATHER_TABLE_STATS('test', 't1');
収集プロセス中に、指定されたMySQLテナントの統計情報収集状態を照会した結果は次のとおりです:
obclient> SELECT * FROM oceanbase.GV$OB_OPT_STAT_GATHER_MONITOR WHERE tenant_id = 1006;
+-----------+----------------+----------+------------+-----------------------------------+--------------------------------------+---------------+----------------------------+--------------------+------------------+-----------------------+---------------------+--------------------+-----------------------------+
| TENANT_ID | SVR_IP | SVR_PORT | SESSION_ID | TRACE_ID | TASK_ID | TYPE | TASK_START_TIME | TASK_DURATION_TIME | TASK_TABLE_COUNT | COMPLETED_TABLE_COUNT | RUNNING_TABLE_OWNER | RUNNING_TABLE_NAME | RUNNING_TABLE_DURATION_TIME |
+-----------+----------------+----------+------------+-----------------------------------+--------------------------------------+---------------+----------------------------+--------------------+------------------+-----------------------+---------------------+--------------------+-----------------------------+
| 1006 | xxx.xxx.xxx.xxx | 2882 | 3221575784 | YB42AC1E87C6-0005FF6AD9F825FB-0-0 | c921f339-1bc8-11ee-a7ea-52583362494c | MANUAL GATHER | 2023-07-06 14:46:07.691856 | 609652 | 1 | 0 | test | t1 | 609653 |
+-----------+----------------+----------+------------+-----------------------------------+--------------------------------------+---------------+----------------------------+--------------------+------------------+-----------------------+---------------------+--------------------+-----------------------------+
1 row in set
統計情報収集履歴の照会
OceanBaseデータベースは、関連するビューを使用して、テナントレベルおよびテーブルレベルの履歴統計情報収集状態を照会することをサポートしています。
テナントレベルの履歴統計情報収集状態の照会
ユーザーは DBA_OB_TASK_OPT_STAT_GATHER_HISTORY ビューを使用して、統計情報収集タスクの詳細な状況を照会できます。これには、特定のテーブルの履歴統計情報の収集状況や、自動収集タスクの失敗リストの詳細などの情報が含まれます。
ユーザーは DESC コマンドを使用して DBA_OB_TASK_OPT_STAT_GATHER_HISTORY ビューのフィールド情報を照会できます。例:
obclient [none]> USE oceanbase;
Database changed
obclient [oceanbase]> DESC DBA_OB_TASK_OPT_STAT_GATHER_HISTORY;
+--------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------------+-------------+------+-----+---------+-------+
| TENANT_ID | bigint(20) | NO | | NULL | |
| TASK_ID | varchar(36) | NO | | NULL | |
| TYPE | varchar(16) | NO | | | |
| STATUS | varchar(8) | NO | | | |
| TABLE_COUNT | bigint(20) | YES | | NULL | |
| FAILED_COUNT | bigint(20) | YES | | NULL | |
| START_TIME | datetime(6) | NO | | NULL | |
| END_TIME | datetime(6) | NO | | NULL | |
+--------------+-------------+------+-----+---------+-------+
DBA_OB_TASK_OPT_STAT_GATHER_HISTORY ビューの各フィールドの意味は以下のとおりです:
TENANT_IDはテナントIDを表します。TASK_IDは収集タスクのIDを表します。TYPEは収集方法を表します。現在、MANUAL GATHERとAUTO GATHERの2種類があります。STATUSは収集タスクの状態を表します。現在の状態はSUCCESSとFAILEDの2種類です。TABLE_COUNTは収集タスクで収集されたテーブルの数を表します。FAILED_COUNTは収集タスクで収集に失敗したテーブルの数を表します。START_TIMEは収集タスクの開始時間を表します。END_TIMEは収集タスクの終了時間を表します。
以下の例は、DBA_OB_TASK_OPT_STAT_GATHER_HISTORY ビューを使用して、指定されたテナントの履歴統計情報収集状態を照会するものです。
obclient [test]> USE oceanbase;
Database changed
obclient [oceanbase]> SELECT * FROM DBA_OB_TASK_OPT_STAT_GATHER_HISTORY WHERE TENANT_ID = 1006;
+-----------+--------------------------------------+---------------+---------+-------------+--------------+----------------------------+----------------------------+
| TENANT_ID | TASK_ID | TYPE | STATUS | TABLE_COUNT | FAILED_COUNT | START_TIME | END_TIME |
+-----------+--------------------------------------+---------------+---------+-------------+--------------+----------------------------+----------------------------+
| 1006 | 12551575-1a73-11ee-97fa-0eac862eb0b0 | AUTO GATHER | SUCCESS | 28 | 0 | 2023-07-04 22:00:00.669344 | 2023-07-04 22:00:06.636230 |
| 1006 | 32163b43-1bc9-11ee-a7ea-52583362494c | MANUAL GATHER | SUCCESS | 1 | 0 | 2023-07-06 14:49:03.775825 | 2023-07-06 14:49:05.729871 |
| 1006 | 44783d8c-1b3c-11ee-8ac6-d28f59026246 | AUTO GATHER | SUCCESS | 19 | 0 | 2023-07-05 22:00:00.767591 | 2023-07-05 22:00:22.035235 |
| 1006 | a1487d0e-185a-11ee-8ac6-d28f59026246 | AUTO GATHER | SUCCESS | 304 | 0 | 2023-07-02 06:00:00.673996 | 2023-07-02 06:00:29.273704 |
| 1006 | c921f339-1bc8-11ee-a7ea-52583362494c | MANUAL GATHER | SUCCESS | 1 | 0 | 2023-07-06 14:46:07.691856 | 2023-07-06 14:46:09.712585 |
| 1006 | db64f8b8-1bc5-11ee-a7ea-52583362494c | MANUAL GATHER | SUCCESS | 1 | 0 | 2023-07-06 14:25:09.839887 | 2023-07-06 14:25:12.686117 |
| 1006 | e7dc9678-19a9-11ee-95a7-2646ab385e11 | AUTO GATHER | SUCCESS | 23 | 0 | 2023-07-03 22:00:00.596163 | 2023-07-03 22:00:05.079117 |
+-----------+--------------------------------------+---------------+---------+-------------+--------------+----------------------------+----------------------------+
7 rows in set
テーブルレベルの履歴統計情報収集状態の照会
ユーザーは DBA_OB_TABLE_OPT_STAT_GATHER_HISTORY ビューを使用して、特定のテーブルの履歴統計情報収集状況を照会できます。
ユーザーは DESC コマンドを使用して DBA_OB_TABLE_OPT_STAT_GATHER_HISTORY ビューのフィールド情報を照会できます。例:
obclient [none]> USE oceanbase;
Database changed
obclient [oceanbase]> DESC DBA_OB_TABLE_OPT_STAT_GATHER_HISTORY;
+--------------------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------------------------+--------------+------+-----+---------+-------+
| OWNER | varchar(128) | NO | | | |
| TABLE_NAME | varchar(256) | NO | | | |
| TASK_ID | varchar(36) | NO | | NULL | |
| STATUS | varchar(8) | NO | | | |
| START_TIME | datetime(6) | YES | | NULL | |
| END_TIME | datetime(6) | YES | | NULL | |
| MEMORY_USED | bigint(20) | YES | | NULL | |
| STAT_REFRESH_FAILED_LIST | text | YES | | NULL | |
| PROPERTIES | text | YES | | NULL | |
+--------------------------+--------------+------+-----+---------+-------+
9 rows in set
DBA_OB_TABLE_OPT_STAT_GATHER_HISTORY ビューの各フィールドの意味は以下のとおりです:
OWNERはそのテーブルが属するユーザーを表します。TABLE_NAMEはそのテーブルの名前を表します。TASK_IDはそのテーブルの収集に関連する収集タスクIDを表します。STATUSはそのテーブルの収集状態を表します。現在の状態はSUCCESSとFAILEDの2種類です。START_TIMEはそのテーブルの収集開始時間を表します。END_TIMEはそのテーブルの収集終了時間を表します。MEMORY_USEDはそのテーブルの収集期間中のメモリ使用量を表します。STAT_REFRESH_FAILED_LISTはそのテーブルの統計情報収集は成功したものの、キャッシュのリフレッシュに失敗したクラスタマシンのIPアドレスリストを表します。PROPERTIESはそのテーブルの収集プロパティ設定を表します。
以下の例は、DBA_OB_TABLE_OPT_STAT_GATHER_HISTORY ビューを使用して、ユーザー test の下のすべてのテーブルの履歴統計情報収集状態を照会するものです。
obclient [test]> USE oceanbase;
Database changed
obclient [oceanbase]> SELECT * FROM DBA_OB_TABLE_OPT_STAT_GATHER_HISTORY WHERE OWNER = 'test';
+-------+--------------+--------------------------------------+---------+----------------------------+----------------------------+-------------+--------------------------+------------------------------------------------------------------------------------------------------------------------------------+
| OWNER | TABLE_NAME | TASK_ID | STATUS | START_TIME | END_TIME | MEMORY_USED | STAT_REFRESH_FAILED_LIST | PROPERTIES |
+-------+--------------+--------------------------------------+---------+----------------------------+----------------------------+-------------+--------------------------+------------------------------------------------------------------------------------------------------------------------------------+
| test | test_tbl3_h | 12551575-1a73-11ee-97fa-0eac862eb0b0 | SUCCESS | 2023-07-04 22:00:03.235058 | 2023-07-04 22:00:03.363855 | 22176 | NULL | GRANULARITY:AUTO;METHOD_OPT:FOR ALL COLUMNS SIZE AUTO;DEGREE:1;ESTIMATE_PERCENT:100.000000;BLOCK_SAMPLE:0;STALE_PERCENT:-1.000000; |
| test | test_tbl2_hr | 12551575-1a73-11ee-97fa-0eac862eb0b0 | SUCCESS | 2023-07-04 22:00:02.994304 | 2023-07-04 22:00:03.232528 | 131208 | NULL | GRANULARITY:AUTO;METHOD_OPT:FOR ALL COLUMNS SIZE AUTO;DEGREE:1;ESTIMATE_PERCENT:100.000000;BLOCK_SAMPLE:0;STALE_PERCENT:-1.000000; |
| test | test_tbl1_hr | 12551575-1a73-11ee-97fa-0eac862eb0b0 | SUCCESS | 2023-07-04 22:00:02.619126 | 2023-07-04 22:00:02.989421 | 131208 | NULL | GRANULARITY:AUTO;METHOD_OPT:FOR ALL COLUMNS SIZE AUTO;DEGREE:1;ESTIMATE_PERCENT:100.000000;BLOCK_SAMPLE:0;STALE_PERCENT:-1.000000; |
| test | t1 | 32163b43-1bc9-11ee-a7ea-52583362494c | SUCCESS | 2023-07-06 14:49:03.775825 | 2023-07-06 14:49:05.729871 | 30084 | NULL | GRANULARITY:AUTO;METHOD_OPT:FOR ALL COLUMNS SIZE AUTO;DEGREE:1;ESTIMATE_PERCENT:100.000000;BLOCK_SAMPLE:0;STALE_PERCENT:-1.000000; |
| test | test_tbl14 | 44783d8c-1b3c-11ee-8ac6-d28f59026246 | SUCCESS | 2023-07-05 22:00:16.057930 | 2023-07-05 22:00:16.232034 | 7936 | NULL | GRANULARITY:AUTO;METHOD_OPT:FOR ALL COLUMNS SIZE AUTO;DEGREE:1;ESTIMATE_PERCENT:100.000000;BLOCK_SAMPLE:0;STALE_PERCENT:-1.000000; |
| test | tbl1 | 44783d8c-1b3c-11ee-8ac6-d28f59026246 | SUCCESS | 2023-07-05 22:00:15.578265 | 2023-07-05 22:00:16.049143 | 8160 | NULL | GRANULARITY:AUTO;METHOD_OPT:FOR ALL COLUMNS SIZE AUTO;DEGREE:1;ESTIMATE_PERCENT:100.000000;BLOCK_SAMPLE:0;STALE_PERCENT:-1.000000; |
| test | t1 | c921f339-1bc8-11ee-a7ea-52583362494c | SUCCESS | 2023-07-06 14:46:07.691856 | 2023-07-06 14:46:09.712585 | 30084 | NULL | GRANULARITY:AUTO;METHOD_OPT:FOR ALL COLUMNS SIZE AUTO;DEGREE:1;ESTIMATE_PERCENT:100.000000;BLOCK_SAMPLE:0;STALE_PERCENT:-1.000000; |
| test | t1 | db64f8b8-1bc5-11ee-a7ea-52583362494c | SUCCESS | 2023-07-06 14:25:09.839887 | 2023-07-06 14:25:12.686117 | 30084 | NULL | GRANULARITY:AUTO;METHOD_OPT:FOR ALL COLUMNS SIZE AUTO;DEGREE:1;ESTIMATE_PERCENT:100.000000;BLOCK_SAMPLE:0;STALE_PERCENT:-1.000000; |
| test | t2 | NULL | NULL | NULL | NULL | NULL | NULL | NULL |
+-------+--------------+--------------------------------------+---------+----------------------------+----------------------------+-------------+--------------------------+------------------------------------------------------------------------------------------------------------------------------------+
9 rows in set
統計情報収集履歴のクリーンアップポリシー
OceanBaseデータベースは現在、統計情報収集履歴のクリーンアップを以下の2つの方法でサポートしています:
DBMS_STATS.PURGE_STATS($timestamp)を使用して手動でクリーンアップします。- 自動スケジュールタスクを設定し、保存期限(デフォルトで31日)を超えた履歴情報を自動的にクリーンアップします。
以下の例は、DBMS_STATS.PURGE_STATS($timestamp) を使用して、指定された時間の履歴統計情報を手動でクリーンアップする方法です。
/* MySQLモード */
obclient [test]> CALL DBMS_STATS.PURGE_STATS ('2021-09-26 19:02:12.675729');
Query OK, 0 rows affected
/* Oracleモード */
obclient [SYS]> CALL DBMS_STATS.PURGE_STATS(TO_TIMESTAMP('2021-09-26 19:02:12.675729', 'YYYY-MM-DD HH24:MI:SS.FF'));
Query OK, 0 rows affected