oracle資料塊概述
Data Blocks
Oracle 資料庫以資料塊(也稱為 Oracle 塊或頁)為單位,來管理資料庫資料檔案中的邏輯儲存空間。資料塊是資料庫 I/O 的最小單位。
Data Blocks and Operating System Blocks
在物理級別,儲存在磁碟檔案中的資料庫資料由作業系統塊組成。作業系統塊是作業系統可以讀取或寫入的最小資料單位。相比之下, Oracle 塊是一個邏輯儲存結構,其大小和結構對作業系統是透明的。作業系統塊與資料塊的大小可能有所不同。資料庫按資料塊(而不是按作業系統塊)的倍數來請求資料。
Data Block Size
每個資料庫都有一個資料庫塊大小。DB_BLOCK_SIZE 初始化引數在資料庫被建立時設定其資料塊大小。此大小是SYSTEM和SYSAUX表空間的大小,並且是其它表空間的預設大小。不能更改資料庫的塊大小,除非重新建立資料庫。
如果尚未設定 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-Z、a-z、0-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 資料庫才會自動且透明地合併資料塊中的可用空間:
INSERT或UPDATE語句試圖使用的塊,包含足夠的可用空間來容納新的行片斷。
可用空間已被碎片化,以至於該行片斷不能插入到塊中的某一個連續區域。
Reuse of Index Space 重用索引空間
資料庫可以重複使用一個索引塊內的空間。例如,如果您往列中插入了一個值,又將其刪除,而對此列的索引仍然存在,則資料庫可以在某行需要時,重新使用該索引槽位。
資料庫可以重複使用一個索引塊本身。與表塊不同,一個索引塊僅當其完全為空時,它才是空閒的。資料庫將空塊放入索引結構的空閒列表中並使其可重新使用。然而,Oracle 資料庫不會自動壓縮索引: 這需要一個ALTER INDEX REBUILD或COALESCE語句。
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle資料塊格式Oracle
- ORACLE 資料塊格式深入解析Oracle
- Oracle資料庫壞塊典型案例分析Oracle資料庫
- oracle asm 資料塊重構恢復OracleASM
- Oracle資料庫壞塊典型案例擴充Oracle資料庫
- 大資料概述大資料
- 資料庫概述資料庫
- oracle 普通表空間資料檔案壞塊Oracle
- 例項演示oracle資料塊狀態檢視v$bh的用法一 獲取oracle物件所佔用的資料塊Oracle物件
- 4.1.1 Oracle Restart概述OracleREST
- 一次ORACLE資料庫undo壞塊處理Oracle資料庫
- 大資料基本概述大資料
- 2031資料庫概述資料庫
- IndexedDB 資料庫概述Index資料庫
- 01 | 資料庫概述資料庫
- ORACLE系統概述(轉)Oracle
- Oracle Stream概述與配置Oracle
- 資料管道架構概述架構
- BA資料建模概述 - batimesBAT
- 資料庫系統概述資料庫
- 資料結果表概述
- 【資料庫資料恢復】Oracle資料庫檔案出現壞塊報錯的資料恢復案例資料庫資料恢復Oracle
- Oracle資料庫處理壞塊問題常用命令Oracle資料庫
- 檢視Oracle各組成部份(如資料塊頭)的大小Oracle
- 如何處理Oracle資料庫中的壞塊問題(轉)Oracle資料庫
- 區塊鏈系列1-區塊鏈概述區塊鏈
- Oracle 之利用BBED修改資料塊SCN----沒有備份資料檔案的資料恢復Oracle資料恢復
- Oracle Data Guard和Broker概述Oracle
- hive(4)——後設資料概述Hive
- 資料結構筆記——概述資料結構筆記
- 資料庫與資料庫管理系統概述資料庫
- 大資料筆記01--大資料概述大資料筆記
- Oracle索引塊分裂split資訊彙總Oracle索引
- Oracle 備份 與 恢復 概述Oracle
- ORACLE 控制檔案(Control Files)概述Oracle
- 「Oracle」Oracle 資料庫安裝Oracle資料庫
- [Oracle]Oracle資料庫資料被修改或者刪除恢復資料Oracle資料庫
- 資料庫系統概述之國產資料庫資料庫
- 資料結構小白系列之資料結構概述資料結構