Oracle - Materialized View меняет структуру так медленно - PullRequest
4 голосов
/ 18 мая 2011

У меня есть огромный materailized вид, который я должен настроить.Это простая настройка, поскольку я просто добавляю функцию NVL в оператор выбора.

Т.е. Оригинал ...

Select this,
       that.....

Т.е. Модифицировано

Select NVL(this, orThat) as this,
       NVL(That, orThis) as that

выполнение запроса занимает 26 секунд, но из-за количества извлеченных строк (2,3 миллиона) он чрезвычайно медленный.Он работал почти 5 дней подряд, а затем я остановил его.

Это проблема, особенно потому, что мне нужно доставить это клиенту, и они не могут запустить скрипт в течение 5+ дней, чтобы создатьMV.

Вопрос: Есть ли способ ускорить изменение / воссоздание MV?Было бы быстрее, если бы я изменил MV или это было бы примерно так же, как сброс и воссоздание?

Версия Oracle = 10g

Ответы [ 2 ]

9 голосов
/ 18 мая 2011

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

  1. Удалите материализованное представление, используя PRESERVE TABLE.
  2. Обновите данные в таблице, котораяРаньше был MV для отражения новых определений столбцов.
  3. Создайте заново материализованное представление, используя предложение ON PREBUILT TABLE.

Если у вас есть индексы для представления, это может быть полезночтобы отключить и восстановить их.

1 голос
/ 18 мая 2011

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

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