Как создать материализованное представление с помощью union (или union all) и объединений - PullRequest
0 голосов
/ 22 июня 2019

Для нужд производительности я хочу создать материализованное представление для опции обновления коммита, используя следующий скрипт:

CREATE TABLE DEVDV 
(DEVDV_ID INTEGER PRIMARY kEY, 
DEVDV_SRC_DVISE_ID INTEGER, 
DEVDV_CIB_DVISE_ID INTEGER);


CREATE TABLE CONDV 
(CONDV_ID INtEgEr PRiMARY KEY, 
CONDV_DEVDV_iD INTEGER, 
CONDV_TX NUMbeR, 
CONDV_DATE_DEB datE, 
CONDV_DATE_FIN DATE);

CREATE MATERIALIZED VIEW LOG ON DEVDV WITH ROWID;

CREATE MATERIALIZED VIEW LOG ON CONDV WITH ROWID;

CREATE MATERIALIZED VIEW MV_DEVDV_TYP_2
REFRESH FAST
ON COMMIT
AS
SELECT DEVDV.ROWID CROWID,
       CONDV.ROWID DROWID,
       DEVDV_ID,
       1 AS MARKER,
       DEVDV_SRC_DVISE_ID,
       DEVDV_CIB_DVISE_ID,
       CONDV_TX, 
       CONDV_DATE_DEB,
       CONDV_DATE_FIN
FROM
    DEVDV INNER JOIN CONDV ON DEVDV_ID = CONDV_DEVDV_ID
UNION ALL
SELECT DEVDV.ROWID CROWID,
       CONDV.ROWID DROW_ID,
       DEVDV_ID,
       2 AS MARKER,
       DEVDV_CIB_DVISE_ID,
       DEVDV_SRC_DVISE_ID,
       1/CONDV_TX, 
       CONDV_DATE_DEB,
       CONDV_DATE_FIN
FROM
    DEVDV INNER JOIN CONDV ON DEVDV_ID = CONDV_DEVDV_ID;

Oracle говорит, что это сложный запрос и он не отвечает требованиям быстрого обновления,

Не могли бы вы сказать мне, какое правило я нарушил?

Спасибо

1 Ответ

1 голос
/ 23 июня 2019

Я не знаю почему, но - для материализованных представлений в Oracle - вы должны использовать старый синтаксис для объединений.Поэтому поместите все таблицы в FROM, разделяя их запятыми, и вставьте условие соединения в предложение where (используйте «(+)» для внешних объединений).

Это работает для меня:

CREATE MATERIALIZED VIEW MV_DEVDV_TYP_2
REFRESH FAST
ON COMMIT
AS
SELECT DEVDV.ROWID CROWID,
       CONDV.ROWID DROWID,
       DEVDV_ID,
       1 AS MARKER,
       DEVDV_SRC_DVISE_ID,
       DEVDV_CIB_DVISE_ID,
       CONDV_TX, 
       CONDV_DATE_DEB,
       CONDV_DATE_FIN
FROM
    DEVDV, CONDV
WHERE DEVDV_ID = CONDV_DEVDV_ID
UNION ALL
SELECT DEVDV.ROWID CROWID,
       CONDV.ROWID DROW_ID,
       DEVDV_ID,
       2 AS MARKER,
       DEVDV_CIB_DVISE_ID,
       DEVDV_SRC_DVISE_ID,
       1/CONDV_TX, 
       CONDV_DATE_DEB,
       CONDV_DATE_FIN
FROM
    DEVDV, CONDV 
WHERE DEVDV_ID = CONDV_DEVDV_ID;

Materialized view MV_DEVDV_TYP_2 created.
...