Oracle 數(shù)據(jù)庫中的數(shù)據(jù)文件被分組到一個(gè)或多個(gè)表空間中。在每個(gè)表空間中爬橡,邏輯數(shù)據(jù)庫結(jié)構(gòu) ( 如表和索引 ) 都是片段,被進(jìn)一步細(xì)分為 “ 盤區(qū)” ( extent ) 和 “ 塊 ( block ) ”棒动。這種存儲(chǔ)的邏輯細(xì)分允許 Oracle 更有效地控制磁盤空間的利用率糙申。圖 1 顯示了數(shù)據(jù)庫中邏輯存儲(chǔ)結(jié)構(gòu)之間的關(guān)系。
1 表空間
Oracle 表空間 ( tablespace ) 由一個(gè)或多個(gè)數(shù)據(jù)文件組成船惨,一個(gè)數(shù)據(jù)文件是且只能是一個(gè)表空間的一部分柜裸。 Oracle 12c最少會(huì)創(chuàng)建兩個(gè)表空間 : SYSTEM 表空間和 SYSAUX 表空間。
SYSAUX 表空間是在 Oracle Database10g 中引入的粱锐,作為 SYSTEM 表空間的輔助表空間 . 以前一些使用獨(dú)立表空間或系統(tǒng)表空間的數(shù)據(jù)庫組件現(xiàn)在會(huì)在 SYSAUX 表空間中創(chuàng)建疙挺。 SYSAUX 表空間存放一些其他的 metadata 組件,如 OEM 怜浅, Streams 等會(huì)默認(rèn)存放在 SYSAUX 表空間里铐然。通過分離這些組件和功能, SYSTEM 表空間的負(fù)荷得以減輕 海雪,因?yàn)榭梢员苊夥磸?fù)創(chuàng)建一些相關(guān)對(duì)象及組件引起 SYSTEM 表空間的碎片問題锦爵。
即使表空間是臨時(shí)的,表空間自身也是永久的奥裸,只有保存在表空間中的段是臨時(shí)的险掀。臨時(shí)表空間可用于排序操作,也用于只存在于用戶會(huì)話期間的表湾宙。專門使用一個(gè)表空間用于此類操作樟氢,有助于減少臨時(shí)段和存儲(chǔ)在另一個(gè)表空間中的永久段之間的 IO 爭用冈绊。
表空間可以是字典管理的或本地管理的。
在字典管理的表空間中埠啃,盤區(qū)管理記錄在數(shù)據(jù)字典表中死宣。因此,即使所有的應(yīng)用程序表都在 USERS 表空間中碴开,也仍需要訪問 SYSTEN 表空間毅该,以管理應(yīng)用程序表上的 DML。 因?yàn)樗杏脩艉蛻?yīng)用程序必須使用 SYSTEN 表空間才能進(jìn)行盤區(qū)管理潦牛,這就為寫入密集型應(yīng)用程序造成了潛在的瓶頸眶掌。
在本地管理的表空間中, Oracle 在表空間的每個(gè)數(shù)據(jù)文件中維護(hù)一個(gè)位圖巴碗,用于跟蹤空間可用性朴爬。只在數(shù)據(jù)字典中管理分配額,這樣可極大地減少數(shù)據(jù)字典表的爭用橡淆。
2 塊
數(shù)據(jù)庫塊是 Oracle 數(shù)據(jù)庫中最小的存儲(chǔ)單位召噩。塊的大小是數(shù)據(jù)庫內(nèi)給定表空間中特定數(shù)量的存儲(chǔ)字節(jié)塊,它通常是操作系統(tǒng)塊的幾倍大逸爵,這有助于提升磁盤 I/O 的效率具滴。
Oracle 的初始參數(shù) DB_BLOCKSIZE 可指定默認(rèn)的塊大小。默認(rèn)塊大小是 8KB痊银。最多可為數(shù)據(jù)庫中的其他表空間定義4個(gè)塊大小抵蚊,而 SYSTEM、SYSAUX 和任何臨時(shí)表空間中的塊大小必須為 DB_BLOCK_SIZE 的值溯革。
除非確有必要使用不同大小贞绳,否則應(yīng)為所有表空間使用 8KB 塊大小。如果修改了塊大小致稀,應(yīng)該進(jìn)行全面測試冈闭,看能否提升性能 。
3 盤區(qū)
盤區(qū)是由一個(gè)或多個(gè)數(shù)據(jù)庫塊組成抖单。當(dāng)擴(kuò)大數(shù)據(jù)庫對(duì)象時(shí)萎攒,為該對(duì)象添加的空間將分配為一個(gè)盤區(qū)。
4 段
段是一組盤區(qū)矛绘,這組盤區(qū)組成了被 Oracle 視為一個(gè)單位的數(shù)據(jù)庫對(duì)象耍休,如表或索引 。因此货矮,段一般是數(shù)據(jù)庫終端用戶要處理的最小存儲(chǔ)單位羊精。 Oracle 數(shù)據(jù)庫中可看到4種類型的段 : 數(shù)據(jù)段 ( 非分區(qū)表和分區(qū)表的每個(gè)分區(qū) ) 、 索引段 囚玫、 臨時(shí)段和回滾段喧锦。
(1)數(shù)據(jù)段
數(shù)據(jù)庫中的每張表都駐留在單獨(dú)的數(shù)據(jù)段中读规,數(shù)據(jù)段由一個(gè)或多個(gè)盤區(qū)組成。如果某個(gè)表是分區(qū)表 ( partitioned table ) 或群集表 ( clustered table ) 燃少,則 Oracle 為該表分配多個(gè)段束亏。數(shù)據(jù)段包含存儲(chǔ) 大對(duì)象數(shù)據(jù)的 LOB 段。
(2)索引段
每個(gè)索引都存儲(chǔ)在自己的索引段中阵具。與分區(qū)表一樣碍遍,分區(qū)索引的每個(gè)分區(qū)存儲(chǔ)在各自的段中。
(3)臨時(shí)段
當(dāng)用戶的 SQL 語句需要磁盤空間來完成某操作 ( 例如不能在內(nèi)存中完成的排序操作 ) 時(shí)怔昨, Oracle 會(huì)分配臨時(shí)段雀久。臨時(shí)段只存在于 SQL 語句的執(zhí)行期間 。
(4)回滾段
從 Oracle 10g開始趁舀,遺留的回滾段只存在于 SYSTEM 表空間中,并且 DBA 一般不需要維護(hù) SYSTEM 回滾段祝沸。
自動(dòng)撤消管理 ( Automatic Undo Management 矮烹, AUM ) 處理一個(gè)撤消表空間中回滾段的自動(dòng)分配和管理。在撤消表空間中罩锐,撤消段的構(gòu)造類似于回滾段奉狈,不同之處在于如何管理這些段的細(xì)節(jié)由 Oracle 控制。
在 Oracle 12c中涩惑,默認(rèn)啟用 AUM 仁期,此外還提供了 PL/SQL 過程,以幫助確定 UNDO 表空間的大小竭恬。