Оракул-материализованный взгляд изменяет структуру так медленно


У меня есть огромное материализованное представление, которое я должен скорректировать. Это простая настройка, поскольку я просто добавляю функцию 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 4

2 ответа:

Вы не можете изменить определение запроса для материализованного представления - вы должны удалить и воссоздать его. Тем не менее, вы можете попробовать этот подход, это может быть быстрее, чем воссоздание всего MV:

  1. отбросьте материализованный вид, используя команду сохранить таблицу.
  2. обновите данные в таблице, которая раньше была MV, чтобы отразить новые определения столбцов.
  3. воссоздайте материализованное представление, используя предложение 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, должно помочь немного в целом, как только вы определите, что у вас нет проблем, указанных выше.