首批通过分布式安全可靠测评,为关键业务系统打造
查询 OceanBase V4.x 版本的索引状态
更新时间:2026-04-13 15:31:21
注意
- 此方法适用于 OceanBase V4.1 版本,查询索引进度需要使用 sys 租户帐密。
- OceanBase V1.4.x \~ V3.2.x 版本的查询索引进度方法请参见 查询 OceanBase V1.4.x \~ V3.2.x 版本的索引状态。
GV$SESSION_LONGOPS 视图
使用 OceanBase V4.1.0 及之后的版本时,用户可以通过 GV$SESSION_LONGOPS视图查看 OceanBase 数据库内部耗时任务。GV$SESSION_LONGOPS视图包含索引创建所处的阶段、进度信息。字段说明如下表所示:
| 字段 | 类型 | 说明 |
|---|---|---|
| SID | bigint(20) | Session ID |
| OPNAME | varchar(128) | 具体 DDL 操作名 |
| TARGET | varchar(128) | DDL 操作对象 |
| SVR_IP | varchar(46) | 机器 IP |
| SVR_PORT | bigint(20) | 机器 Port |
| START_TIME | bigint(20) | 开始时间 |
| ELAPSED_SECONDS | decimal(24,4) | 已消耗时间 |
| TIME_REMAINING | bigint(20) | 预估剩余时间 |
| LAST_UPDATE_TIME | bigint(20) | 记录更新时间 |
| MESSAGE | varchar(500) | 补充信息 |
| TRACE_ID | varchar(64) | Trace ID |
查看索引创建过程
创建索引的主要耗时在索引数据补全,在某些环境下,可能因为创建索引时并发的事务未执行完成或者在等待事务结束部分。
等待事务结束阶段
创建索引任务处于等待事务结束阶段。参考命令:
obclient> select * from oceanbase.gv$session_longops \G
*************************** 1. row ***************************
SID: -1
TRACE_ID: YE5186458A15C-0005EF63AE10FBBB-0-0
OPNAME: create index
TARGET: __idx_500005_i1
SVR_IP:
SVR_PORT: 58648
START_TIME: 2023-06-09
ELAPSED_SECONDS: 7
TIME_REMAINING: 0
LAST_UPDATE_TIME: 2023-06-09
MESSAGE: TENANT_ID: 1004, TASK_ID: 2, STATUS: WAIT TRANS END, PENDING_TX_ID: 76
处于等事务结束阶段时,在 MESSAGE 字段中会显示 WAIT TRANS END 以及获取到的第一个未结束的事务 ID(例如:PENDING_TX_ID: 76),用户可以进一步通过 __all_virtual_trans_stat 表的 trans_id 字段来查询对应的事务信息。
数据补全阶段
用户可以通过行数统计指标判断索引创建任务的整体进度。
创建索引任务处于数据补全阶段的参考命令:
obclient> select * from oceanbase.gv$session_longops \G
*************************** 1. row ***************************
SID: -1
TRACE_ID: YFDE80BA2DA8D-0005FDA8116C1F4E-0-0
OPNAME: create index
TARGET: 500097
SVR_IP: 127.1
SVR_PORT: 65000
START_TIME: 2023-06-09 17:10:42
ELAPSED_SECONDS: 5
TIME_REMAINING: 0
LAST_UPDATE_TIME: 2023-06-09 17:10:48
MESSAGE: TENANT_ID: 1004, TASK_ID: 541, STATUS: REPLICA BUILD, ROW_SCANNED: 2000000, ROW_SORTED: 4000000, ROW_INSERTED: 503316
1 row in set (0.03 sec)
GV$SESSION_LONGOPS 字段含义
对于创建索引任务而言,各字段含义如下
| 字段 | 说明 |
|---|---|
| TRACE_ID | OBServer 程序日志 ID,用于搜索相关的日志文件。 |
| OPNAME | 创建索引时,显示 create index。 |
| TARGET | 创建索引时,显示正在创建的索引名。 |
| SVR_IP | 执行调度任务所在的 OBServer。 |
| SVR_PORT | 执行调度任务所在的 OBServer。 |
| START_TIME | 创建索引开始时间,只精确到日期,兼容 Oracle。 |
| ELAPSED_SECONDS | 创建索引执行的时间,单位为秒。 |
| TIME_REMAINING | 剩余时间预测,兼容 Oracle,暂时未实现。 |
| LAST_UPDATE_TIME | 统计信息收集的时间,精确到日期,兼容 Oracle。 |
| MESSAGE | 包含索引任务的具体信息,为最重要的字段:
|
索引数据补全阶段的行数统计
数据补全主要分为 3 个阶段,处理行数统计字段分别为:
| 阶段 | 行数统计指标 | 说明 |
|---|---|---|
| 扫描主表数据 | ROW_SCANNED | - |
| 排序 | ROW_SORTED | 排序阶段可能会进行多轮归并,所以 ROW_SORTED 的行数通常比 ROW_SCANNED 和 ROW_INSERTED 大,耗时也更久。 |
| 写入到索引表 | ROW_INSERTED | - |
上述参考命令中,ROW_SCANNED: 2000000, ROW_SORTED: 4000000, ROW_INSERTED: 503316。
可以判断出:
数据补全的扫描主表、排序步骤已完成,已进入最后一步写入到索引表阶段。
数据总行数为 2000000,写入到索引表已经完成 503316,写入到索引表进度百分比为 503316/2000000,大约为 25%。