Oracle邏輯結構

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

圖2-3  Oracle 10g數據庫層次結構圖

 

碩圖2-4 段、區和數據塊之間的關係

1.數據塊
Oracle數據塊(Data Block)是一組連續的操作系統塊。分配數據庫塊大小是在Oracle數據庫創建時設置的,數據塊是Oracle讀寫的基本單位。數據塊的大小一般是操作系統塊大小的整數倍,這樣可以避免不必要的系統I/O操作。從Oracle9i開始,在同一數據庫中不同表空間的數據塊大小可以不同。數據塊是Oracle最基本的存儲單位,而表空間、段、區間則是邏輯組織的構成成員。在數據庫緩衝區中的每一個塊都是一個數據塊,一個數據塊不能跨越多個文件。
數據塊的結構主要包括:
標題:包括一般的塊信息,如塊地址,段類型等。
表目錄:包括有關表在該數據塊中的行信息。
行目錄:包括有關在該數據塊中行地址等信息。
行數據:包括表或索引數據。一行可跨越多個數據塊。
空閒空間:分配空閒空間是用於插入新的行和需要額外空間的行更新。通過空間管理參數pctfree可控制空閒空間的使用。空閒空間的管理既可以是自動的也可以是手動的。
在數據操作中,有兩種語句可以增加數據庫塊的空閒空間:一個是Delete刪除語句,另一個是Update更新現有行。釋放的空閒空間可用於insert語句,如果insert語句是與產生空閒空間的語句在同一個事務之中,並在其後執行,則insert語句可直接使用生成的空閒空間。如果insert語句是在一個與產生空閒空間的語句相分離的事務中,則insert語句可在其他事務提交後,並在其需要空間時,使用之前產生的空閒空間。
數據塊中釋放的空間可能是連續的,也可能不連續。Oracle只有在出現下列情況時,纔會合併數據塊的空閒空間:當insert或update語句要使用一個數據塊,該數據塊的空閒空間足以存儲新的一行,而且空閒空間均是碎片,數據塊中連續空間無法插入一行的時候。除此而外,Oracle在系統性能下降時也需要壓縮數據塊的空間。
能夠對空閒空間產生影響的參數有兩個:pctfree和pctused。對於手工管理的表空間,在特定段中的所有數據塊,可使用兩個空間管理參數pctfree和pctused來控制insert和update對空閒空間的使用。當創建或修改表時可指定這兩個參數。創建或修改一個擁有自己的索引段的索引時可指定pctfree參數。
pctfree參數爲塊中行的更新預留了空閒空間的最小百分比,默認值爲10。例如,假定在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.表空間
Oracle數據庫(tablespace)是由若干個表空間構成的。任何數據庫對象在存儲時都必須存儲在某個表空間中。表空間對應於若干個磁盤文件,即表空間是由一個或多個磁盤文件構成的。一個表空間物理上由一個或多個數據文件組成,邏輯上由一個或多個數據段組成。表空間相當於操作系統中的文件夾,也是數據庫邏輯結構與物理文件之間的一個映射。每個數據庫至少有一個表空間,表空間的大小等於所有從屬於它的數據文件大小的總和。

在Oracle 10g中有以下幾種比較特殊的表空間:
(1)系統表空間
系統表空間(system tablespace)是每個Oracle數據庫都必須具備的。其功能是在系統表空間中存放諸如表空間名稱、表空間所含數據文件等數據庫管理所需的信息。系統表空間的名稱是不可更改的。系統表空間必須在任何時候都可以用,也是數據庫運行的必要條件。因此,系統表空間是不能脫機的。
系統表空間包括數據字典、存儲過程、觸發器和系統回滾段。爲避免系統表空間產生存儲碎片以及爭用系統資源的問題,應創建一個獨立的表空間用來單獨存儲用戶數據。 
(2)SYSAUX表空間
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撤銷表空間。圖2-5是表空間與數據庫及數據文件之間的對應關係。

圖2-5 表空間與數據庫及數據文件之間的對應關係

 

表空間offline,數據文件offline 的區別

在對錶空間進行offline時,oracle需要針對這個表空間生成檢查點,刷新表空間中數據文件的相關事務,更新數據文件頭SCN,數據文件SCN,文件終止SCN,達到一致狀態,當表空間被再次ONLINE時,oracle會捕捉online時刻的SCN,更新上面各個位置的SCN(當然文件結束SCN號會置爲無窮大),將數據文件都打開

在對單個數據文件做offline時,是立即offline,此時不會針對數據文件生成檢查點,所以數據文件的終止SCN爲無窮大,處於不一致狀態,數據文件也需要recover,在v$recover_file視圖也可以看到這個文件的信息,要想將數據文件online,必須先對文件執行recover操作,所以建議offline數據文件後應該立刻執行recover操作,使他處於一致狀態,以免後面出現不必要的麻煩

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章