Меня сильно ударил антипаттерн значения атрибута сущности .Однажды, несколько лет назад, парень решил, что 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