Оракул-материализованный взгляд изменяет структуру так медленно
У меня есть огромное материализованное представление, которое я должен скорректировать. Это простая настройка, поскольку я просто добавляю функцию NVL в инструкцию select.
То есть оригинал...
Select this,
that.....
То есть модифицированный
Select NVL(this, orThat) as this,
NVL(That, orThis) as that
Выполнение запроса занимает 26 секунд, но из-за количества извлеченных строк (2,3 миллиона) он работает очень медленно. Он работал почти 5 дней подряд, а затем я остановил его.
Это проблема, тем более, что мне нужно доставить это клиенту, а они не могут запустить скрипт на 5+ дней для создания МВ.
Вопрос: Есть ли способ ускорить изменение / восстановление МВ? Будет ли это быстрее, если я изменю МВ, или это будет примерно то же самое, что падение и воссоздание?
Oracle version = 10g
2 ответа:
Вы не можете изменить определение запроса для материализованного представления - вы должны удалить и воссоздать его. Тем не менее, вы можете попробовать этот подход, это может быть быстрее, чем воссоздание всего MV:
- отбросьте материализованный вид, используя команду сохранить таблицу.
- обновите данные в таблице, которая раньше была MV, чтобы отразить новые определения столбцов.
- воссоздайте материализованное представление, используя предложение ON PREBUILT TABLE.
Если у вас есть индексы на представлении, это может быть полезно отключить и перестроить их.
5+ дней, чтобы построить 2-3 миллиона строк MV? Это вааааай из ума, слишком много, чтобы быть просто бедным SQL. Я предполагаю, что вы можете быть заблокированы каким-то другим процессом(?). Не уверен, но проверьте это из другого сеанса после запуска MV rebuild:
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 browser). Это также покажет вам прогресс длительных операций (сканирование таблиц и т. д.).
Edit: Oh, кстати, постройте MV, используя nologging, должно помочь немного в целом, как только вы определите, что у вас нет проблем, указанных выше.