Oracle - Materialized View меняет структуру так медленно
У меня огромный взгляд, который мне нужно настроить. Это простая настройка, так как я просто добавляю функцию NVL в оператор выбора.
Т.е. оригинал...
Select this,
that.....
Т.е. модифицированный
Select NVL(this, orThat) as this,
NVL(That, orThis) as that
Выполнение запроса занимает 26 секунд, но из-за количества извлеченных строк (2,3 миллиона) он чрезвычайно медленный. Это бежало в течение почти 5 дней подряд, а затем я остановил его.
Это проблема, особенно потому, что мне нужно доставить это клиенту, и они не могут запустить скрипт в течение 5+ дней для создания MV.
Вопрос: Есть ли способ ускорить изменение / воссоздание MV? Было бы быстрее, если бы я изменил MV или это было бы примерно так же, как сброс и воссоздание?
Версия Oracle = 10 г
2 ответа
Вы не можете изменить определение запроса для материализованного представления - вы должны удалить его и создать заново. Тем не менее, вы можете попробовать этот подход, это может быть быстрее, чем воссоздание всего MV:
- Отбросьте материализованное представление, используя PRESERVE TABLE.
- Обновите данные в таблице, которая раньше была MV, чтобы отразить новые определения столбцов.
- Создайте заново материализованное представление, используя предложение ON PREBUILT TABLE.
Если у вас есть индексы в представлении, может быть полезно отключить и перестроить их.
5+ дней на постройку 2-3 миллионов рядов МВ? Это слишком много, чтобы быть просто плохим SQL. Я предполагаю, что вы можете быть заблокированы каким-то другим процессом (?). Не уверен, но проверьте это из другого сеанса после запуска перестройки MV:
select s1.username || '@' || s1.machine
|| ' ( SID=' || s1.sid || ' ) is blocking '
|| s2.username || '@' || s2.machine || ' ( SID=' || s2.sid || ' ) ' AS blocking_status
from v$lock l1, v$session s1, v$lock l2, v$session s2
where s1.sid=l1.sid and s2.sid=l2.sid
and l1.BLOCK=1 and l2.request > 0
and l1.id1 = l2.id1
and l2.id2 = l2.id2 ;
Просто предположение. Если вы используете Toad, вы также можете получить эту информацию (через Database->monitor->session session). Это также покажет вам прогресс Long Ops (сканирование таблицы и т. Д.).
Изменить: О, кстати, построить MV с помощью nologging, должно немного помочь в целом, как только вы решите, что у вас нет проблем, указанных выше.