數據塊(Data Blocks)


■ 概述

Oracle的所有數據都是以數據文件的形式存儲的,Oracle使用和分配存儲的最小邏輯單位是:數據塊

在操作系統的物理層面上,也有數據塊的概念,但跟Oracle的數據塊不一樣,操作系統是以字節為單位存儲數據的

Oracle請求數據時,它請求的是Oracle的數據塊,而不是物理層面上操作系統的數據塊

數據塊也有大小的,通過初始化參數DB_BLOCK_SIZE可以設定數據塊的標准大小(standard block size),此外,也可指定5個非標准塊大小

數據塊的大小應為操作系統的塊大小的倍數,但同時也要確保其不要超過最大限制,以確保出現不必要的I/O

■ 數據塊格式(Data Block Format)

數據塊內存儲的內容可以是表,索引,簇等數據內容,但不管存儲的是什么,它們的格式都是相似的

 

□ 頭(Common and Variable Header)

包含了數據塊的一般信息,例如數據塊的地址和段的類型(例如,數據或索引)

□ 表目錄(Table Directory)

包含了數據塊中表的信息,這些表包含着行數據

□ 行目錄(Row Directory)

包含了數據塊中實際行的信息(包括行數據區域中每個行段的地址)

□ 塊開銷(Overhead)

數據塊的頭、表目錄和行目錄統稱為塊開銷

一些塊開銷的大小是固定的,總的塊開銷大小是可變的

平均而言,數據塊開銷的固定和可變部分總計84到107字節

□ 行數據(Row Data)

包含了表或索引的數據

數據是可以跨塊的,比如一個數據庫表的數據量較大,它的數據在一個塊內不能全部存儲,剩下的部分可以存儲在其他數據塊里

□ 可用空間(Free Space)

可用空間用於插入新行和更新行數據時,所需要的額外空間(例如,當行中的null更新為非null值時)

在為表或簇的數據段或索引的索引段分配的數據塊中,可用空間還可以保存事務條目(transaction entry)

當在塊內對一條或多條記錄進行增刪改查操作時,是需要一個事務條目的

事務條目所需空間的大小取決於所在的操作系統,大多數操作系統中的事務條目大約需要23個字節

■ 可用空間管理

可用空間的管理方式即可以是自動的,也可以是手動的

可用空間可以在數據庫段內被自動管理

段內可用/已用空間的使用是通過位圖來追蹤的,而不是空閑列表

段內空間通過以自動方式來管理,有以下好處:

  1) 方便使用

  2) 更好的空間利用率,特別是對於行大小變化很大的對象

  3) 對並發訪問中的變化進行更好的運行時調整

  4) 在性能/空間利用率方面有更好的多實例行為

在創建的表空間是以本地管理的方式時,可以將段內空間管理方式為設為自動,這樣在此表空間中創建的所有段都會使用該設置

□ 數據塊中可用空間的可用性與優化

以下兩種類型的語句可以增加數據塊的可用空間

  1) DELETE語句

  2) UPDATE語句(將現有值更新為更小值)

在以下條件下,這些類型語句釋放的空間可用於后續INSERT語句:

  1) 如果INSERT語句與釋放空間的語句在同一事務中,並且在釋放空間的語句之后,則INSERT語句可以使用可用的空間

  2) 如果INSERT語句與釋放空間的語句不在同一事務中(可能由另一個用戶運行),則INSERT語句只能在其他事務提交之后,並且只有在需要空間時才可以使用可用的空間

釋放的空間未必是與數據塊中的可用空間的主要區域相鄰的

當滿足以下兩個條件時,Oracle才會對數據塊的可用空間進行合並:

  1) INSERT或UPDATE語句使用該數據塊時,該數據塊擁有足夠的空閑空間來包含新的行片段

  2) 數據塊的可用空間被分段,以至於無法將新的行片段插入到塊的連續部分中

Oracle只在以上情況下進行這種壓縮,否則會因為數據塊中的可用空間的不停壓縮而降低數據庫系統的性能

□ 行鏈接和行遷移

◆ 行鏈接(row chaining)

表中一行的數據可能太大,而無法放入單個數據塊中

第一次插入行時,該行太大,無法放入一個數據塊中

在這種情況下,Oracle將該行的數據存儲在該段內保留的數據塊中(一個或多個)

行鏈接通常發生在大行中,例如包含數據類型為LONG或LONG RAW的行

在這些情況下,行鏈接是不可避免的

◆ 行遷移(row migration)

原來適合於一個數據塊的行被更新,使得整個行長度增加,並且塊的可用空間已經被完全填滿

在這種情況下,Oracle將整行的數據遷移到一個新的數據塊中,假設整行可以放入一個新的塊中

Oracle保留已遷移行的原始行片段,以指向包含已遷移行的新塊

已遷移行的rowid不會更改

◆ 注意

當一行被鏈接或遷移時,與該行關聯的I/O性能會降低,因為Oracle必須掃描多個數據塊才能檢索該行的信息

■ PCTFREE, PCTUSED和行鏈接

對於手動管理的表空間,通過以下兩個參數管理可用空間,來控制指定段內的所有數據塊中的行的插入和更新操作

  PCTFREE

  PCTUSED

在創建或更改表或集群(它有自己的數據段)時指定這些參數

還可以在創建或更改索引(索引有自己的索引段)時指定存儲參數PCTFREE

□ PCTFREE

PCTFREE參數用於設置數據塊內要保留為可用空間的最小百分比,以便對該塊中已存在的行進行可能的更新時有足夠的空間

例如,在createtable語句中指定以下參數

PCTFREE 20

這說明該表的數據段中每個數據塊的20%是空閑的,並且可以對每個塊中已有的行進行可能的更新

新行可以添加到行數據區,相應的信息可以添加到開銷區域的可變部分,直到行數據和開銷總計占總塊大小的80%

□ PCTUSED 

PCTUSED參數用於設置向數據塊內添加新行之前,已使用空間(行數據加開銷所占空間)的最小百分比

在將數據塊填充到PCTFREE確定的限制后,Oracle將認為該塊不可用於插入新行,直到該塊的百分比低於參數PCTUSED

在獲得該值之前,Oracle只使用數據塊的可用空間來更新數據塊中已經包含的行

例如,假設在CREATETABLE語句中指定以下參數

PCTUSED 40

表示只有當該表數據段的數據塊的已用空間量降至39%或更低(假設該塊的已用空間以前已達到PCTFREE),才可用於插入任何新行

□ PCTFREE和PCTUSED如何一起工作

通過同時使用PCTFREE和PCTUSED,可以達到優化使用數據段中的數據塊中的空間的作用

在新分配的數據塊中,可用於插入的空間是:塊大小 - (塊開銷 + 可用空間(PCTFREE))

對現有數據的更新操作可以使用塊中的任何可用空間

因此,更新可以將塊的可用空間減少到小於PCTFREE,PCTFREE是為更新保留的空間,不可用於插入

 

Oracle針對每個數據段和索引段維護一個或多個空閑列表,這些空閑列表中包含着分配給該段對應的區的數據塊,它們的可用空間都是大於PCTFREE的,因此這些塊可用於插入

執行INSERT語句時,Oracle會檢查空閑列表中的第一個可用數據塊,並在可能的情況下使用它

如果該塊中的可用空間不足以容納插入的數據,並且該塊至少已占用PCTUSED,則Oracle會將該塊從空閑列表中移除

當並發插入發生時,每個段的多個空閑列表可以減少空閑列表的爭用

 

當Oracle執行完DELETE或UPDATE語句后,將檢查塊中使用的空間現在是否小於PCTUSED

如果是,那么該塊將轉到事務空閑列表的開頭,並且將其列為該事務中要使用的第一個可用塊

當事務提交時,塊中的可用空間可用於其他事務

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM