По умолчанию 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;
, он будет сидеть там, ожидая, когда вы подтвердите / откатите вставку из первого сеанса.Но поскольку теперь это не блокирует, другие сеансы все еще могут вставлять / обновлять / удалять строки в этой таблице.
Не ясно, пытаетесь ли вы создать индекс для одной из базовых таблиц или материализоватьПосмотреть.Но в любом случае вы получаете ошибку, потому что другая транзакция удерживает блокировку, необходимую для создания индекса.