无法创建索引,在物化视图上锁定

时间:2019-04-17 12:58:22

标签: sql oracle oracle11g

我在Oracle中创建了一个物化视图。我使用日志来启用/使用快速刷新。主表包含约120亿个条目,联接表包含800万个条目。 物化视图包含3.66亿个条目。 创建表花费了4小时之后,我们无法创建索引。

create index Idx_TABLE_USERID
on SCHEMANAME.TABLE(USERID);

我们收到错误:

ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired

为什么桌子上有锁?他会填满日志吗?

1 个答案:

答案 0 :(得分:1)

默认情况下,create index是阻塞的DDL语句。这意味着如果基表中有未完成的事务,则无法启动。

您可以通过运行以下内容进行验证:

create table t (
  c1 int
);

insert into t values ( 1 );

然后在第二个会话中进行:

create index i on t ( c1 );

ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired

幸运的是,创建索引具有在线选项。指定它,该语句将变为非阻塞。因此,如果您在第二个会话中运行:

create index i on t ( c1 ) 
  online;

它会坐在那里等待您提交/回滚第一个会话中的插入内容。但是由于现在这是非阻塞的,因此其他会话仍可以在该表中插入/更新/删除行。

不清楚是要在基表之一上还是在物化视图上创建索引。但无论哪种情况,您都会得到错误,因为另一个事务拥有创建索引所需的锁。