update操作會產生幾條mlog$日誌?
我們知道,在快速重新整理物化檢視中,源表必須建立物化檢視日誌來記錄源表資料的變化,從而使得物化檢視能夠快速重新整理。
今天以前一位同事提出這樣一個問題:做一個update操作會產生兩個mlog$日誌。這與我印象中產生一條記錄不同。
下面重現這個過程:
首先建立測試資料表:
SQL> create table k(id int primary key,name varchar2(10));
Table created
SQL> create materialized view log on k;
Materialized view log created
SQL> insert into k values(1,'suk');
1 row inserted
SQL> commit;
Commit complete
SQL> create materialized view mv_t as select * from k;
Materialized view created
SQL> select * from mlog$_k;
ID SNAPTIME$$ DMLTYPE$$ OLD_NEW$$ CHANGE_VECTOR$$
---------- ----------- --------- --------- ----------------------
SQL> select * from mv_t;
ID NAME
--------------------------------------- ----------
1 suk
--執行一個更新操作
SQL> update k set name='new' where id=1;
1 row updated
SQL> select * from mlog$_k;
ID SNAPTIME$$ DMLTYPE$$ OLD_NEW$$ CHANGE_VECTOR$$
---------- ----------- --------- --------- ---------------------
1 4000-1-1 U U 04
--產生一條mlog記錄,DML型別為U
SQL> rollback;
Rollback complete
SQL> select * from mlog$_k;
ID SNAPTIME$$ DMLTYPE$$ OLD_NEW$$ CHANGE_VECTOR$$
---------- ----------- --------- --------- ---------------------
--再更新一條記錄,不過這次更新內容包含主鍵
SQL> update k set name='new',id=2 where id=1;
1 row updated
SQL> select * from mlog$_k;
ID SNAPTIME$$ DMLTYPE$$ OLD_NEW$$ CHANGE_VECTOR$$
---------- ----------- --------- --------- --------------------
1 4000-1-1 D O 00
2 4000-1-1 I N FF
--可以看出,更新列包含主鍵的話會產生2條mlog記錄。在這種情況下,一個update操作實際上是由一個DELETE操作和一個INSERT操作組成的。
--其實oracle這樣做有它的道理,如果MV是基於主鍵重新整理的,如果主鍵被update了,如果它不記錄下來原來主鍵ID的話,MV段就不知道那條記錄被update了
--那麼是不是更新內容包含主鍵的話都會產生2條mlog記錄呢?再看看下面的測試:
SQL> rollback;
Rollback complete
SQL> select * from mlog$_k;
ID SNAPTIME$$ DMLTYPE$$ OLD_NEW$$ CHANGE_VECTOR$$
---------- ----------- --------- --------- --------------------
--更新主鍵,但是鍵值與之前一樣
SQL> update k set name='new',id=1 where id=1;
1 row updated
SQL> select * from mlog$_k;
ID SNAPTIME$$ DMLTYPE$$ OLD_NEW$$ CHANGE_VECTOR$$
---------- ----------- --------- --------- ---------------------
1 4000-1-1 U U 04
--可以看到,oracle還是比較聰明的,已經把這種更新情況考慮進去了
--這種方式下,它實際上與更新非主鍵產生操作的mlog是一樣的
總結:
1、更新列都是非主鍵時
每更新一條記錄,在MLOG$會產生一個型別為U的記錄。
2、更新列包含主鍵時
如果鍵值變化,每更新一條記錄,在MLOG$會產生兩條記錄:D和I。
如果鍵值不發生變化,每更新一條記錄,在MLOG$會產生一個型別為U的記錄。
今天以前一位同事提出這樣一個問題:做一個update操作會產生兩個mlog$日誌。這與我印象中產生一條記錄不同。
下面重現這個過程:
首先建立測試資料表:
SQL> create table k(id int primary key,name varchar2(10));
Table created
SQL> create materialized view log on k;
Materialized view log created
SQL> insert into k values(1,'suk');
1 row inserted
SQL> commit;
Commit complete
SQL> create materialized view mv_t as select * from k;
Materialized view created
SQL> select * from mlog$_k;
ID SNAPTIME$$ DMLTYPE$$ OLD_NEW$$ CHANGE_VECTOR$$
---------- ----------- --------- --------- ----------------------
SQL> select * from mv_t;
ID NAME
--------------------------------------- ----------
1 suk
--執行一個更新操作
SQL> update k set name='new' where id=1;
1 row updated
SQL> select * from mlog$_k;
ID SNAPTIME$$ DMLTYPE$$ OLD_NEW$$ CHANGE_VECTOR$$
---------- ----------- --------- --------- ---------------------
1 4000-1-1 U U 04
--產生一條mlog記錄,DML型別為U
SQL> rollback;
Rollback complete
SQL> select * from mlog$_k;
ID SNAPTIME$$ DMLTYPE$$ OLD_NEW$$ CHANGE_VECTOR$$
---------- ----------- --------- --------- ---------------------
--再更新一條記錄,不過這次更新內容包含主鍵
SQL> update k set name='new',id=2 where id=1;
1 row updated
SQL> select * from mlog$_k;
ID SNAPTIME$$ DMLTYPE$$ OLD_NEW$$ CHANGE_VECTOR$$
---------- ----------- --------- --------- --------------------
1 4000-1-1 D O 00
2 4000-1-1 I N FF
--可以看出,更新列包含主鍵的話會產生2條mlog記錄。在這種情況下,一個update操作實際上是由一個DELETE操作和一個INSERT操作組成的。
--其實oracle這樣做有它的道理,如果MV是基於主鍵重新整理的,如果主鍵被update了,如果它不記錄下來原來主鍵ID的話,MV段就不知道那條記錄被update了
--那麼是不是更新內容包含主鍵的話都會產生2條mlog記錄呢?再看看下面的測試:
SQL> rollback;
Rollback complete
SQL> select * from mlog$_k;
ID SNAPTIME$$ DMLTYPE$$ OLD_NEW$$ CHANGE_VECTOR$$
---------- ----------- --------- --------- --------------------
--更新主鍵,但是鍵值與之前一樣
SQL> update k set name='new',id=1 where id=1;
1 row updated
SQL> select * from mlog$_k;
ID SNAPTIME$$ DMLTYPE$$ OLD_NEW$$ CHANGE_VECTOR$$
---------- ----------- --------- --------- ---------------------
1 4000-1-1 U U 04
--可以看到,oracle還是比較聰明的,已經把這種更新情況考慮進去了
--這種方式下,它實際上與更新非主鍵產生操作的mlog是一樣的
總結:
1、更新列都是非主鍵時
每更新一條記錄,在MLOG$會產生一個型別為U的記錄。
2、更新列包含主鍵時
如果鍵值變化,每更新一條記錄,在MLOG$會產生兩條記錄:D和I。
如果鍵值不發生變化,每更新一條記錄,在MLOG$會產生一個型別為U的記錄。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/231499/viewspace-63797/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 減少日誌產生量小結
- 生產資料update沒加where條件(從執行到恢復)
- 解決生產日誌重複列印的問題
- python使用loguru操作日誌Python
- 日誌分析常規操作
- spring-boot-route(十六)使用logback生產日誌檔案Springboot
- Linux系統日誌分為哪幾種?日誌檔案包括幾列內容?Linux
- Filebeat 收集K8S 日誌,生產環境實踐K8S
- 聊一聊如何截獲 C# 程式產生的日誌C#
- 檢視日誌的幾種形式
- webpack watch模式產生*.hot-update.json檔案Web模式JSON
- 操作日誌記錄(包括輸出至自定義日誌檔案)
- MySQL中幾種常見的日誌MySql
- 一條日誌訊息的現代生活
- update表中index索引列對原索引條目做什麼操作?Index索引
- logback下日誌輸出前處理操作——以日誌脫敏為例
- 如何優雅地記錄操作日誌
- 如何優雅的記錄操作日誌?
- 如何優雅地記錄操作日誌?
- Linux如何檢視日誌最後幾行?Linux
- Java日誌記錄幾種實現方案Java
- MybatisPlus中的update操作MyBatis
- 安全生產月各地認真貫徹安全生產十五條措施
- 日本豐田將停產11條生產線
- S/4HANA生產訂單增強WORKORDER_UPDATE方法BEFORE_UPDATE引數分析
- 工作總結!日誌列印的11條建議
- 如何使用Journalctl檢視並操作Systemd日誌
- 一種簡化操作日誌記錄方案
- Swoft AOP 記錄使用者操作日誌
- 微服務體系操作日誌如何記錄?微服務
- 如何記錄可讀性的操作日誌?
- Mysql update誤操作恢復MySql
- 欄位修改記錄操作日誌的實現
- 日誌分析-apache日誌分析Apache
- [20221130]with+materialize會產生日誌嗎.txt
- 簡單ELK配置實現生產級別的日誌採集和查詢實踐
- Beego框架的一條神祕日誌引發的思考Go框架
- String s = new String(" a ") 到底產生幾個物件?物件