长时SQL查询预估时间与进度¶
背景¶
对数据量较大的基表创建索引时,执行过程中没有任何进度提示,用户不知道发生了什么情况,可能会盲目取消sql的执行。
功能介绍¶
执行创建索引语句时,区分客户端(手动输入),执行时间超过 LONGOPS_PRINT_INFO_TIME 后发送Notice信息以提示当前算子的预计执行时间以及执行进度信息。用户可根据视图 V$SESSION_LONGOPS 来查看预计剩余的执行时间、已有工作量等信息,依据这些信息可判断出当前sql是否在正常执行。
使用场景¶
创建索引。暂不支持gis、分区索引。
示例:
--环境准备
drop table t;
create table t(a int,b varchar(10));
--插入大量数据,可根据机器状况调整数据量
begin
for i in 1..10000000 loop
insert into t values(i,'yujin');
end loop;
end;
/
--创建索引:
create index i_t on t(a);
--创建索引过程主要分为三个阶段:扫描、排序、添加索引。展示的进度信息也分为这三个阶段:
SQL=> create index i_t on t(b);
NOTICE, 创建索引共分为三个阶段,当前处于第一阶段顺序扫描,预计 42秒 后执行完成,详细执行进度信息请查看视图 V$SESSION_LONGOPS
NOTICE, 当前执行进度为 24%
NOTICE, 当前执行进度为 49%
NOTICE, 当前执行进度为 74%
NOTICE, 当前执行进度为 100%
NOTICE, 创建索引共分为三个阶段,第一阶段已完成,当前处于第二阶段排序,预计 48秒 后执行完成,详细执行进度信息请查看视图 V$SESSION_LONGOPS
NOTICE, 当前执行进度为 25%
NOTICE, 当前执行进度为 50%
NOTICE, 当前执行进度为 75%
NOTICE, 当前执行进度为 100%
NOTICE, 创建索引共分为三个阶段,第一二阶段已完成,当前处于第三阶段添加索引,预计 112秒 后执行完成,详细执行进度信息请查看视图 V$SESSION_LONGOPS
NOTICE, 当前执行进度为 25%
NOTICE, 当前执行进度为 50%
NOTICE, 当前执行进度为 75%
NOTICE, 当前执行进度为 100%
CREATE INDEX
查询视图信息:
SQL=> select * from V$SESSION_LONGOPS;
SID | SERIAL | PLAN_ID | OPERATION_ID | OPERATION | OPNAME | TARGET | TARGET_DESC | SOFAR | TOTALWORK | UNITS | START_TIME | TIME_REMAINING | ELAPSED_SECONDS | USERNAME | CURRENTSQL
-----+--------+-------------+--------------+---------------+--------------+--------+-------------+-----------+-----------+-------+----------------------+----------------+-----------------+----------+--------------------------
4 | 1 | 2073401332 | 0 | seq scan | seq scan | TABLE | TABLE | 52378 | 52378 | block | 2024-10-21 18:10:27 | 0 | 54 | SYSDBA | create index i_t on t(b)
4 | 1 | 2073401332 | 0 | sort | sort | TUPLES | TUPLES | 20000000 | 20000000 | row | 2024-10-21 18:11:21 | 0 | 70 | SYSDBA | create index i_t on t(b)
4 | 1 | 2073401332 | 0 | append index | append index | I_T | I_T | 20000000 | 20000000 | row | 2024-10-21 18:12:31 | 0 | 111 | SYSDBA | create index i_t on t(b)
(5 rows)