我该如何在Oracle 11上检查索引构建的状态?

9

我在创建SQL索引时犯了一个严重的错误:

create index IDX_DATA_TABLE_CUSECO on DATA_TABLE (CUSTOMER_ID, SESSION_ID, CONTACT_ID)
  tablespace IDX_TABLESPACE LOCAL ;

如您所见,我错过了关键字“ONLINE”,以避免在高使用率的生产表中创建索引,该表拥有600m+记录。更正后的SQL语句如下:

create index IDX_DATA_TABLE_CUSECO on DATA_TABLE (CUSTOMER_ID, SESSION_ID, CONTACT_ID)
  tablespace IDX_TABLESPACE LOCAL ONLINE;

我使用PL/SQL Developer完成了它。当我试图停止程序时,程序未响应并崩溃了。

生产系统现在已经停止工作9个小时了,我的老板要爆炸了:D

有没有办法看到Oracle 11g还需要多少秒/分钟/小时来处理这个索引创建?或者有没有机会看到Oracle是否仍在处理此请求?(PL/SQL Developer崩溃)。

针对那些抱怨的人:

我知道我应该按照这里提到的方法进行操作:(source)

CREATE INDEX cust_idx on customer(id) UNUSABLE LOCAL;
ALTER INDEX cust_idx REBUILD parallel 6 NOLOGGING ONLINE;


您提供的链接似乎无效。我希望您查看的任何文章至少在告诉您创建一个无用索引之前讨论“skip_unusable_indexes”设置,并且在构建索引后告诉您更改并行性设置。 - Justin Cave
2
这篇文章没有提到,但评论中有人解释了为什么这些建议并不像你认为的那样有用。我和Justin一样,为什么你还没有杀掉正在运行索引构建的会话? - Alex Poole
1个回答

15

你应该能够在 V$SESSION_LONGOPS 中查看操作的进度。

SELECT sid, 
       serial#, 
       target, 
       target_desc, 
       sofar, 
       totalwork, 
       start_time, 
       time_remaining, 
       elapsed_seconds
  FROM v$session_longops
 WHERE time_remaining > 0

当然,在生产系统中,我可能早就杀掉了会话,而不是让DDL操作继续以防止用户访问应用程序。


我无法看到我的会话,因为当PL/SQL Developer崩溃连接和会话中断时,但当我尝试计算统计信息时,我收到一个错误: <code> 错误报告: ORA-20000:此索引对象“PRODSCHM”。“IDX_DATA_TABLE_CUSECO”正在进行在线构建或重建 </code> - WBAR
@WBAR - 我不确定我理解你的意思。客户端应用程序(PL/SQL Developer)崩溃与数据库会话是否仍在运行无关。您是否在v$session中看到该会话? - Justin Cave
2
@WBAR - 如果会话不存在(并且假设这不是一个 RAC 系统,在这种情况下,您需要使用 gv$sessiongv$session_longops),那么它不可能持有锁。 - Justin Cave

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接