更新一下,再对视图中的三表主键和rowID加了索引之后,现在更新主连接表的数据刷新还算快,<1秒。但是对B和C表的字段更新时,时间还是巨慢无比,>100秒,对sql进行跟踪后,发现对从表更新时的语句如下:
INSERT INTO "EAM_ASSETII"."MVIEW_TEST" SELECT /*+ NO_MERGE("JV$") */ /*+ */
--所有字段--
FROM
(
SELECT "MAS$"."ROWID" "RID$" , "MAS$".*
FROM
"EAM_ASSETII"."T_ASSET_BASE_INF_VO" "MAS$"
WHERE ROWID IN
(SELECT /*+
CARDINALITY(MAS$ 2) NO_SEMIJOIN */ CHARTOROWID("MAS$"."M_ROW$$") RID$
FROM
"EAM_ASSETII"."MLOG$_T_ASSET_BASE_INF_VO" "MAS$"
WHERE
"MAS$".SNAPTIME$$ > :1 )
) AS OF SNAPSHOT (:2) "JV$",
"T_ASSET_FINANCE_INF" AS OF SNAPSHOT (:2) "MAS$0",
"T_ASSET_ENTRY_VO" AS OF SNAPSHOT (:2) "MAS$2"
WHERE ("MAS$2"."T_ASSET_ENTRY_VO_ID"="JV$"."T_ASSET_ENTRY_VO_ID"(+)
AND "MAS$2"."T_ASSET_ENTRY_VO_ID"="MAS$0"."T_ASSET_ENTRY_VO_ID"(+))
AND NOT EXISTS (
SELECT 1 FROM "EAM_ASSETII"."MVIEW_TEST" "SNA2$"
WHERE
("SNA2$"."ID1" = "MAS$2".ROWID)
AND ("SNA2$"."ID3" = "MAS$0".ROWID OR "MAS$0".ROWID IS NULL )
AND "JV$".RID$ IS NULL)
AND NOT EXISTS (
SELECT 1 FROM "T_ASSET_BASE_INF_VO" AS OF SNAPSHOT (:2) "MAS_INNER$",
"T_ASSET_ENTRY_VO" AS OF SNAPSHOT (:2) "MAS_OUTER$"
WHERE "MAS$2".ROWID = "MAS_OUTER$".ROWID
AND "JV$".RID$ IS NULL
AND "MAS_OUTER$"."T_ASSET_ENTRY_VO_ID"="MAS_INNER$"."T_ASSET_ENTRY_VO_ID"
)
其中 T_ASSET_ENTRY_VO为A表即主表,T_ASSET_BASE_INF_VO为B表即从表1,T_ASSET_FINANCE_INF为C表即从表2.这个语句是更新B表中的一个基础字段生成的insert语句。对应的执行计划如下:
Rows Row Source Operation
------- ---------------------------------------------------
1 FILTER (cr=2534500 pr=53290 pw=8494 time=292329958 us)
630109 HASH JOIN RIGHT OUTER (cr=14067 pr=10973 pw=8494 time=10354142 us)
1 VIEW (cr=8 pr=0 pw=0 time=234 us)
1 NESTED LOOPS (cr=8 pr=0 pw=0 time=227 us)
1 VIEW VW_NSO_1 (cr=7 pr=0 pw=0 time=199 us)
1 SORT UNIQUE (cr=7 pr=0 pw=0 time=195 us)
2 TABLE ACCESS FULL MLOG$_T_ASSET_BASE_INF_VO (cr=7 pr=0 pw=0 time=125 us)
1 TABLE ACCESS BY USER ROWID T_ASSET_BASE_INF_VO (cr=1 pr=0 pw=0 time=24 us)
630109 HASH JOIN RIGHT OUTER (cr=14059 pr=10973 pw=8494 time=7836527 us)
353072 TABLE ACCESS FULL T_ASSET_FINANCE_INF (cr=5228 pr=7 pw=0 time=50 us)
630109 TABLE ACCESS FULL T_ASSET_ENTRY_VO (cr=8831 pr=2472 pw=0 time=1268926 us)
630108 FILTER (cr=2520433 pr=42317 pw=0 time=280764547 us)
630108 MAT_VIEW ACCESS BY INDEX ROWID MVIEW_TEST (cr=2520433 pr=42317 pw=0 time=279379249 us)
630108 INDEX RANGE SCAN MVIEW_TEST_ID1_INDEX (cr=1890325 pr=2705 pw=0 time=17218297 us)(object id 115685)
0 FILTER (cr=0 pr=0 pw=0 time=2 us)
0 NESTED LOOPS (cr=0 pr=0 pw=0 time=0 us)
0 TABLE ACCESS BY USER ROWID T_ASSET_ENTRY_VO (cr=0 pr=0 pw=0 time=0 us)
0 INDEX RANGE SCAN T_ENTRY_ID_INDEX (cr=0 pr=0 pw=0 time=0 us)(object id 115676)
********************************************************************************
请高手分析下并给出优化建议。另外我有一个想法,是否可以在3张基表中使用触发器在insert,update,delete操作之后使用DML语句来更新该物化视图,自己写DML来更新的话肯定会快很多,请各位高手分析下这个方法是否可行。