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収集タスクが存在するトレース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