[20190120]行連結遷移與dml.txt
[20190120]行連結遷移與dml.txt
--//昨天看的連結,裡面提到DML Tablescans 問題,
--//文章很難讀懂,不過有一個問題至少我以前沒注意,我一直以為如果修改出現行連結遷移的記錄,一定會在對應塊中使用
--//一個ITL槽.而且出現行遷移的記錄一般會在對應塊先建立dITL槽,我一直認為這個是事先預留,避免以後出現ITL槽不足的情況.
--//連結:http://blog.itpub.net/267265/viewspace-2152498/=>[20180402]行連結行遷移與ITL槽6.txt
--//另外作者在連結提到另外一種情況parallel DML.
--//連結http://blog.itpub.net/267265/viewspace-2152498/的一個例子測試.
1.環境:
SCOTT@book> @ ver1
PORT_STRING VERSION BANNER
------------------- ---------- ----------------------------------------------------------------------------
x86_64/Linux 2.4.xx 11.2.0.4.0 Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
2.建立測試例子:
create table t1 (
n1 number,
l1 varchar2(4000),
s1 varchar2(200),
l2 varchar2(4000),
s2 varchar2(200),
l3 varchar2(4000),
s3 varchar2(200)
);
--//L 表示 long長欄位, S表示 short短欄位.
insert into t1 (n1,l1,s1) values(0,rpad('X',4000,'X'),rpad('X',200,'X'));
commit;
insert into t1 (n1,l1) values(1,null);
commit;
update t1 set
l1 = rpad('A',4000),
s1 = rpad('A',200),
l2 = rpad('B',4000),
s2 = rpad('B',200),
l3 = rpad('C',4000),
s3 = rpad('C',200)
where
n1 = 1
;
commit;
execute dbms_stats.gather_table_stats(user,'t1');
update t1 set
s1 = lower(s1),
s2 = lower(s2),
s3 = lower(s3)
where
n1 = 1
;
--//注:沒提交.
SCOTT@book> @ xid
XIDUSN_XIDSLOT_XIDSQN
------------------------------
8.26.1883
alter system flush buffer_cache;
3.分析對應塊,透過bbed觀察::
SCOTT@book> select rowid,n1 from t1 ;
ROWID N1
------------------ ----------
AAAWKiAAEAAABMkAAA 0
AAAWKiAAEAAABMkAAB 1
SCOTT@book> @ rowid AAAWKiAAEAAABMkAAB
OBJECT FILE BLOCK ROW ROWID_DBA DBA TEXT
---------- ---------- ---------- ---------- -------------------- -------------------- ----------------------------------------
90786 4 4900 1 0x1001324 4,4900 alter system dump datafile 4 block 4900
--//首先透過bbed觀察:
BBED> set dba 4,4900
DBA 0x01001324 (16782116 4,4900)
BBED> x /rncccccc dba 4,4900 *kdbr[1]
rowdata[0] @3964
----------
flag@3964: 0x20 (KDRHFH)
lock@3965: 0x02
cols@3966: 0
nrid@3967:0x01001327.0
--//dba= 4,4900 ,僅僅包含nrid,指向下一個塊nrid=0x01001327.0(dba=4,4903),flag=0x20.僅僅包含head標識.繼續往下看:
BBED> set dba 0x01001327
DBA 0x01001327 (16782119 4,4903)
BBED> x /rncccccc dba 0x01001327 *kdbr[0]
rowdata[0] @4167
----------
flag@4167: 0x08 (KDRHFF)
lock@4168: 0x01
cols@4169: 2
hrid@4170:0x01001324.1
nrid@4176:0x01001326.0
col 0[2] @4182: 1
col 1[4000] @4185: A
--//dba = 4,4903. 包含2個欄位n1,l1. 指向下一個塊nrid=0x01001326.0(dba= 4,4902),前一個hrid=0x01001324.1(dba=4,4900).
--//flag=0x01,僅僅包含First標識.繼續往下看:
BBED> set dba 0x01001326
DBA 0x01001326 (16782118 4,4902)
BBED> x /rcccccc dba 0x01001326 *kdbr[0]
rowdata[0] @3975
----------
flag@3975: 0x00 (NONE)
lock@3976: 0x02
cols@3977: 2
nrid@3978:0x01001325.0
col 0[200] @3984: a
col 1[4000] @4185: B
--//dba=4,4902. 包含2個欄位s1,L2. 指向下一個塊nrid=0x01001325.0(dba= 4,4901),奇怪沒有hrid欄位.
--//flag=0x00. 沒有任何資訊.繼續:
BBED> set dba 0x01001325
DBA 0x01001325 (16782117 4,4901)
BBED> x /rcccccc dba 0x01001325 *kdbr[0]
rowdata[0] @3780
----------
flag@3780: 0x04 (KDRHFL)
lock@3781: 0x02
cols@3782: 3
col 0[200] @3783: b
col 1[4000] @3984: C
col 2[200] @7987: c
--//dba=4,4901. 包含3個欄位S2,L3,S3. 最後3個欄位.flag=0x02,包含LAST標識.
--//實際上還可以看出oracle是從最後欄位向前組織資料的.
4.轉儲看看:
SCOTT@book> @ xid
XIDUSN_XIDSLOT_XIDSQN
------------------------------
8.26.1883
alter system dump datafile 4 block 4900;
alter system dump datafile 4 block 4903;
alter system dump datafile 4 block 4902;
alter system dump datafile 4 block 4901;
--//dba = 4,4900
Block header dump: 0x01001324
Object id on Block? Y
seg/obj: 0x162a2 csc: 0x03.177320e3 itc: 2 flg: E typ: 1 - DATA
brn: 0 bdba: 0x1001320 ver: 0x01 opc: 0
inc: 0 exflg: 0
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0008.014.0000075c 0x00c00123.03fa.07 C--- 0 scn 0x0003.17731d8b
0x02 0x0008.01a.0000075b 0x00c00123.03fa.2b ---- 1 fsc 0x0000.00000000
tab 0, row 1, @0xf18
tl: 9 fb: --H----- lb: 0x2 cc: 0
nrid: 0x01001327.0
--//0x1a=26,0x75b=1883
--//flag=--H-----. 使用ITL=0x2. xid=8.26.1883.
--//dba = 4,4903
Block header dump: 0x01001327
Object id on Block? Y
seg/obj: 0x162a2 csc: 0x03.17731d87 itc: 3 flg: E typ: 1 - DATA
brn: 0 bdba: 0x1001320 ver: 0x01 opc: 0
inc: 0 exflg: 0
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0008.014.0000075c 0x00c00123.03fa.06 --U- 1 fsc 0x0000.17731d8b
0x02 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000
0x03 0x0000.000.00000000 0x00000000.0000.00 C--- 0 scn 0x0000.00000000
...
tab 0, row 0, @0xfcb
tl: 4021 fb: ----F--- lb: 0x1 cc: 2
hrid: 0x01001324.1
nrid: 0x01001326.0
col 0: [ 2] c1 02
col 1: [4000]
41 20 20
--//flag=----F---,使用ITL=0x1.注意看這個ITL槽指向的xid並不是0x0008.01a.0000075b(而是0x0008.014.0000075c).
--//這個塊僅僅包含N1,L1欄位,並沒有包含要修改S1,S2,S3欄位.
--//也就是dml並沒有在該塊修改ITL槽.
--//dba = 4,4902
Block header dump: 0x01001326
Object id on Block? Y
seg/obj: 0x162a2 csc: 0x03.177320e4 itc: 3 flg: E typ: 1 - DATA
brn: 0 bdba: 0x1001320 ver: 0x01 opc: 0
inc: 0 exflg: 0
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0008.014.0000075c 0x00c00123.03fa.05 C--- 0 scn 0x0003.17731d8b
0x02 0x0008.01a.0000075b 0x00c00123.03fa.2c ---- 1 fsc 0x0000.00000000
0x03 0x0000.000.00000000 0x00000000.0000.00 C--- 0 scn 0x0000.00000000
...
block_row_dump:
tab 0, row 0, @0xf0b
tl: 4213 fb: -------- lb: 0x2 cc: 2
nrid: 0x01001325.0
col 0: [200]
61 20
--//flag=NONE.使用ITL=0x2,xid=0x0008.01a.0000075b
--//dba = 4,4901
Block header dump: 0x01001325
Object id on Block? Y
seg/obj: 0x162a2 csc: 0x03.177320e4 itc: 3 flg: E typ: 1 - DATA
brn: 0 bdba: 0x1001320 ver: 0x01 opc: 0
inc: 0 exflg: 0
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0008.014.0000075c 0x00c00123.03fa.04 C--- 0 scn 0x0003.17731d8b
0x02 0x0008.01a.0000075b 0x00c00123.03fa.2d ---- 1 fsc 0x0000.00000000
0x03 0x0000.000.00000000 0x00000000.0000.00 C--- 0 scn 0x0000.00000000
tab 0, row 0, @0xe48
tl: 4408 fb: -----L-- lb: 0x2 cc: 3
col 0: [200]
62 20 20 20 20
--//flag=-----L--.使用ITL=0x2,xid=0x0008.01a.0000075b
--//從以上分析可以看出如果dml修改在該塊中沒有對應記錄,並不會使用ITL槽,這個是我以前沒有注意的細節問題.
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/267265/viewspace-2564254/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle 行遷移 & 行連結的檢測與消除Oracle
- [20180402]行連結行遷移與ITL槽6.txt
- Oracle資料庫中資料行遷移與行連結Oracle資料庫
- 模擬Oracle行遷移和行連結Oracle
- [20180327]行遷移與ITL浪費.txt
- [20230425]CBO cost與行遷移關係.txt
- 連載一:Oracle遷移文件大全Oracle
- 連載二:Oracle遷移文章大全Oracle
- 遷移執行緒migration執行緒
- [20240325]FORCE_MATCHING_SIGNATURE與DML.txt
- [20180730]exadata與行連結.txt
- 資料遷移(1)——通過資料泵表結構批量遷移
- PV 與 PVC 狀態遷移
- 傳統 Web 框架部署與遷移Web框架
- 【連結 1】與靜態連結庫連結
- Jenkins搭建與資料遷移實踐Jenkins
- 1.1資料庫物件結構遷移方法資料庫物件
- 世界銀行報告:全球遷移人口增長10%與缺水有關
- 棧遷移
- 遷移公告
- EF Core 小技巧:遷移已經應用到資料庫,如何進行遷移回退操作?資料庫
- 使用Mobilenet和Keras進行遷移學習!Keras遷移學習
- 杉巖資料銀行Documentum遷移方案
- 使用Conda Pack進行環境打包遷移
- 硬連結與軟連結詳解
- 雲資料庫管理與資料遷移資料庫
- mysql 備份與遷移 資料同步方法MySql
- 【遷移】SqlServer 遷移到 MySQL 方法ServerMySql
- 軟連結與硬連結的區別
- 連結串列入門與插入連結串列
- “遷移策略+新容器執行時”應對有狀態應用的冷熱遷移挑戰
- 1.5 使用nvicat和kettle進行全量遷移
- docker映象遷移Docker
- 賬號遷移
- Jenkins Job遷移Jenkins
- Cloudflare 從 PHP 到 Go:遷移與經驗分享CloudPHPGo
- elasticdump資料遷移與內外網安裝AST
- 資料庫平滑遷移方案與實踐分享資料庫