數據塊(Oracle Data Blocks)本文簡稱為塊是Oracle最小的存儲單位Oracle數據存放在塊中一個塊占用一定的磁盤空間特別注意的是這裡的塊是Oracle的數據塊不是操作系統的塊
Oracle每次請求數據的時候都是以塊為單位也就是說Oracle每次請求的數據是塊的整數倍如果Oracle請求的數據量不到一塊Oracle也會讀取整個塊所以說塊是Oracle讀寫數據的最小單位或者最基本的單位
塊的標准大小由初始化參數DB_BLOCK_SIZE指定具有標准大小的塊稱為標准塊(Standard Block)塊的大小和標准塊的大小不同的塊叫非標准塊(Nonstandard Block)同一數據庫中Oraclei及以上版本支持同一數據庫中同時使用標准塊和非標准塊Oracle允許指定種非標准塊(Nonstandard Block)
操作系統每次執行I/O的時候是以操作系統的塊為單位Oracle每次執行I/O的時候都是以Oracle的塊為單位
Oracle數據塊大小一般是操作系統塊的整數倍
數據塊的格式(Data Block Format)
塊中存放表的數據和索引的數據無論存放哪種類型的數據塊的格式都是相同的塊由塊頭(header/Common and Variable)表目錄(Table Directory)行目錄(Row Directory)空余空間(Free Space)和行數據(Row Data)五部分組成
如下圖所示
塊頭(header/Common and Variable)存放塊的基本信息如塊的物理地址塊所屬的段的類型(是數據段還是索引段) 表目錄(Table Directory)存放表的信息即如果一些表的數據被存放在這個塊中那麼這些表的相關信息將被存放在表目錄中
行目錄(Row Directory)如果塊中有行數據存在則這些行的信息將被記錄在行目錄中這些信息包括行的地址等
行數據(Row Data)是真正存放表數據和索引數據的地方這部分空間是已被數據行占用的空間
空余空間(Free Space)空余空間是一個塊中未使用的區域這片區域用於新行的插入和已經存在的行的更新
頭部信息區(Overhead)我們把塊頭(header/Common and Variable)表目錄(Table Directory)行目錄(Row Directory)這三部分合稱為頭部信息區(Overhead)頭部信息區不存放數據它存放的整個塊的信息頭部信息區的大小是可變的一般來說頭部信息區的大小介於字節(bytes)到字節(bytes)之間
數據塊中自由空間的使用
當往數據庫中插入(INSERT)數據的時候塊中的自由空間會減少當對塊中已經存在的行進行修改(UPDATE)的時候(使記錄長度增加)塊中的自由空間也會減少
DELETE語句和UPDATE語句會使塊中的自由空間增加當使用DELETE語句刪除塊中的記錄或者使用UPDATE語句把列的值更改成一個更小值的時候Oracle會釋放出一部分自由空間釋放出的自由空間並不一定是連續的通常情況下Oracle不會對塊中不連續的自由空間進行合並因為合並數據塊中不連續的自由空間會影響數據庫的性能只有當用戶進行數據插入(INSERT)或者更新(UPDATE)操作卻找不到連續的自由空間的時候Oracle才會合並數據塊中不連續的自由空間
對於塊中的自由空間Oracle提供兩種管理方式自動管理手動管理
行鏈接和行遷移(Row Chaining and Migrating)
行鏈接(Row Chaining)如果我們往數據庫中插入(INSERT)一行數據這行數據很大以至於一個數據塊存不下一整行Oracle就會把一行數據分作幾段存在幾個數據塊中這個過程叫行鏈接(Row Chaining)如下圖所示
如果一行數據是普通行這行數據能夠存放在一個數據塊中如果一行數據是鏈接行這行數據存放在多個數據塊中
行遷移(Row Migrating)數據塊中存在一條記錄用戶執行UPDATE更新這條記錄這個UPDATE操作使這條記錄變長這時候Oracle在這個數據塊中進行查找但是找不到能夠容納下這條記錄的空間無奈之下Oracle只能把整行數據移到一個新的數據塊原來的數據塊中保留一個指針這個指針指向新的數據塊被移動的這條記錄的ROWID保持不變行遷移的原理如下圖所示
無論是行鏈接還是行遷移都會影響數據庫的性能Oracle在讀取這樣的記錄的時候Oracle會掃描多個數據塊執行更多的I/O
塊中自由空間的自動管理
Oracle使用位圖(bitmap)來管理和跟蹤數據塊這種塊的空間管理方式叫自動管理自動管理有下面的好處
◆易於使用
◆更好地利用空間
◆可以對空間進行實時調整
塊中自由空間的手動管理
用戶可以通過PCTFREE PCTUSED來調整塊中空間的使用這種管理方式叫手動管理相對於自動管理手動管理方式比較麻煩不容易掌握容易造成塊中空間的浪費
PCTFREE參數用於指定塊中必須保留的最小空閒空間百分例之所以要預留這樣的空間是因為UPDATE時需要這些空間如果UPDATE時沒有空余空間Oracle就會分配一個新的塊這會產生行遷移(Row Migrating)
PCTUSED也是用於設置一個百分比當塊中已使用的空間的比例小於這個百分比的時候這個塊才被標識為有效狀態只有有效的塊才被允許插入數據
From:http://tw.wingwit.com/Article/program/Oracle/201311/17425.html