2015-07-22 85 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

我實際上可以很好地瀏覽MV上的數據倉庫指南資料http://docs.oracle.com/cd/B28359_01/server.111/b28313/basicmv.htm和http://docs.oracle.com/ cd/B28359_01/server.111/b28313/advmv.htm,它將爲您提供此特定類型的MV使用情況的完整概述。 –