Невозможно создать индекс, LOCK для материализованного представления - PullRequest
0 голосов
/ 17 апреля 2019

Я создал материализованное представление в Oracle.Я использовал логи, чтобы включить / использовать быстрое обновление.Основная таблица содержит ~ 12 миллиардов записей, объединяющая таблицу ~ 8 миллионов.Материализованное представление содержит 366 миллионов записей.После создания таблицы, которая заняла 4 часа, мы не можем создать индекс.

create index Idx_TABLE_USERID
on SCHEMANAME.TABLE(USERID);

Получаем ошибку:

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

Почему на столе есть блокировка?Заполняет ли он логи?

1 Ответ

1 голос
/ 17 апреля 2019

По умолчанию 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;

, он будет сидеть там, ожидая, когда вы подтвердите / откатите вставку из первого сеанса.Но поскольку теперь это не блокирует, другие сеансы все еще могут вставлять / обновлять / удалять строки в этой таблице.

Не ясно, пытаетесь ли вы создать индекс для одной из базовых таблиц или материализоватьПосмотреть.Но в любом случае вы получаете ошибку, потому что другая транзакция удерживает блокировку, необходимую для создания индекса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...