[20160726]行連結行遷移與ITL槽.txt
[20160726]行連結行遷移與ITL槽.txt
當表中一行的資料不能在一個資料block中放入的時候,這個時候就會發生兩種情況,一種是行連結(Row Chaining),另外一種就是行遷
移(Row Migration)了。
行連結產生在第一次插入資料的時候如果一個block不能存放一行記錄的情況下。這種情況下,Oracle將使用連結一個或者多個在這個段
中保留的block儲存這一行記錄,行連結比較容易發生在比較大的行上,例如行上有LONG、LONG RAW、LOB等資料型別的欄位,這種時候行
連結是不可避免的會產生的。
當一行記錄初始插入的時候事可以儲存在一個block中的,由於更新操作導致行長增加了,而block的自由空間已經完全滿了,這個時候就
產生了行遷移。在這種情況下,Oracle將會遷移整行資料到一個新的block中(假設一個block中可以儲存下整行資料),Oracle會保留被遷
移行的原始指標指向新的存放行資料的block,這就意味著被遷移行的ROW ID是不會改變的。
當發生了行遷移或者行連結,對這行資料操作的效能就會降低,因為Oracle必須要掃描更多的block來獲得這行的資訊.
--我自己並不想講行連結行遷移,而是在一些測試時當發生行連結行遷移時ITL槽數量的變數,透過例子來說明:
1.建立測試環境:
SCOTT@book> @ &r/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
SCOTT@book> create table t (id number ,c1 varchar2(2000),c2 varchar2(2000),c3 varchar2(2000),c4 varchar2(2000),c5 varchar2(2000));
Table created.
2.測試出現行連結的情況:
--首先做1點點說明,如果1條記錄插入新塊中,一般預設僅僅建立2個ITL槽,而如果你使用ctas建立並匯入資料,一般預設僅僅建立3個ITL槽.
--如果在一個塊中存在多個事務,每一個事務佔用1個ITL槽(24位元組),如果itl槽不足,就會動態增加ITL槽的數量,如果資料塊中free空間不
--足,就會出現itl不足的等待事件.如果是索引塊就會出現索引分裂.
--像我前面建立的表,如果插入記錄,正常會建立2個ITL.但是當插入記錄出現行連結會出現什麼情況呢?
insert into t values
(1,lpad('c1',2000,'x'),lpad('c2',2000,'x'),lpad('c3',2000,'x'),lpad('c4',2000,'x'),lpad('c5',2000,'x'));
commit;
--//由於插入的資訊超過一塊所能放下的情況,出現行連結.
SCOTT@book> select rowid,t.id from t;
ROWID ID
------------------ ----------
AAAXT5AAEAAAALvAAA 1
SCOTT@book> @ &r/rowid AAAXT5AAEAAAALvAAA
OBJECT FILE BLOCK ROW DBA TEXT
---------- ---------- ---------- ---------- -------------------- ----------------------------------------
95481 4 751 0 4,751 alter system dump datafile 4 block 751 ;
SCOTT@book> alter system checkpoint;
System altered.
SCOTT@book> alter system dump datafile 4 block 751 ;
System altered.
Block header dump: 0x010002ef
Object id on Block? Y
seg/obj: 0x174f9 csc: 0x03.15754d18 itc: 2 flg: E typ: 1 - DATA
brn: 0 bdba: 0x10002e8 ver: 0x01 opc: 0
inc: 0 exflg: 0
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0007.000.0000188b 0x00c008e2.0620.27 --U- 1 fsc 0x0000.15754d19
0x02 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000
bdba: 0x010002ef
data_block_dump,data header at 0x7f5d2ef22264
===============
tsiz: 0x1f98
hsiz: 0x14
pbl: 0x7f5d2ef22264
76543210
flag=--------
ntab=1
nrow=1
frre=-1
fsbo=0x14
fseo=0xfe6
avsp=0xfd2
tosp=0xfd2
0xe:pti[0] nrow=1 offs=0
0x12:pri[0] offs=0xfe6
block_row_dump:
tab 0, row 0, @0xfe6
tl: 4018 fb: --H-F--- lb: 0x1 cc: 3
nrid: 0x010002ee.0
col 0: [ 2] c1 02
col 1: [2000]
--可以發現ITL的數量是2.再看看行遷移對應的資料塊。
SCOTT@book> @ &r/dfb16 0x010002ee
RFILE# BLOCK# TEXT
---------- ---------- ------------------------------------------------------------
4 750 alter system dump datafile 4 block 750 ;
--檢查轉儲:
Block header dump: 0x010002ee
Object id on Block? Y
seg/obj: 0x174f9 csc: 0x03.15754d18 itc: 3 flg: E typ: 1 - DATA
brn: 0 bdba: 0x10002e8 ver: 0x01 opc: 0
inc: 0 exflg: 0
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0007.000.0000188b 0x00c008e2.0620.26 --U- 1 fsc 0x0000.15754d19
0x02 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000
0x03 0x0000.000.00000000 0x00000000.0000.00 C--- 0 scn 0x0000.00000000
bdba: 0x010002ee
data_block_dump,data header at 0x7f5d2ef2227c
===============
tsiz: 0x1f80
hsiz: 0x14
pbl: 0x7f5d2ef2227c
76543210
flag=--------
ntab=1
nrow=1
frre=-1
fsbo=0x14
fseo=0x804
avsp=0x7f0
tosp=0x7f0
0xe:pti[0] nrow=1 offs=0
0x12:pri[0] offs=0x804
block_row_dump:
tab 0, row 0, @0x804
tl: 6012 fb: -----L-- lb: 0x1 cc: 3
--可以發現出現行遷移的塊itl槽的數量是3.而不是2.也就是出現行連結時對應的塊要增加1個ITL槽,注意那行xid全是0,而flag= C---.
3.測試出現行遷移的情況.
--// drop table t purge;
create table t (id number ,c1 varchar2(2000),c2 varchar2(2000),c3 varchar2(2000),c4 varchar2(2000),c5 varchar2(2000));
insert into t (id ,c1)values (1,lpad('c1',2000,'y'));
insert into t (id ,c1)values (2,lpad('c1',2000,'z'));
commit ;
SCOTT@book> select rowid,t.id from t;
ROWID ID
------------------ ----------
AAAXT6AAEAAAALuAAA 1
AAAXT6AAEAAAALuAAB 2
SCOTT@book> @ &r/rowid AAAXT6AAEAAAALuAAA
OBJECT FILE BLOCK ROW DBA TEXT
---------- ---------- ---------- ---------- -------------------- ----------------------------------------
95482 4 750 0 4,750 alter system dump datafile 4 block 750 ;
SCOTT@book> alter system checkpoint;
System altered.
SCOTT@book> alter system dump datafile 4 block 750 ;
System altered.
Block header dump: 0x010002ee
Object id on Block? Y
seg/obj: 0x174fa csc: 0x03.15754f2b itc: 2 flg: E typ: 1 - DATA
brn: 0 bdba: 0x10002e8 ver: 0x01 opc: 0
inc: 0 exflg: 0
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0001.00c.00000f84 0x00c000fe.0805.05 --U- 2 fsc 0x0000.15754f2c
0x02 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000
bdba: 0x010002ee
data_block_dump,data header at 0x7f5d2ef22264
===============
--//看看轉儲itl槽的數量.可以發現佔用2個ITL槽,與我前面的說明一致.
--修改記錄出現行遷移呢?
update t set c2=lpad('c2',2000,'z'),c3=lpad('c3',2000,'z'),c4=lpad('c4',2000,'z'),c5=lpad('c5',1000,'z') where id=2;
commit;
alter system checkpoint;
--一下子增加7000位元組,1個資料塊已經容納不下,出現行遷移的情況,再做一次轉儲:
SCOTT@book> alter system dump datafile 4 block 750 ;
System altered.
Block header dump: 0x010002ee
Object id on Block? Y
seg/obj: 0x174fa csc: 0x03.15754f60 itc: 2 flg: E typ: 1 - DATA
brn: 0 bdba: 0x10002e8 ver: 0x01 opc: 0
inc: 0 exflg: 0
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0001.00c.00000f84 0x00c000fe.0805.05 C--- 0 scn 0x0003.15754f2c
0x02 0x000a.020.0000cfed 0x00c00330.29c9.01 --U- 1 fsc 0x0000.15754f63
bdba: 0x010002ee
data_block_dump,data header at 0x7f5d2ef22264
===============
....
tab 0, row 1, @0x807
tl: 2015 fb: --H-F--- lb: 0x2 cc: 2
nrid: 0x010002ef.0
col 0: [ 2] c1 03
col 1: [2000]
SCOTT@book> @ &r/dfb16 0x010002ef
RFILE# BLOCK# TEXT
---------- ---------- ------------------------------------------------------------
4 751 alter system dump datafile 4 block 751 ;
Block header dump: 0x010002ef
Object id on Block? Y
seg/obj: 0x174fa csc: 0x03.15754f60 itc: 3 flg: E typ: 1 - DATA
brn: 0 bdba: 0x10002e8 ver: 0x01 opc: 0
inc: 0 exflg: 0
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x000a.020.0000cfed 0x00c0032e.29c9.3e --U- 1 fsc 0x0000.15754f63
0x02 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000
0x03 0x0000.000.00000000 0x00000000.0000.00 C--- 0 scn 0x0000.00000000
bdba: 0x010002ef
data_block_dump,data header at 0x7f5d2ef2227c
--可以發現出現行遷移塊的ITL的數量會增加1個。
4.從上面的測試可以發現只要出現行連結或者行遷移,就會自動增加1個itl槽,當然自由空間要允許的情況下.
--這樣做一個假設,如果1塊中有多個事務出現行連結或者遷移會出現什麼情況呢?做1個行內連結的情況:
--// drop table t purge;
spool a.sql
select 'create table t (' from dual
union all
select 'col'||lpad(rownum-1,3,'0')||' number(1),' from dual connect by level<=1000
union all
select 'constraint t1_pk primary key (col000));' from dual ;
--整理與編輯a.sql 執行它。建立表t。
SCOTT@book> insert into t (col000,col999) values (1,1);
1 row created.
SCOTT@book> commit ;
Commit complete.
--因為一個行片對應欄位255個,這樣就建立了4個行片,這種情況相當於行內連結。參考http://blog.itpub.net/267265/viewspace-2122499/。
SCOTT@book> select rowid,col000 from t;
ROWID COL000
------------------ ----------
AAAXT7AAEAAAALuAAD 1
SCOTT@book> @ &r/rowid AAAXT7AAEAAAALuAAD
OBJECT FILE BLOCK ROW DBA TEXT
---------- ---------- ---------- ---------- -------------------- ----------------------------------------
95483 4 750 3 4,750 alter system dump datafile 4 block 750 ;
SCOTT@book> alter system checkpoint;
System altered.
SCOTT@book> alter system dump datafile 4 block 750 ;
System altered.
Block header dump: 0x010002ee
Object id on Block? Y
seg/obj: 0x174fb csc: 0x03.157550e7 itc: 5 flg: E typ: 1 - DATA
brn: 0 bdba: 0x10002e8 ver: 0x01 opc: 0
inc: 0 exflg: 0
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x000a.005.0000cfe9 0x00c00367.29c9.11 --U- 4 fsc 0x0000.157550e8
0x02 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000
0x03 0x0000.000.00000000 0x00000000.0000.00 C--- 0 scn 0x0000.00000000
0x04 0x0000.000.00000000 0x00000000.0000.00 C--- 0 scn 0x0000.00000000
0x05 0x0000.000.00000000 0x00000000.0000.00 C--- 0 scn 0x0000.00000000
bdba: 0x010002ee
data_block_dump,data header at 0x7f8aec1802ac
===============
--可以發現出現3行一樣的。
0x03 0x0000.000.00000000 0x00000000.0000.00 C--- 0 scn 0x0000.00000000
0x04 0x0000.000.00000000 0x00000000.0000.00 C--- 0 scn 0x0000.00000000
0x05 0x0000.000.00000000 0x00000000.0000.00 C--- 0 scn 0x0000.00000000
--因為在這個資料塊內發生了3次"行連結".透過bbed觀察也可以證明這點:
BBED> set dba 4,750
DBA 0x010002ee (16777966 4,750)
BBED> p kdbt
struct kdbt[0], 4 bytes @186
sb2 kdbtoffs @186 0
sb2 kdbtnrow @188 4
--//注:這裡記錄的是行片數量,如果表欄位小於255,對應行記錄是正確的。
BBED> p kdbr
sb2 kdbr[0] @190 7756
sb2 kdbr[1] @192 7492
sb2 kdbr[2] @194 7228
sb2 kdbr[3] @196 6982
--再插入1條呢?
SCOTT@book> insert into t (col000,col999) values (2,2);
1 row created.
SCOTT@book> alter system checkpoint;
System altered.
SCOTT@book> alter system dump datafile 4 block 750 ;
System altered.
Block header dump: 0x010002ee
Object id on Block? Y
seg/obj: 0x174fb csc: 0x03.157550e7 itc: 6 flg: E typ: 1 - DATA
brn: 0 bdba: 0x10002e8 ver: 0x01 opc: 0
inc: 0 exflg: 0
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x000a.005.0000cfe9 0x00c00367.29c9.11 --U- 4 fsc 0x0000.157550e8
0x02 0x000a.008.0000cfdb 0x00c0036f.29c9.08 ---- 4 fsc 0x0000.00000000
0x03 0x0000.000.00000000 0x00000000.0000.00 C--- 0 scn 0x0000.00000000
0x04 0x0000.000.00000000 0x00000000.0000.00 C--- 0 scn 0x0000.00000000
0x05 0x0000.000.00000000 0x00000000.0000.00 C--- 0 scn 0x0000.00000000
0x06 0x0000.000.00000000 0x00000000.0000.00 C--- 0 scn 0x0000.00000000
bdba: 0x010002ee
data_block_dump,data header at 0x7f8aec1802c4
--有增加1個ITL槽。
總結:
如果出現行連結或者行遷移,ITL槽數量會自動增加。至於為什麼我不是很清楚。
0x06 0x0000.000.00000000 0x00000000.0000.00 C--- 0 scn 0x0000.00000000
--僅僅能理解出現行遷移先預留ITL槽,以備以後需要嗎?不理解。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/267265/viewspace-2122599/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- [20160729]行連結行遷移與ITL槽4.txt
- [20160727]行連結行遷移與ITL槽2.txt
- [20160728]]行連結行遷移與ITL槽3.txt
- [20180402]行連結行遷移與ITL槽6.txt
- [20180327]行遷移與ITL浪費.txt
- 行遷移和行連結
- 【備份恢復】行遷移與行連結
- 清除行遷移和行連結
- Oracle 行遷移 & 行連結的檢測與消除Oracle
- [20121116]通過bbed觀察行連結與行遷移.txt
- 行遷移_行連結的介紹
- 如何消除行連結和行遷移
- Oracle資料庫中資料行遷移與行連結Oracle資料庫
- [20190120]行連結遷移與dml.txt
- 模擬Oracle行遷移和行連結Oracle
- pctused, pctfree, pctincrease , 行遷移 & 行連結
- 行遷移和行連結的檢測
- 排除表中的行連結和行遷移
- 關於行連結和行遷移和消除
- 行連結與行遷移, LOB欄位的儲存及效能影響
- Row Migration and Row Chaining(行遷移和行連結)AI
- 【轉載】行遷移和行連結(row chaining or row migration)AI
- 【效能優化】消除行連結和行遷移的思路和方法優化
- 【概念】行連結和行遷移的概念、模擬及甄別
- 【效能最佳化】消除行連結和行遷移的思路和方法
- Oracle中行遷移和行連結的清除及檢測Oracle
- 海量資料遷移之分割槽並行抽取並行
- 海量資料遷移之分割槽並行切分並行
- [20230425]CBO cost與行遷移關係.txt
- 【轉】【效能最佳化】消除行連結和行遷移的思路和方法
- 行連結(Row chaining)和行遷移(Row Migration)的讀書筆記AI筆記
- 簡單瞭解 oracle update 原理(測試)、 行遷移/行連結基本認識Oracle
- 高水位線、行遷移行連結
- 查詢行遷移及消除行遷移(chained rows)AI
- [20160803]另類行遷移.txt
- [20140213]再論行遷移.txt
- 關於Oracle資料庫中行遷移/行連結的問題Oracle資料庫
- oracle11g_如何模擬產生行連結或行遷移chained_rowsOracleAI