轉自:html
https://www.cnblogs.com/sunziying/p/8994792.html數據庫
1、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對象包含至少一個數據區。設置一個表或索引的存儲參數包含設置它的數據區大小。spa
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、undotbs一、example和users。其中temp是臨時表空間,undotbs1是undo撤銷表空間。
(5)USERS表空間
用戶表空間,用於存放永久性用戶對象的數據和私有信息。每一個數據塊都應該有一個用戶表空間,以便在建立用戶是將其分配給用戶。操作系統