物化檢視日誌對UPDATE的影響
物化檢視日誌的功能是記錄基表的DML修改,使得物化檢視可以透過物化檢視日誌上的記錄進行快速重新整理。
那麼物化檢視日誌記錄基本修改的同時,是否會對基表的DML產生一定的影響。
由於物化檢視日誌會將UPDATE主鍵的操作變成DELETE和INSERT,那麼實際上基表執行的是什麼操作呢,下面做一個簡單的測試驗證一下,首先是不包含物化檢視日誌的情況:
SQL> CREATE TABLE T (ID NUMBER PRIMARY KEY, NAME VARCHAR2(30));
表已建立。
SQL> INSERT INTO T VALUES (1, 'A');
已建立 1 行。
SQL> INSERT INTO T VALUES (2, 'A');
已建立 1 行。
SQL> UPDATE T SET ID = 3 WHERE ID = 1;
已更新 1 行。
SQL> COMMIT;
提交完成。
SQL> SELECT GROUP#, SEQUENCE#, STATUS FROM V$LOG;
GROUP# SEQUENCE# STATUS
---------- ---------- ----------------
1 31 INACTIVE
2 32 CURRENT
3 30 INACTIVE
SQL> COL MEMBER FORMAT A50
SQL> SELECT GROUP#, MEMBER FROM V$LOGFILE;
GROUP# MEMBER
---------- --------------------------------------------------
1 E:\ORACLE\ORADATA\YTK92\REDO01.LOG
2 E:\ORACLE\ORADATA\YTK92\REDO02.LOG
3 E:\ORACLE\ORADATA\YTK92\REDO03.LOG
SQL> ALTER SYSTEM SWITCH LOGFILE;
系統已更改。
SQL> EXEC SYS.DBMS_LOGMNR.ADD_LOGFILE('E:\ORACLE\ORADATA\YTK92\REDO02.LOG', SYS.DBMS_LOGMNR.NEW)
PL/SQL 過程已成功完成。
SQL> EXEC SYS.DBMS_LOGMNR.START_LOGMNR(OPTIONS => SYS.DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG)
PL/SQL 過程已成功完成。
SQL> SELECT SQL_REDO FROM V$LOGMNR_CONTENTS WHERE SEG_NAME = 'T' AND SEG_OWNER = USER;
SQL_REDO
-------------------------------------------------------------------------------------
CREATE TABLE T (ID NUMBER PRIMARY KEY, NAME VARCHAR2(30));
insert into "YANGTK"."T"("ID","NAME") values ('1','A');
insert into "YANGTK"."T"("ID","NAME") values ('2','A');
update "YANGTK"."T" set "ID" = '3' where "ID" = '1' and ROWID = 'AAAH1NAAJAAAAJoAAA';
SQL> EXEC SYS.DBMS_LOGMNR.END_LOGMNR
PL/SQL 過程已成功完成。
下面新增物化檢視日誌,再執行一下更新操作:
SQL> CREATE MATERIALIZED VIEW LOG ON T;
實體化檢視日誌已建立。
SQL> UPDATE T SET NAME = 'B' WHERE ID = 2;
已更新 1 行。
SQL> UPDATE T SET ID = 1 WHERE ID = 3;
已更新 1 行。
SQL> COMMIT;
提交完成。
SQL> SELECT ID, DMLTYPE$$, OLD_NEW$$ FROM MLOG$_T;
ID D O
---------- - -
2 U U
3 D O
1 I N
可以看到,對於非主鍵的更新再物化檢視中就是一條更新記錄,而對於主鍵的更新,再物化檢視日誌中記錄了兩條,一條刪除,一條插入。
那麼實際上Oracle是如何執行的,看看LOGMNR得到的結果:
SQL> SELECT GROUP#, SEQUENCE#, STATUS FROM V$LOG;
GROUP# SEQUENCE# STATUS
---------- ---------- ----------------
1 31 INACTIVE
2 32 ACTIVE
3 33 CURRENT
SQL> ALTER SYSTEM SWITCH LOGFILE;
系統已更改。
SQL> EXEC SYS.DBMS_LOGMNR.ADD_LOGFILE('E:\ORACLE\ORADATA\YTK92\REDO03.LOG', SYS.DBMS_LOGMNR.NEW)
PL/SQL 過程已成功完成。
SQL> EXEC SYS.DBMS_LOGMNR.START_LOGMNR(OPTIONS => SYS.DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG)
PL/SQL 過程已成功完成。
SQL> SELECT SQL_REDO FROM V$LOGMNR_CONTENTS WHERE SEG_NAME = 'T' AND SEG_OWNER = USER;
SQL_REDO
---------------------------------------------------------------------------------------
update "YANGTK"."T" set "NAME" = 'B' where "NAME" = 'A' and ROWID = 'AAAH1NAAJAAAAJoAAB';
update "YANGTK"."T" set "ID" = '1' where "ID" = '3' and ROWID = 'AAAH1NAAJAAAAJoAAA';
SQL> EXEC SYS.DBMS_LOGMNR.END_LOGMNR
PL/SQL 過程已成功完成。
可以看到,Oracle實際上執行的仍然是UPDATE語句,而不是DELETE加INSERT語句,物化檢視日誌上只不過是為了方便記錄的假象。
SQL> UPDATE T SET ID = 2 WHERE ID = 2;
已更新 1 行。
SQL> DELETE T WHERE ID = 1;
已刪除 1 行。
SQL> COMMIT;
提交完成。
SQL> SELECT GROUP#, SEQUENCE#, STATUS FROM V$LOG;
GROUP# SEQUENCE# STATUS
---------- ---------- ----------------
1 34 CURRENT
2 32 INACTIVE
3 33 ACTIVE
SQL> ALTER SYSTEM SWITCH LOGFILE;
系統已更改。
SQL> EXEC SYS.DBMS_LOGMNR.ADD_LOGFILE('E:\ORACLE\ORADATA\YTK92\REDO01.LOG', SYS.DBMS_LOGMNR.NEW)
PL/SQL 過程已成功完成。
SQL> EXEC SYS.DBMS_LOGMNR.START_LOGMNR(OPTIONS => SYS.DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG)
PL/SQL 過程已成功完成。
SQL> SELECT SQL_REDO FROM V$LOGMNR_CONTENTS WHERE SEG_NAME = 'T' AND SEG_OWNER = USER;
SQL_REDO
-------------------------------------------------------------------------------------------
update "YANGTK"."T" set "ID" = '2' where "ID" = '2' and ROWID = 'AAAH1NAAJAAAAJoAAB';
delete from "YANGTK"."T" where "ID" = '1' and "NAME" = 'A' and ROWID = 'AAAH1NAAJAAAAJoAAA';
SQL> SELECT ID, DMLTYPE$$, OLD_NEW$$ FROM MLOG$_T;
ID D O
---------- - -
2 U U
3 D O
1 I N
2 U U
1 D O
SQL> EXEC SYS.DBMS_LOGMNR.END_LOGMNR
PL/SQL 過程已成功完成。
再看一下UPDATE語句主鍵的值不發生變化的情況,這時物化檢視日誌並沒有拆分成DELETE和INSERT,顯然,把UPDATE變成DELETE和INSERT語句只是物化檢視日誌的行為,而不是物化檢視基表上實際執行的情況。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4227/viewspace-351786/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【物化檢視】幾種物化檢視日誌分析
- Oracle 物化檢視快速重新整理對效能的影響Oracle
- 物化檢視日誌的維護
- 【物化檢視】根據物化檢視日誌快速重新整理物化檢視的過程
- 檢視insert,delete,update對基表的影響(檢視初識)delete
- 物化檢視的快速重新整理測試與物化檢視日誌
- oracle物化檢視日誌系列(一)Oracle
- oracle物化檢視日誌系列(二)Oracle
- oracle物化檢視日誌系列(三)Oracle
- 物化檢視日誌表被DROP後建立物化檢視報錯
- 物化檢視匯出匯入可能導致物化檢視日誌的失效
- Oracle如何根據物化檢視日誌快速重新整理物化檢視Oracle
- 物化檢視重新整理並非完全根據物化檢視日誌記錄
- 物化檢視日誌與增量重新整理
- Update操作對索引的影響索引
- 10G物化檢視PCT快速重新整理不再需要物化檢視日誌(三)
- 10G物化檢視PCT快速重新整理不再需要物化檢視日誌(二)
- 10G物化檢視PCT快速重新整理不再需要物化檢視日誌(一)
- 【MV】group by查詢子句是否包含count(*)對物化檢視重新整理的影響
- 多個物化檢視導致物化日誌無法及時更新
- 隱式轉換影響物化檢視查詢重寫
- 物化檢視日誌無法正常清除的解決方法
- 物化檢視日誌的重建 與 ORA-12034
- 用exp、imp遷移包含物化檢視日誌的資料
- SYS使用者的表無法建立物化檢視日誌
- 【體系結構】dump檢視update操作redo日誌
- 【TUNE_ORACLE】Oracle檢查點(四)檢查點對redo日誌的影響和redo日誌大小設定建議Oracle
- 物化檢視comlete重新整理會產生大量的日誌
- 手工rm刪除歸檔日誌對備份歸檔日誌的影響
- 物化檢視日誌(materialized view log)引起大量Dfs Lock Handle等待ZedView
- Oracle11gr2物化檢視日誌新增PURGE語句Oracle
- 檢視日誌
- 監聽狀態對dataguard及其日誌傳輸的影響
- Oracle11gr2物化檢視日誌新增COMMIT SCN語句OracleMIT
- RMAN備份恢復之歸檔日誌對BLOCKRECOVER的影響BloC
- 物化檢視妙用__表同步使用物化檢視方法
- 檢視docker映象的日誌Docker
- MYSQL啟用日誌和檢視日誌MySql