在實際的應用中,如果行分鏈與行遷移經常刪除,那么可能不能重用塊中的自由空間,所以對于這種情況,我們要利用空間的話,可以把pctused設置高點主要是在INSERT操作期間引發行分鏈操作。而行的遷移主要由UPDATE操作引起。
行鏈接
行鏈接: Insert or Update引起,一個Row存在不同的block中, 行不同部分通過不同塊地址(ROWID)鏈成一個鏈,可以通過設置大的DB_BLOCK_SIZE來減少行鏈接的發生,但無法避免(LOB)
行遷移: Update引起,由于PCTFREE過小,ROWID未變, 可以通過增大PCTFREE的值減少行遷移的發生。
行分鏈是DB_BLOCK_SIZE設置不夠大,以至于對于一些大的行(比如varchar2(32666),blob,clob的長度,大于塊大小(比如4K))這樣一個塊肯定不能保存一行記錄,就需要將行分開保存到不同的塊中.特別是blob這樣的類型,最好設置一個單獨的表空間來保存實際的數據.
包含一個LONG/LONG RAW列時,在這種情況下,后者通常保存在最后Oracle維護一個LOB定位器允許對行外LOB快速訪問。LOB定位器,大約有24個字節大小,DISABLE STORAGE IN ROW參數來實現保存在行外(分散開),不管數據大小行分鏈很難控制(除非通過選擇DB_BLOCK_SIZE足夠大,可以裝下整個行,這通常是不可能的)。然而,行遷移可以通過CREATE / ALTER TABLE命令的PCTFREE和PCTUSED參數有效控制。
>>>>>另一種發生行鏈接是在行遷移不成功的情況下進行的,如UPDATE操作引起。當更新一行使其大小增加
而塊中的當前自由空間不足以放下該行,那么就把整個行取出來放到一個有足夠空間的塊中(如果沒有塊
有所需的空間放整行,行要分成鏈;如果即使行分成鏈仍然沒有足夠的空間,那么產生一個錯誤消息
“ORA-1650-55:Unable to extend)
行遷移
我們如果要更新一行(更新總是允許的),并將其行加大,而加大的行所需要的空間大于塊中的自由空間時.假使我們把一行中多出的空間放到另一個塊中,而另一行放在原來塊中(這就是行分鏈接),從而使原來塊100%的填充.這樣好象只會在單獨的行時會發生,ORACLE會把這整行遷移到其他能容納空間的塊中(這就是行遷移).這樣會在原來的塊中留一個行頭,行頭中保留了放實際行的塊的地址.對于行鏈接,但是應用程序從來不知道這些,使用SQL也沒有什么不同,他只是性能上的原因.如果通過索引來讀取這行,索引會指向最初的新塊不僅是使用了兩個左右的IO讀取索引,加上一個IO讀取這張表1通過使用PCTFREE保持每塊中的自由空間,允許行仍位于原來的塊中,不用管這種擴張。
如果PCTFREE為0,那么所有的自由空間將被INSERT使用,后續的UPDATE將使行遷移到另外一個塊中,以適合擴展的需要。
在理想的情況下,設置PCTFREE為位于行大小的中間值與最大值之間。例如,如果行大小的中間值估計為大約900字節,最大的行大小為1255字節,那么設置PCTFREE值在10(缺?。┖?0之間是比較合理的。
新聞熱點
疑難解答