Oracle之 資料塊、區段和段

ForTechnology發表於2011-08-04
2、資料塊、區段和段

 

這一章描述了Oracle資料庫伺服器中邏輯儲存結構的本質和相互關係。

 

本章包含下列內容

 

u 介紹資料段、區段和段

 

u 資料塊概述

 

u 區段概述

 

u 段概述

 

介紹資料塊、區段和段

Oracle為資料庫中的所有資料分配邏輯資料庫空間。資料庫空間的分配單位是資料塊、區段和段。圖2-1顯示了這些資料結構之間的關係:

 

2-1 段、區段、資料塊的關係



Oracle儲存資料的最小顆粒是資料塊(也叫邏輯塊、Oracle塊或頁)。一個資料塊對應於磁碟上特定數量的物理資料庫空間。

 

邏輯資料庫空間的下一個層次是區段。一個區段是特定數目的連續資料塊,用來儲存特定型別的資訊。

 

區段之上的邏輯資料庫儲存層次叫段。段是一系列的區段,每個區段都分配為一個特定的資料結構,段中所有的區段都儲存在同一個表空間上。例如,每個表的資料都儲存在它自己的資料段中,但每個索引資料都儲存在索引段中。如果表或者索引被分割槽,每個分割槽都儲存在它自己的段中。

 

Oracle為段分配空間的單位是區段。當一個段中現有的區段充滿時,Oracle為這個段分配另一個區段。因為區段是按需分配的,段中的區段可能在磁碟上並不連續。

 

一個段或它的所有區段都儲存在一個表空間上。在一個表空間內,一個段可以包含來自多個資料檔案的區段;就是說,段可以跨資料檔案。雖然如此,每個區段只能來自於一個資料檔案。

 

雖然你可以分配額外的區段,但它的資料塊是單獨分配的。如果你為一個特定的例項分配一個區段,塊會立刻分配到可用列表中。如果一個特定的例項沒有分配區段,當高水位線移動時,會自動分配資料塊。高水位線是段中可用空間和不可用空間的界線。

 

資料塊概述

Oracle管理資料庫的資料檔案的儲存空間的分配單位叫資料塊。資料塊是資料庫使用的最小資料單位。相比之下,在物理的作業系統層次上,所有資料都儲存為位元組。每個作業系統都有一個塊大小。Oracle訪問資料是按Oracle資料塊的倍數,不是作業系統塊的倍數。

 

標準塊大小由初始化引數DB_BLOCK_SIZE大小決定。另外,你可以制定不多於5個非標準塊大小。資料塊大小應該是作業系統塊大小的倍數,這樣可以最大限度的減少非必要的I/OOracle資料塊是Oracle能夠使用或者分配的最小儲存空間。

 

資料塊格式

Oracle資料塊格式和資料塊是否包含表、索引和聚集資料無關。圖2-2描述了資料塊的格式。

 

2-2 資料塊格式


頭部(常量和變數)--HeaderCommon and Variable

 

頭部包含通用的塊資訊,比如塊地址和段型別(比如資料或者索引)

 

表目錄

 

資料塊的這部分包含在本塊有資料的表的資訊

 

行目錄

 

資料塊的這部分包含塊中實際行的資訊(包括行資料區域的每個行的地址)

 

在資料塊的首部分配了行目錄空間之後,當行被刪除時這個空間不會被回收。因此一個曾經包含50行的空塊還在首部的行目錄分配了100位元組。Oracle只有在新行插入這個塊時才會重用這部分割槽域。

 

首部

 

資料塊頭部、表目錄和行目錄合起來稱作首部。塊首部某些部分是固定大小的;整個塊首部大小是個變數。平均來說,塊首部的固定和變化部分總和在84107位元組之間。

 

行資料

 

資料塊的這部分包含表或者索引資料。行可以跨塊。

 

空閒空間 Free Space

 

空閒空間是為插入新行和需要更多空間的更新分配的空間(例如,當一個空值被更新為非空值)。

 

在表、聚集或者索引的段空間分配的資料塊中,空閒空間可以儲存事務入口(transaction entries)。每個訪問塊中一個或者多個行的INSERTUPDATEDELETESELECT....FOR UPDATE語句都需要事務入口。事務入口需要的空間依賴於作業系統。雖然如此,在大多數作業系統中事務入口需要的空間大約是23位元組。

 

空閒空間管理

空閒空間可以自動管理也可以手動管理。

 

空閒空間可以在資料段內自動管理。段內空閒、已用空間都使用點陣圖跟蹤,而不使用空閒列表。自動段空間管理提供了下列優勢:

 

u 使用容易

 

u 更好的利用空間,尤其是針對行大小不一致的物件。

 

u 在併發訪問時提供更好的效能

 

u 在多例項情況下,更好的效能和空間利用率

 

    當你建立本地管理的表空間時指定了自動段空間管理。表空間上建立的所有段都使用這種指定。

 

    資料塊的空閒空間的可用性和優化

 

    兩種型別的語句可以提高一個或多個資料塊的可用空間:DELETE語句和將現有值更新為更小的UPDATE語句。隨後的INSERT語句只有在下列情況下才能使用這些型別的語句釋放的空間:

 

u 如果INSERT語句在相同的事務中且在空閒空間的語句之後,那麼INSERT語句可以使用這個空間。

 

u 如果INSERT語句和空閒空間的語句(可能是另一個使用者執行的)在不同的事務中,然後INSERT語句只有在另一個事務提交併且需要這個空間時才會使用這個空閒空間。

 

釋放的空間在資料塊的主要空閒空間中可能並不連續。Oracle只有在兩種情況下會合並空閒空間(1)一個INSERTUDPATE試圖使用一個包含足夠空閒空間來包含一個新行,並且(2)空間是分裂的,所以行無法插入塊的連續部分中。Oracle只有在這種情況下才會擠壓資料,因為不這樣的話,Oracle系統會因為資料塊的空閒空間的持續擠壓而降低效能。

 

行連結和行遷移

 

在兩種情況下,表中的一行資料太大無法插入一個單獨的資料塊中。在第一種情況下,行在第一次插入塊時就非常大。在這種情況下,Oracle儲存行的這些資料在段中現存的一個資料塊鏈(一個或多個)中。行連結一般由大行產生,比如包含列型別為LONG或者LONG RAW的情況。行連結在這種情況下是不可避免的。

 

雖然如此,在第二種情況下,一個行開始可以儲存在資料塊中,但是後來整個行大小增加了並且塊的剩餘空間已經用光了。在這種情況下,假定整個行可以儲存在新塊中,Oracle移動正行的資料到一個新資料塊中。Oracle在原始行的小段上儲存了包含遷移行的塊指標。遷移行的rowid保持不變。

 

當出現行遷移或者行連結時,相應的I/O效能會下降,因為Oracle必須掃描多餘1個的資料塊才能獲得行的資訊。

 

PCTFREEPCTUSED和行連結

對手工管理表空間來說,對特定段中所有的資料塊中針對插入和更新的使用空閒空間問題有兩個空間管理引數:PCTFREEPCTUSED。在你建立和修改表或聚集(擁有自己的資料段)時可以指定這兩個引數。在建立和修改索引(擁有自己的索引段)時可以指定儲存引數PCTFREE

 

PCTFREE引數

 

PCTFREE引數設定了表中現存行可能的更新所保留的最小百分比的空閒空間。例如,假定你在CREATE TABLE語句中制定了下列引數:

 

PCTFREE 20

 

它規定了每個塊針對塊中現存行的可能更新需要保留的空間比例是20%。在行資料和塊首部空間比例達到80%之前,新行可以增加到行資料區域,並且對應的資訊可以加到首部的變數區域。圖2-3描述了PCTFREE

 

2-3 PCTFREE


PCTUSED引數

 

PCTUSED引數設定了在新行加到塊之前行資料加上首部在塊中佔有的最小百分比。當一個塊使用達到了PCTFREE的限制時,Oracle認為這個塊對於新插入行不可用,直到使用百分比降到引數PCTUSED之下位置。只要達到了這個值,Oracle就只對表上現存資料的更新才使用空閒空間。例如,假定你在CREATE TABLE語句中指定了下列引數:

 

PCTUSED 40

 

這種情況下,只有塊的使用空間小於40%(假定塊的使用空間之前達到了PCTFREEE)時,資料段上的資料塊才對插入新行可用。圖2-4描述了這個情況。

 

2-4 PCTUSED


PCTFREEPCTUSED如何協同工作

 

PCTFREEPCTUSED協同工作優化了資料段中區段中資料塊的空間使用。圖2-5描述了兩個引數的互動。

 

2-5 使用PCTFREEPCTUSED維護資料塊的空閒空間

 

在一個新分配的資料塊中,可用的插入空間是塊大小減去塊首部和空閒空間(PCTFREE)。更新塊的現存資料可以使用任何可用空間。因此,更新可以減少塊的可用個空間到小於PCTFREE的程度,這些節省的空間是為更新保留的,而不是插入。

 

對於每個資料和索引段,Oracle維護一個或多個空閒列表(free lists),就是已經分配給段區段擁有空閒空間大於PCTFREE的塊列表。這些塊對插入可用。當你執行INSERT語句時,Oracle檢查表的空閒列表來儘可能尋找對一個可用的資料塊並使用它。如果塊中的空閒空間對INSERT語句需要的空間來說不夠大,並且塊至少達到PCTUSED,這樣Oracle將這個塊從空閒列表中刪除。一個段中多個空閒列表可以減少併發插入對空閒列表的爭用。

 

在提交DELETEUPDATE語句之後,Oracle執行這個語句並檢查使用空間是否在PCTUSED之下。如果是,塊就進入事務空閒列表的起始部分,而且它是事務中第一個可用塊。當事務提交之後,塊的空閒空間對其他事務也可用。

 

區段概述

區段是資料庫儲存空間的一個邏輯單位,由多個連續的資料塊組成。一個或多個區段組成一個段。當段中現存空間用光時,Oracle會對這個段分配一個新區段。

 

區段何時分配

當你建立一個表時,Oracle為表的資料段分配特定數量的資料塊組成的一個初始化區段。雖然還沒有行插入,初始化區段對應的這些Oracle資料塊為表中的行預先保留。

 

如果段中初始化區段的資料塊用光,需要更多的空間來儲存新資料,Oracle自動為這個段分配一個增加區段。一個增加區段尺寸是段中之前分配區段同樣大小或者更大。

 

為了維護方便,每個段的首部塊包含這個段中區段目錄。

 

確定區段的數量和大小

每個段定義的儲存引數是基於區段的。儲存引數在所有型別的段中都可以使用。它們控制Oracle如何為一個給定段分配資料庫空間。例如,你可以指定為表資料初始化保留多少空間,或者你可以在CREATE TABLE語句的STORAGE子句中指定儲存引數來限制表區段的數量。如果你沒有指定表儲存引數,然後它會使用表空間的預設儲存引數。

 

你可以使用字典管理表空間也可以使用本地管理表空間,前者依賴資料字典表來跟蹤空間使用,後者使用點陣圖(而不是資料字典表)來跟蹤使用和空閒空間。因為本地管理表空間效能更好和更容易管理,如果區段管理方式沒有明確指定的話,非SYSTEM持久表空間預設是本地管理的。

 

本地管理的表空間可以使用統一區段大小或者系統自動指定的變化區段大小。當你建立表空間時,子句UNIFORM或者AUTOALLOCATE(系統管理)指定分配的型別:

 

u 對於統一大小區段,你可以指定區段大小或者使用預設大小,預設大小為1M。根據給定的塊大小,要保證每個區段至少包含5個資料塊。臨時表空間管理區段的方式只能採取這種方式。

 

u 對於系統管理的區段,Oracle確定新增區段的最優大小,最小區段的大小是64K。如果表空間建立包括“segment space management auto”,如果資料庫塊大小是16k或者更高,然後Oracle管理段建立區段的最小尺寸是1M。這時持久表空間的預設管理方式。

 

儲存引數INITIALNEXTPCTINCREASEMINEXTENTS在本地管理的表空間中不能在表空間級別指定。雖然如此,他們可以在段級別指定。在這種情況下,INITIALNEXTPCTINCREASEMINEXTENTS一起來計算段的初始值。計算了段大小之後,內部機制來決定每個區段的大小。

 

區段如何分配

Oracle分配區段的機制依賴於採取本地管理還是字典管理方式。

 

在表空間本地管理的情況下,Oracle先在表空間第一候選的資料檔案上尋找可以分配給第一個區段的空間,然後檢視資料檔案的點陣圖來檢視是否有足夠數目的空閒塊。如果資料檔案沒有足夠的空閒塊,然後Oracle會轉向新的資料檔案。

 

何時分配區段

Oracle資料庫提供了一個段顧問(Segment Advisor)來確定一個物件通過物件內碎片空間重組是否能夠有足夠的空間。

 

通常來說,一個段中的區段不會返回空間給表空間,除非你刪除包含這個段中資料的模式物件(使用DROP TABLE或者DROP CLUSTER命令)。但下列情況例外:

 

u 表或聚集的擁有者或者擁有DELETE ANY許可權的使用者,可以使用TRUNCATE ....DROP STORAGE 語句來截斷表或者聚集。

 

u 一個DBA可以使用下列SQL語法來釋放沒有使用的區段:

 

ALTER TABLE table_name DEALLOCATE UNUSED;

 

u 如果回滾段指定了最優大小(OPTIMAL size),Oracle會定期的釋放段中的一個或者多個區段。

 

當釋放了區段之後,Oracle會更新資料檔案的檢視(本地管理表空間)或者更新資料字典(字典管理的表空間)來將重新獲得的區段標示為可用。在釋放區段中的塊上所有資料都無法訪問。

 

非聚集表中的區段

 

一個非聚集表建立之後,除非你截斷(truncate)它,資料庫段中分配的所有資料塊都只屬於這個表。Oracle在一個塊有足夠空間的情況下插入新行。甚至你刪除了表的所有行,Oracle也不會釋放資料塊,表空間的其他物件也無法使用這些資料塊。

 

在你刪除一個非聚集表後,它的空間可以被回收給其他需要空間的區段使用。Oracle為表空間回收表資料段和索引段的所有區段,這些區段可以被同一表空間的其他模式物件使用。

 

在字典管理的表空間下,當一個段需要比現存區段更大的區段時,Oracle標識和合並收回的區段來組成一個更大的區段。這個叫做聯合區段。聯合區段在本地管理的表空間是不必要的。因為不管它是否從一個區段還是多個區段收回,總是存在連續的空閒空間等待分配。

 

聚集表的區段

 

聚集表儲存為聚集建立的資料段的資訊。因此,如果你刪除聚集中的一個表,聚集仍然保持聚集中的其他表的資料,而且不會回收區段。你也可以截斷聚集(非Hash聚集)來釋放區段。

 

實體化檢視和其日誌的區段

 

Oracle針對實體化檢視和實體化檢視日誌的操作釋放區段的方式類似於表和聚集。

 

索引的區段

 

只要索引存在,索引段中的所有區段都屬於索引段。當你刪除索引或者相關的表或者聚集時,Oracle釋放區段,本表空間的其他物件可以使用這部分空間。

 

臨時段的區段

 

Oracle執行完一個需要臨時段的語句時,Oracle自動刪除臨時段,並將段的區段釋放給對應的表空間。一個簡單的排序在執行語句的使用者的臨時表空間中分配一個臨時段,然後會釋放區段給表空間。

 

多重排序可以使用臨時表空間中專有的針對排序的排序段。這些排序段在例項執行過程中只分配一次,它們在排序之後不會釋放,因為其他的多重排序還要使用。

 

臨時表中的臨時段包含一個事務或者會話的多個語句涉及的資料。Oracle在事務或者會話的末尾刪除臨時段,釋放分配給段的區段給關聯的表空間。

 

回滾段的區段

 

Oracle週期性的檢查資料庫的回滾段,來檢查是否超過了它們的最優尺寸。如果回滾段遠大於最優尺寸(也就是說,有太多的區段),然後Oracle會自動從回滾段中釋放一個或者多個區段。、

 

段概述

一個段是一系列的區段的集合,包含表空間內一個特定邏輯儲存結構的所有資料。例如,對每個表Oracle會分配一個或者多個區段來組成表資料段,對每個索引Oracle也會分配一個或者多個區段來組成它的索引段。

 

資料段介紹

Oracle資料庫中的一個資料段包含下列之一的所有資料:

 

u 一個非分割槽表或者非聚集表

 

u 一個分割槽表的一個分割槽

 

u 聚集表

 

Oracle在你使用CREATE命令建立表或者聚集時建立資料段。

 

表或者聚集的儲存引數指定了資料段的區段如何分配。你可以直接使用適當的CREATE或者ALTER語句來設定這些儲存引數。這些儲存引數影響資料獲取和相關物件的資料段的儲存效率。

 

索引段介紹

Oracle資料庫中的每個非聚集索引都包含一個單獨的索引段來儲存所有的資料。對一個分割槽索引來說,每個分割槽都有一個簡單索引段來儲存它的資料。

 

Oracle在你執行CREATE INDEX命令時建立一個索引或者分割槽索引的索引段。在這個語句中,你可以指定索引段的區段和建立這個索引段的表空間這些儲存引數。(表段和關聯索引段可以在不同的表空間上)。設定這些儲存引數直接影響了資料存取和儲存的效率。

 

臨時段介紹

當執行查詢時,SQL語句解析和執行的中間階段常常需要臨時工作空間。Oracle自動分配這些叫做臨時段的磁碟空間。典型的是Oracle需要一個臨時段來作為排序區域。如果排序操作能夠在記憶體中進行或者使用索引找到其他的方式來執行操作,Oracle不會建立這個段。

 

臨時段需要的操作

 

下列語句有時候會需要使用臨時段:

 

u CREATE INDEX

 

u SELECT .。。。 ORDER BY

 

u SELECT DISTINCT 。。。

 

u SELECT 。。。 GROUP BY

 

u SELECT ... UNION

 

u SELECT ... INTERSECT

 

u SELECT ... MINUS

 

一些非索引連線和關聯子查詢可能需要使用臨時段。例如,如果一個查詢包含DISTINCTGROUP BYORDER BY子句,Oracle可能需要2個臨時段空間。

 

臨時表和它的索引的段

 

Oracle可以對臨時表和臨時表索引分配臨時段。臨時表儲存的資料只在一個事務或者會話存續期間儲存。

 

臨時段如何分配

 

Oracle分配臨時段的方式針對查詢和臨時表而不同。

 

查詢的臨時段分配

 

Oracle在臨時表空間的一個使用者執行命令的會話中按照需要分配臨時區段。在命令CREATE USERALTER USER中的TEMPORARY TABLESPACE子句中指定臨時表空間。

 

如果使用者定義中不包含臨時表空間,然後預設臨時表空間為SYSTEM表空間。表空間的預設儲存引數指定了臨時段的區段的屬性。Oracle在語句完成時會刪除臨時段。

 

因為臨時段的分配和釋放非常頻繁,所以需要針對臨時段專門建立一個表空間。這樣做的話,你可以跨磁碟裝置分佈I/O,而且可以避免SYTEM表空間和其他包含臨時段的表空間的碎片。

 

針對排序操作的臨時段的改變記錄除了臨時段的空間管理操作之外都不儲存在重做日誌中。

 

臨時表和索引的臨時段的分配

 

Oracle釋出第一個INSERT到表的命令時會分配臨時表的段。(這可以是一個內部的插入操作,比如CREATE TABLE AS SELECT)。臨時表的第一個INSERT會分配表和其索引的段、建立索引的根頁和分配需要的LOB段。

 

使用者把臨時表的段建立在自己的臨時表空間上。

 

Oracle在事務末尾會刪除事務型臨時表的段,在會話末尾會刪除會話型臨時表的段。如果其他的事務或者會話共享這個臨時表的使用,段會包含表中保留的資料。

 

自動撤銷管理介紹(Automatic Undo Management

Oralce維護了資料庫的未生效修改資訊。這些資訊包含事務動作的記錄,總體上叫做undoOracle使用undo處理如下事情:

 

u 回滾活動事務

 

u 恢復中斷事務

 

u 提供一致性讀

 

u 從邏輯錯誤中恢復

 

自動撤銷管理是基於undo表空間的。你可以在一個撤銷表空間中分配空間,而不用分配多個不同大小的回滾段。

 

自動撤銷管理降低了管理回滾段空間的複雜性,讓你可以指定undo在被重寫之前會保持多長時間。Oracle強烈建議你使用回滾表空間來管理undo而不是使用回滾段。這樣系統會自動調整undo資料在undo表空間中的持續週期,來滿足需要查詢這些undo資訊的需要。如果當前undo表空間有足夠的空間,你可以設定UNDO_RETENTION引數為一個低閥值,所以系統可以至少保持引數指定的使間內的undo資訊。

 

使用V$UNDOSTAT檢視來監視和配置你的資料庫系統來高效使用undo表空間。V$UNDOSTAT顯示不同的undo和事務統計,例如這個例項消耗的undo空間大小。

 

Oracle資料庫包含一個undo顧問,可以提供建議來幫助你的undo環境的構建。

 

Undo模式

 

Undo模式提供了從手動撤銷管理到自動撤銷管理的遷移的靈活性。一個資料庫系統可以在手動撤銷管理或者自動撤銷管理模式下執行。在手動撤銷管理模式下,undo空間通過回滾段管理。自動管理模式下,undo空間通過undo表空間來管理。要使用自動撤銷管理模式,資料庫管理員只需要針對每個例項建立一個undo表空間,並設定UNDO_MANAGEMENT初始化引數為AUTO。強烈建議你在自動撤銷管理模式下執行。

 

Undo限額

 

在自動撤銷管理模式下,系統控制專門分配給事務的undo段,還能控制undo段的空間分配。一個糟糕的事務可能會消耗大量的undo空間,從而癱瘓整個系統。資源管理器指定UNDO_POOL是一個控制大事務的明確方法。這樣資料庫管理員可以將使用者分成不同的消費組,每個消費組分配一個最大的undo空間限制。當一個組整個消耗的undo空間超過了這個限制,它的使用者不能執行更多更新,除非本組其他使用者的事務結束,undo空間釋放。

 

UNDO_POOL的預設值是UNLIMITED,這樣使用者可以消耗整個undo表空間的undo空間。資料庫管理員可以直接使用UNDO_POOL來限制特定的使用者。

 

自動Undo保持

 

Oracle 10g資料庫自動調整undo持續週期的引數。Undo持續週期指定了老的undo資訊必須保留的時間,就是提交的事務的undo資訊可以覆蓋的時間。資料庫收集使用統計資訊,基於這些統計資訊和undo表空間的大小來調整undo持續週期。假定自動撤銷管理功能被啟用,資料自動象如下那樣調整undo持續週期:

 

u 對於AUTOEXTENDundo表空間,資料庫調整undo持續週期稍微長於最長的執行SQL。另外,如果空閒空間足夠,調整的undo持續週期不低於UNDO_RENTENTION初始化引數的大小。

 

u 針對固定大小的undo表空間,資料庫調整undo持續週期的儘可能的最大值。這意味著總是提供最長可能的持續週期,避免undo表空間空間用盡或者近乎用盡的情況。UNDO_RENTENTION初始化被忽略,除非啟動了持續保證。

 

u Undo持續的自動調整不支援LOB型別。LOB列的持續值調整設定為UNDO_RETENTION引數的值。

 

對於同樣大小自動擴充套件和固定的大小的undo表空間,根據你執行查詢的不同,在固定大小表空間的調整方式傾向於提供長的持續週期。這使得回滾操作儘可能的回滾並最大化長時間執行查詢的undo資料。

 

區段檢視

使用V$TRANSACTIONV$ROLLSTAT來監控事務和撤銷資訊。對於自動撤銷管理來說,V$ROLLSTAT的資訊反映了自動撤銷段撤銷管理的行為。

 

V$UNDOSTAT檢視顯示了統計資料的直方圖來顯示系統是否工作良好。你可以看到例項中諸如undo消耗統計、事務併發、查詢長度的統計。使用這個檢視,你可以更好的估計當前負載下需要的undo空間的大小。

 

 

本文來自CSDN部落格,轉載請標明出處:http://blog.csdn.net/flysyq/archive/2009/03/03/3954474.aspx

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

相關文章