Oracle資料塊原理深入剖析

2022-04-08 04:06:05 字數 2691 閱讀 7849

資料塊(oracle data blocks),本文簡稱為「塊」,是oracle最小的儲存單位,oracle資料存放在「塊」中。乙個塊占用一定的磁碟空間。特別注意的是,這裡的「塊」是oracle的「資料塊」,不是作業系統的「塊」。

oracle每次請求資料的時候,都是以塊為單位。也就是說,oracle每次請求的資料是塊的整數倍。如果oracle請求的資料量不到一塊,oracle也會讀取整個塊。所以說,「塊」是oracle讀寫資料的最小單位或者最基本的單位。

塊的標準大小由初始化引數db_block_size指定。具有標準大小的塊稱為標準塊(standard block)。塊的大小和標準塊的大小不同的塊叫非標準塊(nonstandard block)。同一資料庫中,oracle9i及以上版本支援同一資料庫中同時使用標準塊和非標準塊。oracle允許指定5種非標準塊(nonstandard block)。

www.2cto.com  

作業系統每次執行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)。頭部資訊區不存放資料,它存放的整個塊的資訊。頭部資訊區的大小是可變的。一般來說,頭部資訊區的大小介於84位元組(bytes)到107位元組(bytes)之間。

www.2cto.com  

資料塊中自由空間的使用

當往資料庫中插入(insert)資料的時候,塊中的自由空間會減少;當對塊中已經存在的行進行修改(update)的時候(使記錄長度增加),塊中的自由空間也會減少。

delete語句和update語句會使塊中的自由空間增加。當使用delete語句刪除塊中的記錄或者使用update語句把列的值更改成乙個更小值的時候,oracle會釋放出一部分自由空間。釋放出的自由空間並不一定是連續的。通常情況下,oracle不會對塊中不連續的自由空間進行合併。因為合併資料塊中不連續的自由空間會影響資料庫的效能。只有當使用者進行資料插入(insert)或者更新(update)操作,卻找不到連續的自由空間的時候,oracle才會合併資料塊中不連續的自由空間。

對於塊中的自由空間,oracle提供兩種管理方式:自動管理,手動管理

行鏈結和行遷移(row chaining and migrating)

行鏈結(row chaining):如果我們往資料庫中插入(insert)一行資料,這行資料很大,以至於乙個資料塊存不下一整行,oracle就會把一行資料分作幾段存在幾個資料塊中,這個過程叫行鏈結(row chaining)。如下圖所示:

如果一行資料是普通行,這行資料能夠存放在乙個資料塊中;如果一行資料是鏈結行,這行資料存放在多個資料塊中。

www.2cto.com  

行遷移(row migrating):資料塊中存在一條記錄,使用者執行update更新這條記錄,這個update操作使這條記錄變長,這時候,oracle在這個資料塊中進行查詢,但是找不到能夠容納下這條記錄的空間,無奈之下,oracle只能把整行資料移到乙個新的資料塊。原來的資料塊中保留乙個「指標」,這個「指標」指向新的資料塊。被移動的這條記錄的rowid保持不變。行遷移的原理如下圖所示:

無論是行鏈結還是行遷移,都會影響資料庫的效能。oracle在讀取這樣的記錄的時候,oracle會掃瞄多個資料塊,執行更多的i/o。

塊中自由空間的自動管理

oracle使用位圖(bitmap)來管理和跟蹤資料塊,這種塊的空間管理方式叫「自動管理」。自動管理有下面的好處:

◆易於使用

◆更好地利用空間

◆可以對空間進行實時調整

塊中自由空間的手動管理

使用者可以通過pctfree, pctused來調整塊中空間的使用,這種管理方式叫手動管理。相對於自動管理,手動管理方式比較麻煩,不容易掌握,容易造成塊中空間的浪費。

www.2cto.com  

pctfree引數用於指定塊中必須保留的最小空閒空間百分例。之所以要預留這樣的空間,是因為update時,需要這些空間。如果update時,沒有空餘空間,oracle就會分配乙個新的塊,這會產生行遷移(row migrating)。

pctused也是用於設定乙個百分比,當塊中已使用的空間的比例小於這個百分比的時候,這個塊才被標識為有效狀態。只有有效的塊才被允許插入資料。

oracle 資料塊結構

oracle 資料塊是資料庫儲存的最小單位,一般為作業系統塊的n倍。其結構為 塊頭 空行 資料,其實際為縱行結構。塊的標準大小由初始化引數db block size指定。具有標準大小的塊稱為標準塊 standard block 塊的大小和標準塊的大小不同的塊叫非標準塊 nonstandard blo...

oracle 資料塊結構

oracle 資料塊是資料庫儲存的最小單位,一般為作業系統塊的n倍。其結構為 塊頭 空行 資料,其實際為縱行結構。塊的標準大小由初始化引數db block size指定。具有標準大小的塊稱為標準塊 standard block 塊的大小和標準塊的大小不同的塊叫非標準塊 nonstandard blo...

虛函式的內部實現原理深入剖析

今天學c 多型時,對虛函式實現原理有些疑惑。然後爬了很多文,看了很多教程。經過一系列研究,以下是我的理解 多型是c 物件導向三大特性之一 多型分為兩類 靜態多型和動態多型區別 注意 請按照編號順序檢視 說明 include includeusing namespace std 動物類 class a...