ORACLE體系結構邏輯結構-表空間、段、區和數據塊


轉自:

https://www.cnblogs.com/sunziying/p/8994792.html

一、Oracle的邏輯結構

Oracle的邏輯結構是一種層次結構。主要由:表空間、段、區和數據塊等概念組成。邏輯結構是面向用戶的,用戶使用Oracle開發應用程序使用的就是邏輯結構。數據庫存儲層次結構及其構成關系,結構對象也從數據塊到表空間形成了不同層次的粒度關系。

 


1.數據塊(Data Blocks)
1.1 數據塊是Oracle最小的存儲單位,Oracle數據存放在“塊”中。一個塊占用一定的磁盤空間。特別注意的是,這里的“塊”是Oracle的“數據塊”,不是操作系統的“塊”。
1.2 Oracle每次請求數據的時候,都是以塊為單位。也就是說,Oracle每次請求的數據是塊的整數倍。如果Oracle請求的數據量不到一塊,Oracle也會讀取整個塊。所以說,“塊”是Oracle讀寫數據的最小單位或者最基本的單位。
1.3 塊的標准大小由初始化參數DB_BLOCK_SIZE指定。具有標准大小的塊稱為標准塊(Standard Block)。塊的大小和標准塊的大小不同的塊叫非標准塊(Nonstandard Block)。
1.4 操作系統每次執行I/O的時候,是以操作系統的塊為單位;Oracle每次執行I/O的時候,都是以Oracle的塊為單位。
1.5 Oracle數據塊大小一般是操作系統塊的整數倍。

1.6  數據塊的格式(Data Block Format)
塊中存放表的數據和索引的數據,無論存放哪種類型的數據,塊的格式都是相同的,塊由塊頭(header/Common and Variable),表目錄(Table Directory),行目錄(Row Directory),空余空間(Free Space)和行數據(Row Data)五部分組成
    塊頭(header/Common and Variable):存放塊的基本信息,如:塊的物理地址,塊所屬的段的類型(是數據段還是索引段)。
    表目錄(Table Directory):存放表的信息,即:如果一些表的數據被存放在這個塊中,那么,這些表的相關信息將被存放在“表目錄”中。
    行目錄(Row Directory):如果塊中有行數據存在,則,這些行的信息將被記錄在行目錄中。這些信息包括行的地址等。
    行數據(Row Data):是真正存放表數據和索引數據的地方。這部分空間是已被數據行占用的空間。
    空余空間(Free Space):空余空間是一個塊中未使用的區域,這片區域用於新行的插入和已經存在的行的更新。
頭部信息區(Overhead):我們把塊頭(header/Common and Variable),表目錄(Table Directory),行目錄(Row Directory)這三部分合稱為頭部信息區(Overhead)。頭部信息區不存放數據,它存放的整個塊的信息。頭部信息區的大小是可變的。一般來說,頭部信息區的大小介於84字節(bytes)到107字節(bytes)之間。


1.7  行鏈接和行遷移(Row Chaining and Migrating)
行鏈接(Row Chaining):如果我們往數據庫中插入(INSERT)一行數據,這行數據很大,以至於一個數據塊存不下一整行,Oracle就會把一行數據分作幾段存在幾個數據塊中,這個過程叫行鏈接(Row Chaining)。如下圖所示:
                                      
如果一行數據是普通行,這行數據能夠存放在一個數據塊中;如果一行數據是鏈接行,這行數據存放在多個數據塊中。


行遷移(Row Migrating):數據塊中存在一條記錄,用戶執行UPDATE更新這條記錄,這個UPDATE操作使這條記錄變長,這時候,Oracle在這個數據塊中進行查找,但是找不到能夠容納下這條記錄的空間,無奈之下,Oracle只能把整行數據移到一個新的數據塊。原來的數據塊中保留一個“指針”,這個“指針”指向新的數據塊。被移動的這條記錄的ROWID保持不變。行遷移的原理如下圖所示:
                                       
無論是行鏈接還是行遷移,都會影響數據庫的性能。Oracle在讀取這樣的記錄的時候,Oracle會掃描多個數據塊,執行更多的I/O。


1.8  數據塊中自由空間的使用
當往數據庫中插入(INSERT)數據的時候,塊中的自由空間會減少;當對塊中已經存在的行進行修改(UPDATE)的時候(使記錄長度增加),塊中的自由空間也會減少。
DELETE語句和UPDATE語句會使塊中的自由空間增加。當使用DELETE語句刪除塊中的記錄或者使用UPDATE語句把列的值更改成一個更小值的時候,Oracle會釋放出一部分自由空間。釋放出的自由空間並不一定是連續的。通常情況下,Oracle不會對塊中不連續的自由空間進行合並。因為合並數據塊中不連續的自由空間會影響數據庫的性能。只有當用戶進行數據插入(INSERT)或者更新(UPDATE)操作,卻找不到連續的自由空間的時候,Oracle才會合並數據塊中不連續的自由空間。
對於塊中的自由空間,Oracle提供兩種管理方式:自動管理,手動管理

塊中自由空間的自動管理:
 Oracle使用位圖(bitmap)來管理和跟蹤數據塊,這種塊的空間管理方式叫“自動管理”。自動管理有下面的好處:
◆易於使用
◆更好地利用空間
◆可以對空間進行實時調整

塊中自由空間的手動管理:
用戶可以通過PCTFREE, PCTUSED來調整塊中空間的使用,這種管理方式叫手動管理。相對於自動管理,手動管理方式比較麻煩,不容易掌握,容易造成塊中空間的浪費。
PCTUSED也是用於設置一個百分比,當塊中已使用的空間的比例小於這個百分比的時候,這個塊才被標識為有效狀態。只有有效的塊才被允許插入數據。
PCTFREE參數用於指定塊中必須保留的最小空閑空間百分例,默認值為10。之所以要預留這樣的空間,是因為UPDATE時,需要這些空間。如果UPDATE時,沒有空余空間,Oracle就會分配一個新的塊,這會產生行遷移(Row Migrating)。


例如,假定在Create table語句中指定了pctfree為20,則說明在該表的數據段內每個數據塊的20%被作為可利用的空閑空間,用於更新已在數據塊內存在的數據行其余80%是用於插入新的數據行,直到達到80%為止。顯然,pctfree值越小,則為現存行更新所預留的空間越少。因此,如果pctfree設置得太高,則在全表掃描期間增加I/O,浪費磁盤空間;如果pctfree設置得太低,則會導致行遷移。 
pctused參數設置了數據塊是否是空閑的界限。當數據塊的使用空間低於pctused的值時,此數據塊標志為空閑,該空閑空間僅用於插入新的行。如果數據塊已經達到了由pctfree所確定的上邊界時,Oracle就認為此數據塊已經無法再插入新的行。例如,假定在Create table語句中指定pctused為40,則當小於或等於39時,該數據塊才是可用的。所以,可將數據塊填得更滿,這樣可節省空間,但卻增加了處理開銷,因為數據塊的空閑空間總是要被更新的行占據,所以對數據塊需要頻繁地進行重新組織。比較低的pctused增加了數據庫的空閑空間,但減少了更新操作的處理開銷。所以,如果pctused設置過高,則會降低磁盤的利用率導致行遷移;若pctused設置過低,則浪費磁盤空間,增加全表掃描時的I/O輸出。pctused是與pctfree相對的參數。 
那么,如何選擇pctfree和pctused的值呢?有個公式可供參考。顯然,pctfree和pctused的之和不能超過100。若兩者之和低於100,則空間的利用與系統的I/O之間的最佳平衡點是:pctfree與pctused之和等於100%減去一行的大小占塊空間大小的百分比。例如,如果塊大小為2048字節,則它需要100個字節的開銷,而行大小是390字節(為可用塊的20%)。為了充分利用空間,pctfree與pctused之和最好為80%。 
那么,怎樣確定數據塊大小呢?有兩個因素需要考慮: 
一是數據庫環境類型。例如,是DSS環境還是OLTP環境?在數據倉庫環境(OLAP或DSS)下,用戶需要進行許多運行時間很長的查詢,所以應當使用大的數據塊。在OLTP系統中,用戶處理大量的小型事務,采用較小數據塊能夠獲得更好的效果。 
二是SGA的大小。數據庫緩沖區的大小由數據塊大小和初始化文件的db_block_buffers參數決定。最好設為操作系統I/O的整數倍。


 2.數據區(Extent)
是一組連續的數據塊。當一個表、回滾段或臨時段創建或需要附加空間時,系統總是為之分配一個新的數據區。一個數據區不能跨越多個文件,因為它包含連續的數據塊。使用區的目的是用來保存特定數據類型的數據,也是表中數據增長的基本單位。在Oracle數據庫中,分配空間就是以數據區為單位的。一個Oracle對象包含至少一個數據區。設置一個表或索引的存儲參數包含設置它的數據區大小。

 


3.段(Segment)
是由多個數據區構成的,它是為特定的數據庫對象(如表段、索引段、回滾段、臨時段)分配的一系列數據區。段內包含的數據區可以不連續,並且可以跨越多個文件。使用段的目的是用來保存特定對象。 
一個Oracle數據庫有4種類型的段: 
  數據段:數據段也稱為表段,它包含數據並且與表和簇相關。當創建一個表時,系統自動創建一個以該表的名字命名的數據段。 
  索引段:包含了用於提高系統性能的索引。一旦建立索引,系統自動創建一個以該索引的名字命名的索引段。 
  回滾段:包含了回滾信息,並在數據庫恢復期間使用,以便為數據庫提供讀入一致性和回滾未提交的事務,即用來回滾事務的數據空間。當一個事務開始處理時,系統為之分配回滾段,回滾段可以動態創建和撤銷。系統有個默認的回滾段,其管理方式既可以是自動的,也可以是手工的。 
  臨時段:它是Oracle在運行過程中自行創建的段。當一個SQL語句需要臨時工作區時,由Oracle建立臨時段。一旦語句執行完畢,臨時段的區間便退回給系統。



 4.表空間(tablespace)
是數據庫的邏輯划分。任何數據庫對象在存儲時都必須存儲在某個表空間中。表空間對應於若干個磁盤文件,即表空間是由一個或多個磁盤文件構成的。表空間相當於操作系統中的文件夾,也是數據庫邏輯結構與物理文件之間的一個映射。每個數據庫至少有一個表空間(system tablespace),表空間的大小等於所有從屬於它的數據文件大小的總和。

(1)系統表空間(system tablespace)
是每個Oracle數據庫都必須具備的。其功能是在系統表空間中存放諸如表空間名稱、表空間所含數據文件等數據庫管理所需的信息。系統表空間的名稱是不可更改的。系統表空間必須在任何時候都可以用,也是數據庫運行的必要條件。因此,系統表空間是不能脫機的。 
系統表空間包括數據字典、存儲過程、觸發器和系統回滾段。為避免系統表空間產生存儲碎片以及爭用系統資源的問題,應創建一個獨立的表空間用來單獨存儲用戶數據。

(2)SYSAUX表空間 
是隨着數據庫的創建而創建的,它充當SYSTEM的輔助表空間,主要存儲除數據字典以外的其他對象。SYSAUX也是許多Oracle 數據庫的默認表空間,它減少了由數據庫和DBA管理的表空間數量,降低了SYSTEM表空間的負荷。

(3)臨時表空間 
相對於其他表空間而言,臨時表空間(temp tablespace)主要用於存儲Oracle數據庫運行期間所產生的臨時數據。數據庫可以建立多個臨時表空間。當數據庫關閉后,臨時表空間中所有數據將全部被清除。除臨時表空間外,其他表空間都屬於永久性表空間。

(4)撤銷表空間 
用於保存Oracle數據庫撤銷信息,即保存用戶回滾段的表空間稱之為回滾表空間(或簡稱為RBS撤銷表空間(undo tablespace))。在Oracle8i中是rollback tablespace,從Oracle9i開始改為undo tablespace。在Oracle 10g中初始創建的只有6個表空間sysaux、system、temp、undotbs1、example和users。其中temp是臨時表空間,undotbs1是undo撤銷表空間。

(5)USERS表空間
用戶表空間,用於存放永久性用戶對象的數據和私有信息。每個數據塊都應該有一個用戶表空間,以便在創建用戶是將其分配給用戶。


免責聲明!

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



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