materialized view отказывается компилироваться

daneska
Дата: 30.11.2009 12:32:53
Создается materialized view
...
CREATE MATERIALIZED VIEW ABC.XYZ
ORGANIZATION HEAP PCTFREE 0 PCTUSED 40 INITRANS 1 MAXTRANS 255 COMPRESS LOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
TABLESPACE "USERS"
BUILD IMMEDIATE
USING INDEX
REFRESH COMPLETE ON DEMAND
USING DEFAULT LOCAL ROLLBACK SEGMENT
DISABLE QUERY REWRITE
AS SELECT ...

После создания всё ок, USER_MVIEW.STALENESS = 'FRESH', после изменения данных в мастер-таблицах USER_VIEW.STALENESS становится NEED_COMPILE. Ладно, пытаюсь рефрешить, получаю Compilation Error, пытаюсь компилить перед рефрешем (предварительно пересоздав вьюху и дождавшись статуса Need_Compile) - compilation Error, пытаюсь просто компилить (опять воссоздав момент Need_Compile) - всё равно Compilation Error. Где-то здесь уже писали, что Compilation Error - следствие кривого запроса внутри matview, но запрос работает абсолютно корректно. Какие-нибудь идеи у экспертов?
suPPLer
Дата: 30.11.2009 12:42:00
daneska
Создается materialized view
...
CREATE MATERIALIZED VIEW ABC.XYZ
ORGANIZATION HEAP PCTFREE 0 PCTUSED 40 INITRANS 1 MAXTRANS 255 COMPRESS LOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
TABLESPACE "USERS" 
BUILD IMMEDIATE
USING INDEX 
REFRESH COMPLETE ON DEMAND
USING DEFAULT LOCAL ROLLBACK SEGMENT
DISABLE QUERY REWRITE
AS SELECT ...
После создания всё ок, USER_MVIEW.STALENESS = 'FRESH', после изменения данных в мастер-таблицах USER_VIEW.STALENESS становится NEED_COMPILE. Ладно, пытаюсь рефрешить, получаю Compilation Error, пытаюсь компилить перед рефрешем (предварительно пересоздав вьюху и дождавшись статуса Need_Compile) - compilation Error, пытаюсь просто компилить (опять воссоздав момент Need_Compile) - всё равно Compilation Error. Где-то здесь уже писали, что Compilation Error - следствие кривого запроса внутри matview, но запрос работает абсолютно корректно. Какие-нибудь идеи у экспертов?


Две идеи:
0. Пользоваться тегом SRC.
1. Показать здесь запрос, который работает абсолютно корректно.
daneska
Дата: 30.11.2009 13:15:19
suPPLer, спасибо, вопрос закрыт. Дело было в флаге DISABLE QUERY REWRITE. При refresh представления oracle пытается принудительно выставить флаг в ENABLE. Вот здесь (http://it.toolbox.com/blogs/david/materialized-view-will-become-invalid-after-a-refresh-documented-oracle-bug-in-older-versions-workaround-23095) Дэвид Яхалом пишет, что это характерно для старых версий Oracle, но у меня 10.2.0.4 и, вероятно, та же фигня. В любом случае, обрамляя в джобе refresh альтерами вью с disable query rewrite, получаю STALENESS = FRESH и, соответственно, свежие данные. Всем спасибо за внимание.