整理自Oracle 11g R2 官方文檔《concepts》
001 概述
Oracle資料庫以資料塊(也稱為Oracle塊或頁)為機關,來管理資料庫資料檔案中的邏輯存儲空間。資料塊是資料庫I/O的最小機關。
002 資料塊和作業系統塊
在實體級别,存儲在磁盤檔案中的資料庫資料由作業系統塊組成。作業系統塊是作業系統可以讀取或寫入的最小資料機關。相比之下,Oracle塊是一個邏輯存儲結構,其大小和結構對作業系統是透明的。下圖顯示作業系統塊與資料塊的大小可能有所不同。資料庫按資料塊(而不是按作業系統塊)的倍數來請求資料。

當資料庫請求一個資料塊時,作業系統将此操作轉換為對永久存儲資料的多個請求。資料塊與作業系統塊的邏輯分離具有以下含義:
·應用程式不需要确定磁盤上的資料的實體位址。
·資料庫資料可以在多個實體磁盤上進行條帶化或鏡像。
003 資料塊大小
每個資料庫都有一個資料庫塊大小。DB_BLOCK_SIZE初始化參數在資料庫被建立時設定其資料塊大小。此大小是system和sysaux表空間的大小,并且是其他表空間的預設大小。不能更改資料庫的塊大小,除非重新建立資料庫。
如果尚未設定DB_BLOCK_SIZE,則預設資料塊大小特定于作業系統。資料庫的标準資料塊大小為4KB或8KB。如果資料塊和作業系統塊的大小不同,則資料塊大小必須是作業系統塊大小的整數倍。
004 表空間塊大小
你可以建立其塊大小不同于DB_BLOCK_SIZE設定值的表空間。當你需要将一個可移動表空間移動到一個不同的平台時,非标準的塊大小非常有用。
005 資料塊格式
每個資料塊有一個格式或内部結構,使得資料庫能夠跟蹤塊中的資料和可用空間。各種資料塊的格式是類似的,無論其包含的是表、索引、或表簇資料。下圖顯示了一個未壓縮的資料塊的格式,由上而下依次是即塊頭、表目錄、行目錄、空閑空間和行資料。
006 資料塊開銷
Oracle資料庫使用塊開銷來管理塊本身。塊開銷不能用來存儲使用者資料。塊開銷将包括以下部分:
·塊頭
此部分包含關于塊的一般資訊,包括磁盤位址和段類型。對于事務管理塊,其塊頭包含活動的和曆史的事務資訊。
每個更新塊的事務都需要一個事務條目。 Oracle 資料庫預先在塊頭中為事務條目保留白間。 在配置設定給段用于支援事務性更改的資料塊中,當塊頭空間耗盡時,可用空間也可以容納事務條目。事務條目所需的的空間取決于作業系統。但是, 絕大多數作業系統中的事務條目需要大約 23 個位元組。
·表目錄
對于堆組織表,此目錄包含有關其行存儲在該塊中的表的中繼資料。多個表可以将行存儲在相同的塊中。
·行目錄
對于堆組織表,此目錄描述該塊的資料部分中的行的位置。當已在行目錄中配置設定空間後,即使在行被删除後,資料庫也不會回收此空間。是以,就算某塊現在是空的,但若之前曾經達到 50 行,則在行目錄仍會保留已配置設定的 100 位元組。僅在塊中插入新行時,資料庫才會重用此空間。
塊開銷的某些部分是大小固定的,但總的大小是可變的。平均起來,塊開銷總計在 84 到 107 位元組左右。
007 行格式
塊的行資料部分包含實際資料,如表行或索引鍵條目等。正如每個資料塊具有一個内部的格式,每一行也有一個格式,使得資料庫能夠跟蹤行中的資料。
Oracle資料庫以可變長度記錄形式來存儲行。行包含在一個或多個行片斷中。每個行片斷有一個行頭和列資料。
·行頭
Oracle資料庫使用行頭來管理存儲在塊中的行片斷。行頭包含以下資訊:
行片斷中的各列
表簇的簇鍵
位于其他資料塊中的各個行片斷
如果整個行可以插入到一個資料塊中,則Oracle資料庫将該行存儲為一個行片斷。但是,如果所有行資料不能插入一個單一的塊,或者一個更新導緻現有的行不能容納在原來的塊中,則資料庫将該行存儲為多個行片斷。資料塊中通常每行隻包含一個行片斷。
包含在一個塊中的完全行至少有 3 個位元組的行頭。
·列資料
在行頭之後的列資料部分存儲行中的實際資料。行片斷通常按 CREATE TABLE 語句中列出的順序來存儲列,但這個順序并不總是能保證的。例如,LONG 類型列總是在最後。
如上圖所示,對行片斷中的每一列,Oracle 資料庫獨立地存儲列長度和列資料。所需的空間取決于資料類型。如果列的資料類型是可變長度的,則用于容納一個值所需的空間可能在其資料被更新時會增長和收縮。
每一行都在資料塊标頭的行目錄中有一個槽位。槽位指向行的開始部分。
·Rowid 格式
Oracle 資料庫使用一個 rowid 唯一地辨別一行。在内部, rowid 是一個結構,用于儲存資料庫通路行所需要的資訊。一個 rowid 并不實體地存儲在資料庫中,而是從存儲資料的檔案和塊推導而來的。
擴充的 rowid 包括資料對象号。這種 rowid 類型使用每個行的實體位址的 64 進位編碼。編碼的字元為 A-Z、 a-z、 0-9、 +、和/。
下面的示例用來查詢 ROWID 僞列來顯示 employees 表中雇員 100 的所在行的 擴充 rowid。
ROWID
------------------
AAAVTFAAFAAAADPAAA
一個擴充 rowid 以一個四段式格式顯示, OOOOOOFFFBBBBBBRRR, 此格 式分為以下幾個元件:
· OOOOOO
資料對象号辨別段,即data object number(如示例中的資料對象 AAAVTF)。 資料庫中的每個段都被配置設定了一個資料對象号。同一段中的模式對象( 如一 個表簇)具有相同的資料對象号。
· FFF
表空間相對資料檔案号,即relative file number,辨別包含行的資料檔案 (如示例中的檔案 AAF)。
·BBBBBB
資料塊号辨別包含行的塊,即block number( 如示例中的塊 AAAADP) 。塊号是 相對于他們的資料檔案的,而不是其表空間。是以, 具有相同塊号的 兩行,可以駐留在同一表空間的不同資料檔案中。
· RRR
行号辨別塊中的行,即row number(如示例中的 AAA) 。
在一個 rowid 被配置設定給一個行片斷後, 該 rowid 在特殊情況下可以更改。例如,如果啟用了行移動,則 rowid 可能會因為分區鍵更新、閃回表操作、收縮表操作等而發生變化。如果禁用了行移動,則如果使用 Oracle 資料庫實用程式導出和導入了行,其 rowid 可能會發生變化。
注意:
在内部,資料庫執行行移動,就像行是被實體地删除、然後又重新插入。不過,行移動被認為是更新,會隐含觸發觸發器。