Я искал ошибку в своем приложении Java EE для базы данных Oracle: есть материализованное представление, которое не освежает правильно. Если я делаю запрос против MV, он дает мне внешние ключи, которые плохи и кажутся старыми.Получение материализованного представления Oracle для обновления
Так как я могу исправить или заменить этот материализованный вид? Любые мысли приветствуются.
Я попытался освежающие вручную, как это:
DBMS_MVIEW.REFRESH('PRODUCTDESCRIPTIONS', 'C');
я получил ошибку "ORA-00942: таблица или представление не существует". Я не понимаю этого, потому что, когда я запускаю подзапрос MV, это выглядит хорошо.
Веб-интерфейс Apex показывает, что MV не обновлялся более года, поэтому это не новая проблема.
Я искал любые записи из процесса обновления, но не смог найти файл refresh.log.
Я попытался заменить материализованное представление простым запросом, но он слишком медленный. Я был бы счастлив переписать/переконфигурировать/переустановить MV каким-то образом.
База данных и версия ОС:
Oracle Database 10g Express Edition Release 10.2.0.1.0 - Product
PL/SQL Release 10.2.0.1.0 - Production
uname -a:
Linux <server name> 2.6.9-78.0.22.ELsmp #1 SMP Thu Apr 30 19:14:39 EDT 2009 i686 i686 i386 GNU/Linux
Исходный код для материализованного представления:
CREATE MATERIALIZED VIEW "PRODUCTDESCRIPTIONS"
ORGANIZATION HEAP PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS 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 prdcts.primarykey AS product,
prdcts.upcid AS productupcid,
prdcts.description AS productdescription,
prdctctgrs.primarykey AS productcategory,
prdctctgrs.id AS productcategoryid,
prdctctgrs.name AS productcategoryname,
prdctpkgs.primarykey AS productpackage,
prdctpkgs.name AS productpackagename FROM prdctctgrs,
prdcts,
prdctpkgs,
prdctctgrstoprdcts,
prdctstoprdctpkgs
WHERE
prdctctgrstoprdcts.productcategory = prdctctgrs.primarykey
AND prdctctgrstoprdcts.product = prdcts.primarykey
AND prdctstoprdctpkgs.product = prdcts.primarykey
AND prdctstoprdctpkgs.productpackage = prdctpkgs.primarykey
AND bitand(prdctctgrs.metaflags, 1)+0 = 0
AND bitand(prdcts.metaflags, 1)+0 = 0
AND bitand(prdctpkgs.metaflags, 1)+0 = 0
AND bitand(prdctctgrstoprdcts.metaflags, 1)+0 = 0
AND bitand(prdctstoprdctpkgs.metaflags, 1)+0 = 0
/
Это, похоже, работает: запишите SQL из Apex, как указано выше, отбросьте MV, а затем заново создайте его из SQL. (Также замените ON DEMAND на ON COMMIT.) Что-то в этом MV было глубоко перепутано, возможно, с тех пор, как база данных была создана путем восстановления из файла дампа в другой среде. –