oracle資料塊概述

fywocp發表於2013-11-21

Data Blocks

Oracle 資料庫以資料塊(也稱為 Oracle 塊或頁)為單位,來管理資料庫資料檔案中的邏輯儲存空間。資料塊是資料庫 I/O 的最小單位。

Data Blocks and Operating System Blocks

在物理級別,儲存在磁碟檔案中的資料庫資料由作業系統塊組成。作業系統塊是作業系統可以讀取或寫入的最小資料單位。相比之下, Oracle 塊是一個邏輯儲存結構,其大小和結構對作業系統是透明的。作業系統塊與資料塊的大小可能有所不同。資料庫按資料塊(而不是按作業系統塊)的倍數來請求資料。

Data Block Size

每個資料庫都有一個資料庫塊大小。DB_BLOCK_SIZE 初始化引數在資料庫被建立時設定其資料塊大小。此大小是SYSTEMSYSAUX表空間的大小,並且是其它表空間的預設大小。不能更改資料庫的塊大小,除非重新建立資料庫。

如果尚未設定 DB_BLOCK_SIZE,則預設資料塊大小特定於作業系統。資料庫的標準資料塊大小為 4 KB 8 KB。如果資料塊和作業系統塊的大小不同,則資料塊大小必須是作業系統塊大小的整數倍。

你可以建立其塊大小不同於DB_BLOCK_SIZE設定值的表空間。當你需要將一個可移動表空間移動到一個不同的平臺時。

Data Block Format

每個資料塊有一個格式或內部結構,使得資料庫能夠跟蹤塊中的資料和可用空間。各種資料塊的格式是類似的,無論其包含的是表、 索引、或表簇資料。圖顯示了一個未壓縮的資料塊的格式.

Data Block Overhead

Oracle 資料庫使用塊開銷來管理塊本身。塊開銷不能用來儲存使用者資料。

塊開銷將包括以下部分:

塊頭

此部分包含關於塊的一般資訊,包括磁碟地址和段型別。對於事務管理塊,其塊頭包含活動的和歷史的事務資訊。

每個更新塊的事務都需要一個事務條目。Oracle 資料庫預先在塊頭中為事務條目保留空間。在分配給段用於支援事務性更改的資料塊中,當塊頭空間耗盡時,可用空間也可以容納事務條目。事務條目所需的的空間取決於作業系統。但是,絕大多數作業系統中的事務條目需要大約 23 個位元組。

表目錄

對於堆組織表,此目錄包含有關其行儲存在該塊中的表的後設資料。多個表可以將行儲存在相同的塊中。

行目錄

對於堆組織表,此目錄描述該塊的資料部分中的行的位置。當已在行目錄中分配空間後,即使在行被刪除後,資料庫也不會回收此空間。因此,就算某塊現在是空的,但若之前曾經達到 50 行,則在行目錄仍會保留已分配的100 位元組。僅在塊中插入新行時,資料庫才會重用此空間。

Row Format

塊的行資料部分包含實際資料,如錶行或索引鍵條目等。正如每個資料塊具有一個內部的格式,每一行也有一個行格式,使得資料庫能夠跟蹤行中的資料。

Oracle 資料庫以可變長度記錄形式來儲存行。行包含在一個或多個行片斷中。每個行片斷有一個行頭和列資料。圖顯示了行格式。

Row Header

Oracle 資料庫使用行頭來管理儲存在塊中的行片斷。行頭包含以下資訊:

行片斷中的各列

位於其他資料塊中的各個行片斷

如果整個行可以插入到一個資料塊中,則Oracle資料庫將該行儲存為一個行片斷。但是,如果所有行資料不能插入一個單一的塊,或者一個更新導致現有的行不能容納在原來的塊中,則資料庫將該行儲存為多個行片斷(請參閱"連結行和遷移行")。資料塊中通常每行只包含一個行片斷。

表簇的簇鍵(見"表簇概述"

Column Data

在行頭之後的列資料部分儲存行中的實際資料。對行片斷中的每一列, Oracle 資料庫獨立地儲存列長度和列資料。所需的空間取決於資料型別。如果列的資料型別是可變長度的,則用於容納一個值所需的空間可能在其資料被更新時會增長和收縮。

Rowid

Oracle 資料庫使用一個rowid唯一地標識一行。在內部,rowid 是一個結構,用於儲存資料庫訪問行所需要的資訊。一個 rowid 並不物理地儲存在資料庫中,而是從儲存資料的檔案和塊推導而來的。

擴充套件的 rowid 包括資料物件號。這種rowid 型別使用每個行的實體地址的 64進位編碼。編碼的字元為 A-Za-z0-9+、和/

圖說明了一個擴充套件的 rowid 的格式。

一個擴充套件 rowid 以一個四段式格式顯示,OOOOOOFFFBBBBBBRRR,此格式分為以下幾個元件:

OOOOOO

資料物件號標識段 (如示例中12-1中的資料物件AAAPec)。資料庫中的每個段都被分配了一個資料物件號。同一段中的模式物件(如一個表簇)具有相同的資料物件號。

FFF

表空間相對資料檔案號,標識包含行的資料檔案 (如示例12-1中的檔案 AAF)

BBBBBB

資料塊號標識包含行的塊 (如示例12-1中的塊AAAABS)。塊號是相對於他們的資料檔案的,而不是其表空間。因此,具有相同塊號的兩行,可以駐留在同一表空間的不同資料檔案中。

RRR

行號標識塊中的行(如示例 12-1中的 AAA)。

在一個 rowid被分配給一個行片斷後,該rowid 在特殊情況下可以更改。例如,如果啟用了行移動,則rowid 可能會因為分割槽鍵更新、 閃回表操作、 收縮表操作等而發生變化。如果禁用了行移動,則如果使用 Oracle 資料庫實用程式匯出和匯入了行,其rowid可能會發生變化。

在內部,資料庫執行行移動,就像行是被物理地刪除、然後又重新插入。不過,行移動被認為是更新,會隱含觸發觸發器。

Data Block Compression

資料庫可以使用表壓縮來消除在資料塊中的重複值。使用基本表壓縮和OLTP 表壓縮的資料塊,其格式與一個未壓縮的塊實質上是相同的。區別是使用位於塊開頭的符號表來儲存行和列的重複值。資料庫使用一個到符號表的短引用來替換這些重複出現的值。

假定示例12-2中的行,儲存在具有七個列的sales表的某個資料塊中。

2190,13770,25-NOV-00,S,9999,23,161

2225,15720,28-NOV-00,S,9999,25,1450

34005,120760,29-NOV-00,P,9999,44,2376

9425,4750,29-NOV-00,I,9999,11,979

1675,46750,29-NOV-00,S,9999,19,1121

當在此表上應用基本或 OLTP 表壓縮時,資料庫會將重複值替換為一個符號引用。示例12-3是壓縮的一個概念性展示,使用符號*替換了29-NOV-00,而使用%替換了9999

示例12-3 sales表中的OLTP壓縮行

2190,13770,25-NOV-00,S,%,23,161

2225,15720,28-NOV-00,S,%,25,1450

34005,120760,*,P,%,44,2376

9425,4750,*,I,%,11,979

1675,46750,*,S,%,19,1121

Space Management in Data Blocks

隨著資料庫從底向上不斷填充資料塊,在行資料和塊頭之間的可用空間就會逐漸減少。在更新期間,當將一個尾部空值更改為非空值時,可用空間也會變少。資料庫會管理資料塊中的可用空間,以優化效能並避免空間浪費。

Percentage of Free Space in Data Blocks

PCTFREE 儲存引數對於資料庫如何管理其可用空間非常重要。此SQL 引數設定為更新現有的行而保留的可用空間最小百分比。因此,PCTFREE 對於防止行遷移並避免空間浪費非常重要。

例如,假設您建立了一個只是偶爾需要更新的表,其中大多數更新都不會增加現有資料的大小。你可以在CREATE TABLE 語句中指定 PCTFREE 引數,如下所示:

CREATE TABLE test_table (n NUMBER) PCTFREE 20;

Coalescing Fragmented Space 合併碎片空間

被釋放的空間與資料塊可用空間的主要區域可能是連續的,也可能是不連續的,不連續的可用空間稱為碎片空間。只有在滿足以下條件時,Oracle 資料庫才會自動且透明地合併資料塊中的可用空間:

INSERTUPDATE語句試圖使用的塊,包含足夠的可用空間來容納新的行片斷。

可用空間已被碎片化,以至於該行片斷不能插入到塊中的某一個連續區域。

Reuse of Index Space 重用索引空間

資料庫可以重複使用一個索引塊內的空間。例如,如果您往列中插入了一個值,又將其刪除,而對此列的索引仍然存在,則資料庫可以在某行需要時,重新使用該索引槽位。

資料庫可以重複使用一個索引塊本身。與表塊不同,一個索引塊僅當其完全為空時,它才是空閒的。資料庫將空塊放入索引結構的空閒列表中並使其可重新使用。然而,Oracle 資料庫不會自動壓縮索引: 這需要一個ALTER INDEX REBUILDCOALESCE語句。

Chained and Migrated Rows 連結和已遷移的行

Oracle 資料庫必須管理太大而不能放入一個單一塊的行。可能存在下列情況:

該行太大,在它第一次插入時,無法放入一個資料塊。

在行連結中,Oracle 資料庫將資料儲存在為段保留的一個或多個被連結的資料塊中。行連結最經常出現在大行中。

超過 255 個列的行。

Oracle 資料庫在一個行片斷中只能儲存 255 的列。因此,如果你在具有1000個列的表中插入行,則資料庫將建立 4個行片斷,通常會連結多個塊。

12-14 描述了向資料塊中插入大行的情形。行對於左邊的塊太大,所以資料庫通過將第一個行片斷放入在左邊的塊,將第二個行片斷放入右邊的塊中,形成行連結。

本來可以放入一個資料塊的行,在更新後整體行長增加了,但沒有足夠的可用空間來容納更新的行。

在行遷移中,假設行可以容納在一個新塊中,Oracle 資料庫將整個行移動到一個新的資料塊。已遷移行的原始行片斷,包含一個指標或“轉發地址”到包含已遷移行的新塊。已遷移行的 rowid 不會更改。

當行被連結或遷移時,檢索資料所需的 I/O 會增加。會導致這種情況是因為 Oracle 資料庫必須掃描多個塊以檢索行資訊。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25427762/viewspace-777178/,如需轉載,請註明出處,否則將追究法律責任。

相關文章