2015-07-22 4 views
1

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

CREATE TABLE N_INSP_DTSEDIF_PLANTAS (
    IMPORTACION_ID NUMBER(*,0) NOT NULL, 
    ID NUMBER(10) NOT NULL, 
    INSPECCION_ID NUMBER(10) NOT NULL, 
    NOMBRE_PLANTA VARCHAR2(255 CHAR), 
    NUM_VIVIENDAS NUMBER(10), 
    SUP_CONSTRUIDA_VIVIENDAS DECIMAL(10,4), 
    -- Plus some other columns I don't need  
    CONSTRAINT N_INSP_DTSEDIF_PLANTAS_P PRIMARY KEY (
     IMPORTACION_ID, 
     ID 
    ) ENABLE, 

    CONSTRAINT N_INSP_DTSEDIF_PLANTAS_F FOREIGN KEY (IMPORTACION_ID) 
     REFERENCES IMPORTACION (IMPORTACION_ID) 
     ON DELETE CASCADE 
     ENABLE 
); 

CREATE INDEX N_INSP_DTSEDIF_PLANTAS_X ON N_INSP_DTSEDIF_PLANTAS (IMPORTACION_ID); 

CREATE SEQUENCE N_INSP_DTSEDIF_PLANTAS_S 
INCREMENT BY 1 
START WITH 1 
MINVALUE 1 
CACHE 20; 

CREATE OR REPLACE TRIGGER N_INSP_DTSEDIF_PLANTAS_T 
    BEFORE INSERT 
    ON N_INSP_DTSEDIF_PLANTAS 
    REFERENCING NEW AS NEW OLD AS OLD 
    FOR EACH ROW 
BEGIN 
    IF :NEW.ID IS NULL THEN 
     SELECT N_INSP_DTSEDIF_PLANTAS_S.NEXTVAL INTO :NEW.ID FROM DUAL; 
    END IF; 
END N_INSP_DTSEDIF_PLANTAS_T; 
/
ALTER TRIGGER N_INSP_DTSEDIF_PLANTAS_T ENABLE; 

Я состою это путем проб и ошибок:

CREATE MATERIALIZED VIEW LOG ON N_INSP_DTSEDIF_PLANTAS 
WITH ROWID, SEQUENCE (IMPORTACION_ID, INSPECCION_ID, NUM_VIVIENDAS, SUP_CONSTRUIDA_VIVIENDAS) 
INCLUDING NEW VALUES; 

CREATE MATERIALIZED VIEW V_PLANTAS 
REFRESH FAST 
AS 
SELECT IMPORTACION_ID, INSPECCION_ID, 
SUM(NUM_VIVIENDAS) AS NUM_VIVIENDAS, SUM(SUP_CONSTRUIDA_VIVIENDAS) AS SUP_CONSTRUIDA_VIVIENDAS 
FROM N_INSP_DTSEDIF_PLANTAS 
GROUP BY IMPORTACION_ID, INSPECCION_ID; 

Объектов получить созданы без ошибок и SELECT * FROM V_PLANTAS возвращает данных. Однако представление застопорилось. Новые строки, добавленные в N_INSP_DTSEDIF_PLANTAS, не отображаются в V_PLANTAS.

Что я неправильно понял из документации?

ответ

1

В месиво случайных изменений, которые следуют за паники и отчаяния я нечаянно уронил ON COMMIT пункт:

CREATE MATERIALIZED VIEW V_PLANTAS 
REFRESH FAST ON COMMIT 
AS 
-- ... 

Сам журнал является также недопустимым для быстрого обновления, потому что я также опустили пункт PRIMARY KEY. Оно должно быть как:

CREATE MATERIALIZED VIEW LOG ON N_INSP_DTSEDIF_PLANTAS 
WITH ROWID, PRIMARY KEY, SEQUENCE (INSPECCION_ID, NUM_VIVIENDAS, SUP_CONSTRUIDA_VIVIENDAS) 
INCLUDING NEW VALUES; 

(Говорит, что, стоит отметить, что материализованные таблицы не просто результаты кэша, но довольно большой и сложной особенность, которая требует тщательного планирования и технического обслуживания Во многих ситуациях легче. просто оптимизируйте базовый запрос.)

+0

Я думаю, что вы также, вероятно, хотите, по крайней мере, указать COUNT (NUM_VIVIENDAS) и COUNT (SUP_CONSTRUIDA_VIVIENDAS), поскольку быстрое обновление не может удалить строки из материализованного представления, если последнее вхождение конкретной комбинации IMPORTACION_ID и INSPECCION_ID удаляется из базовой таблицы. Ознакомьтесь с http://docs.oracle.com/cd/B19306_01/appdev.102/b14258/d_mview.htm#CEGGEHHC, чтобы узнать, каковы возможности MView. –

+0

@DavidAldridge Я даже не знал, что это возможно. Это слишком много злоупотреблений, если я попрошу пример? –

+0

У меня был бы хороший обзор материала руководства по хранилищу данных на MVs http://docs.oracle.com/cd/B28359_01/server.111/b28313/basicmv.htm и http://docs.oracle.com/ cd/B28359_01/server.111/b28313/advmv.htm, который даст вам полный обзор этого типа использования МВ. –

Смежные вопросы