Я новичок в БД. У нас есть большой набор Materialize-view на нашем рабочем сервере. Все представления обновляются вручную каждые 3 часа в хранимой процедуре через задание.
За последние пару недель возникла проблема, когда произошло обновление MV, БД перешла к операции Peek IO. Загрузка ЦП стала тяжелой, что вызвало медлительность.
Позже мы заметили, что из-за некоторых операций DML/DDL в прошлом на основных таблицах большая часть MV находится в состоянии NEED_COMPILE. Когда фактическое обновление происходит с этим состоянием, регистрируется обнаруженная ошибка «объект не найден».
Пожалуйста, посоветуйте мне соединить точки, чтобы понять проблему,
Переход в состояние NEEDS_COMPILE является ожидаемым поведением при выполнении операции DML/DDL над главными таблицами. Используя REFRESH ON COMMIT, вы получаете другое поведение, потому что эти MV обновляются одновременно с DML. В этом состоянии можно прочитать материализованное представление, но, конечно же, нельзя увидеть обновленные записи. Что касается проблем с производительностью, убедитесь, что журналы MV правильно проиндексированы (обычно требуются индексы для M_ROW$$ и XID$$, где XID$$ заменяет SNAPTIME$$ начиная с Oracle 11gR2). Для повышения производительности могут потребоваться дополнительные индексы. Что касается ошибки «объект не найден», вы должны предоставить подробную информацию о версии Oracle и точный журнал, который вы получите.