oracle concept——data block,extent,segment-01

dotaddjj發表於2011-08-30

現在開始再次下定決定好好看看oracle concept,幾個月前看了一兩天太抽象了後面就慢慢沒怎麼看了,要堅持啊!裡面對oracle資料庫體系結構和原理的講解很全面,而且文件中有些細節後面需要再檢視別的資料結合實際來驗證,精度細讀之.

當建立一個物件表,索引或者分割槽表等,將會建立一個這個物件的段,如果段內空間不足將分配新的extent,但是段內的資料是透過block來管理也是最小的I/O單位。

Block是資料庫中的最小單位,Block中主要分為:

塊頭:主要記錄的是塊的型別 塊的地址

表目錄區:此資料塊的對應的表的資訊

行目錄區:此資料塊的對應的資料行片段資訊,因為有些資料行資訊可能無法放置在一個資料塊中,此時可能會發生資料行遷移或者連結。

(當一個資料塊中資料行被清除後,此時的行目錄區依然沒有被回收,只有在資料塊中insert 新資料時,行目錄區才會被重新利用。)

行資料:表或索引的實際資料,一個資料行可以跨多個資料塊

可用空間區:此資料塊的可用空間,如果此資料塊屬於索引,簇表或表的資料段,在其可用空間區中還可能儲存事務條目。此資料塊中資料行row正在dml語句訪問,此資料快中就需要儲存事務條目transaction entry

管理開銷:

上述的資料塊塊頭,行目錄區,表目錄區一起稱為管理開銷

行遷移和行連結:

資料行遷移是因為往一個block中插入資料行時,一個資料塊無法容納,這種情況oracle將此資料行儲存在段內一個資料鏈chain中,在插入大量資料時會發生資料行遷移。

資料連結在因為更新一個block中資料行資訊時,更新後的欄位導致block中無法容納此資料行,此時會在原資料行的位置儲存一個資料塊的指標,被遷移資料行的rowid保持不變。

此時由於訪問更多的資料塊,將造成更多的I/O消耗。

擴充套件

在資料塊的上一級儲存單位是資料擴充套件extent,段內空間的分配都是以擴充套件為單位的,擴充套件是在物理位置連續的資料塊。一個資料擴充套件存在於同一資料檔案上。當需要新的資料擴充套件時,此時將為這個段分配新的資料擴充套件,也就是增量資料擴充套件。大於或等於已有資料擴充套件。

為了管理需要,段頭都包含此段內資料擴充套件的目錄

Oracle8I後都是本地管理表空間,此時無法指定表空間的initialnextpctincreaseminextents,但是可以作用於段,對於temporary tablespace,必須指定uniform固定容量。

本地管理的表空間分配:

Oracle為段分配新的資料擴充套件時,先找到此段的表空間所在的資料檔案,檢視資料檔案頭部點陣圖,如果有足夠的連續可用空間就分配使用,沒有就繼續查詢別的資料檔案。

本地管理的表空間回收:

Oracle資料庫提供了segment advisor工具,依據方案物件schema object儲存空間中的碎片程度來判斷此物件中是否包含可回收的空間

一般來說,使用者將一個段對應的方案物件移除drop之前,此段的資料擴充套件不會被回收到空間中,不過例外有:

1 使用truncate。。。drop storage將表 cluster的資料清除

2 命令回收段中未使用的資料擴充套件

alter tables tablename deallocate unused

3如果user為回滾段rollback segment設定了optimal引數,oracle將週期性地從其中回收資料擴充套件

被釋放的資料擴充套件後,所屬資料檔案頭部更新點陣圖或者更新字典管理的uet$fet$,然後oracle將被釋放的資料擴充套件作為資料檔案中的可用擴充套件,用於下次段內的需求分配,此時原擴充套件的資料無法訪問。

資料擴充套件組成一個段,Oracle新建物件時會為此物件建立段,索引存在於自身的索引段內,表存在於自身的表段內等,由於段中可能需要重新分配新的extent,段內的extent可能儲存在另一資料檔案中,但是一個段必須存在於同一表空間,段中的資料擴充套件可以不連續。

Oracle訪問資料的單位:

oracle每次訪問資料時,總是訪問整數個oracle資料塊,也就是db_block_size為單位來訪問

這樣主要是減少不必要的I/O

資料塊可用空間的有效性及最佳化::

資料塊中釋放的空間利用:

delete或者update更新資料行中的資料為容量更小時,此時會釋放資料塊中的空間,下面這兩種情況釋放的空間可以被後續的insert使用:1如果delete或者updateinsert

在同一事務可以使用 2 如果不在同一事務要等到insert需要該資料塊的空間時使用

資料塊的中可用空間合併:

當然上述釋放的空間與可用空間在一個資料塊中並不一定是連續的,當insertupdate時選中一個有足夠可用空間容納新資料的資料塊,但是此資料塊的可用空間不連續,資料無法被寫入連續的空間中,此時oracle就會合並相應的可用空間,這樣主要是為了防止過於頻繁的空間合併消耗資源。

[@more@]

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

相關文章