Oracle數(shù)據(jù)塊和操作系統(tǒng)數(shù)據(jù)塊不同,它通常是操作系統(tǒng)數(shù)據(jù)塊大小的若干倍(最高為5倍)。假如操作系統(tǒng)每次讀寫(xiě)磁盤(pán)的數(shù)據(jù)塊是512K,而Oracle的數(shù)據(jù)塊大小為其2倍,那么數(shù)據(jù)庫(kù)中參數(shù):DB_BLOCK_SIZE = 512 * 2。也就是說(shuō)Oracle每次讀寫(xiě)磁盤(pán)的I/O大小是1M。將每次讀入1M數(shù)據(jù)或?qū)懭?M數(shù)據(jù)。
2.Oracle數(shù)據(jù)塊格式
Oracle的數(shù)據(jù)塊中包含了以下信息:
1.基本信息:塊的地址和數(shù)據(jù)類(lèi)型
2.表信息:存儲(chǔ)的數(shù)據(jù)是那個(gè)表的
3.行信息:存儲(chǔ)的是哪些數(shù)據(jù)(可多條)
4.數(shù)據(jù)區(qū):持久化的信息
5.空白區(qū):為用于數(shù)據(jù)存儲(chǔ)的空白區(qū)域
3.Oracle何時(shí)對(duì)數(shù)據(jù)塊碎片進(jìn)行整理
由于刪除或更新而被釋放出來(lái)的空間可能是不連續(xù)的。Oracle會(huì)在以下兩種情形下對(duì)這些不連續(xù)的空間進(jìn)行歸并:
①當(dāng)一個(gè)Insert,update語(yǔ)句試圖使用一個(gè)剩余空間不足的數(shù)據(jù)塊時(shí)。
②剩余空間被分散成多個(gè)碎片而無(wú)法連續(xù)利用
其它情況下Oracle不會(huì)對(duì)數(shù)據(jù)塊的碎片進(jìn)行整理。因?yàn)檫@種對(duì)碎片的整理,歸并工作比起數(shù)據(jù)寫(xiě)入更新可能更加耗時(shí)。
4.PCTFREE、PCTUSED參數(shù)
PCTFREE和PCTUSED參數(shù)允許用戶(hù)對(duì)Oracle數(shù)據(jù)塊的空白區(qū)(Free space)進(jìn)行管理。
①PCTFREE:保留的可用空白空間大小
②PCTUSED:可用的最大數(shù)據(jù)空間
PCTFREE: 只要剩余空白空間降低到PCTFREE指定的水平,將不允許新記錄插入,而僅允許本記錄更新
PCTUSED:只要已使用空間達(dá)到PCTUSED指定的水平,將不允許新記錄插入,而僅允許本記錄更新
這兩個(gè)參數(shù)其實(shí)是兩種不同的控制可用空間說(shuō)法
5.插入操作與PCTFREE參數(shù)
PCTFREE僅對(duì)Insert操作有用,但對(duì)Update無(wú)效。也就是說(shuō)當(dāng)空用空間降低到PCTFREE指定的水平時(shí),將不再允許Insert操作,但Update操作可以照常使用剩余空間。
Oracle為每個(gè)段維護(hù)一或多個(gè)空用鏈表,這些鏈表上的對(duì)象是每一個(gè)未分配的數(shù)據(jù)塊,已經(jīng)分配出去但剩余空間被PCTFREE大的數(shù)據(jù)塊。這些數(shù)據(jù)塊都是可以被用于插入新記錄的。
假如一個(gè)數(shù)據(jù)塊的剩余空間比PCTFREE指定的要小,但又達(dá)到PCTUSED的水平。那么Oracle將把該數(shù)據(jù)塊從可用鏈表上摘下來(lái),因?yàn)樵摂?shù)據(jù)塊肯定是不能用于再插入新記錄的了(這個(gè)時(shí)候就需要進(jìn)行前面我們提到的數(shù)據(jù)塊碎片整理了)。
6.刪除、更新操作與PCTUSED參數(shù)
如果執(zhí)行了一個(gè)Delete或Update語(yǔ)句后,Oracle會(huì)檢查當(dāng)前該數(shù)據(jù)塊的可用空間。判斷其是否比PCTUSED指定的值小,如果是的話將其掛到可用鏈表上作為第一個(gè)可分配空間。
7.PCTFREE與PCTUSED參數(shù)配合使用
①插入操作前檢查數(shù)據(jù)塊的PCTFREE值
②刪除或更新操作后檢查數(shù)據(jù)塊的PCTUSED值
如果PCTFREE值大于指定的水平,或PCTUSED值小于指定的水平則作為可分配空間掛到Free list鏈表上。
-------------------------------------------------------------
生活就像打牌,不是要抓一手好牌,而是要盡力打好一手爛牌。