Обновляется при фиксации материализованного представления с помощью MAX () - PullRequest
3 голосов
/ 23 января 2012

Меня сильно ударил антипаттерн значения атрибута сущности .Однажды, несколько лет назад, парень решил, что DDL не сексуален, и хотел разработать что-то «достаточно гибкое» , чтобы хранить информацию о людях .Он игнорировал тот факт, что люди привыкли иметь хотя бы некоторые базовые атрибуты, такие как имя, дата рождения и тому подобное.Мало того, он положил кучу (побочных эффектов) пакетов PL / SQL поверх этой схемы.Эта штука стала ключевой подсистемой, на которую опирались другие приложения.

Перемотка вперед на несколько лет и 20 миллионов строк.Парня больше нет в компании, и мне приходится иметь дело с этим.Мне нужно реализовать некоторые базовые поиски, которые сейчас потребуют нескольких внутренних объединений, а в некоторых случаях - просто навсегда.Переписать все это невозможно, поэтому я хочу «развернуть» наиболее важные атрибуты.

Я думал, что материализованные представления могут быть жизнеспособной альтернативой, но мне нужны некоторые рекомендации, поскольку я никогда не использовал их.Я хотел бы получить такую ​​таблицу:

  select
      uid,
       max(case when att = 'NAME' then UPPER(value) end) name,
       max(case when att = 'SURNAME' then UPPER(value) end) surname,
       max(case when att = 'BIRTH' then DATEORNULL(value) end) birth,
     ....,
     count(*) cnt
 from t
 group by uid

, как я понимаю, читая документы Oracle, я смог бы создать материализованное представление "REFRESHABLE ON COMMIT" с MAX () , если запросне имеет условия where .

Но не может заставить его работать.Я пробовал:

create materialized view log on t WITH SEQUENCE,ROWID,(value) INCLUDING NEW VALUES;

create materialized view t_view
 refresh fast on commit
 as
  select
      uid,
       max(case when att = 'NAME' then UPPER(value) end) name,
       max(case when att = 'SURNAME' then UPPER(value) end) surname,
       max(case when att = 'BIRTH' then DATEORNULL(value) end) birth,
     count(*) cnt
 from t
 group by uid

Работает для вставок, но не для обновлений.Я вижу, что способен на эти вещи:

  REFRESH_COMPLETE                                                             

  REFRESH_FAST                                                                 

  REFRESH_FAST_AFTER_INSERT

, но я думаю, что я должен увидеть также REFRESH_FAST_AFTER_ONETAB_DML.Есть идеи?

Обновление: вывод dbms_mview.explain_mview

REFRESH_COMPLETE             |Y|
REFRESH_FAST                 |Y|
REFRESH_FAST_AFTER_INSERT    |Y|
REFRESH_FAST_AFTER_ONETAB_DML|N|mv uses the MIN or MAX aggregate functions
REFRESH_FAST_AFTER_ANY_DML   |N|see the reason why REFRESH_FAST_AFTER_ONETAB_DML is disabled
REFRESH_FAST_PCT             |N|PCT is not possible on any of the detail tables in the mater

1 Ответ

2 голосов
/ 20 февраля 2012

MV_CAPABILITIES_TABLE.MSGTXT не так, что вам действительно нужно заменить case на decode.

Когда я попробовал это на 11g, я получил сообщение CASE expressions present in materialized view. Изменяя его на использование decode исправил это на 10g и 11g.

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