[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
- 清除行遷移和行連結
- Oracle資料庫中資料行遷移與行連結Oracle資料庫
- 行遷移_行連結的介紹
- 如何消除行連結和行遷移
- 模擬Oracle行遷移和行連結Oracle
- pctused, pctfree, pctincrease , 行遷移 & 行連結
- 行遷移和行連結的檢測
- 排除表中的行連結和行遷移
- 關於行連結和行遷移和消除
- [20160726]行連結行遷移與ITL槽.txt
- [20160729]行連結行遷移與ITL槽4.txt
- [20160727]行連結行遷移與ITL槽2.txt
- [20160728]]行連結行遷移與ITL槽3.txt
- 行連結與行遷移, LOB欄位的儲存及效能影響
- Row Migration and Row Chaining(行遷移和行連結)AI
- [20180402]行連結行遷移與ITL槽6.txt
- [20121116]通過bbed觀察行連結與行遷移.txt
- Oracle中行遷移和行連結的清除及檢測Oracle
- 【轉載】行遷移和行連結(row chaining or row migration)AI
- 【效能優化】消除行連結和行遷移的思路和方法優化
- 【概念】行連結和行遷移的概念、模擬及甄別
- 【效能最佳化】消除行連結和行遷移的思路和方法
- 【轉】【效能最佳化】消除行連結和行遷移的思路和方法
- 關於Oracle資料庫中行遷移/行連結的問題Oracle資料庫
- 高水位線、行遷移行連結
- 行連結(Row chaining)和行遷移(Row Migration)的讀書筆記AI筆記
- 簡單瞭解 oracle update 原理(測試)、 行遷移/行連結基本認識Oracle
- oracle11g_如何模擬產生行連結或行遷移chained_rowsOracleAI
- 查詢行遷移及消除行遷移(chained rows)AI
- oracle實驗記錄 (ROW 壓縮,遷移,連結)Oracle
- 行遷移測試
- 連載一:Oracle遷移文件大全Oracle
- 連載二:Oracle遷移文章大全Oracle
- Oracle行遷移實驗Oracle
- 清除行遷移的例子