書名: Oracle數據庫從入門到運維實戰作者名: 甘長春 孟飛編著本章字數: 4330字更新時間: 2021-09-27 12:48:19
1.6 數據庫的邏輯結構
前面已經提到,數據庫服務器包括實例和數據庫兩部分。其中,數據庫用來存儲數據,而實例用來訪問數據庫中的數據。實例包括一組內存結構和后臺進程,而數據庫的結構需要從邏輯結構和物理結構兩個方面來理解。數據庫的邏輯結構是指數據的邏輯組織形式,是Oracle內部用來管理數據的機制。數據庫的物理結構是從用戶角度感覺到的結構,是在操作系統中存儲和管理數據的機制。
從邏輯結構上來講,一個數據庫包含若干個表空間,不同類型的數據存儲在不同的表空間中,如系統數據、用戶數據、臨時數據和回滾數據等分別存儲在不同的表空間中。表空間中包含若干個段,同一個表空間中的數據又可進一步根據類型不同而存儲在不同的段中,如數據段、索引段、臨時段等。一個段中又可以包含若干個區,區是Oracle分配存儲空間和回收存儲空間的基本單位。區是由連續的多個數據塊組成的,數據塊是Oracle讀/寫數據庫的基本單位。表空間、段、區和數據塊組成了數據庫的邏輯結構。
邏輯結構是指數據的組織形式,而從物理形式上講,數據是以數據文件的形式存儲在磁盤上的。在操作系統中,能使用戶真正感覺到數據庫存在的是數據文件。數據文件存儲在磁盤上,它需要占用若干個操作系統塊。
邏輯結構和物理結構并非毫無關系,而是緊密聯系的。表空間中的數據存放在數據文件中,因此一個表空間對應一個或多個數據文件。數據塊是Oracle中存儲數據的基本單位,一個數據塊對應若干個操作系統塊,數據最終是存儲在操作系統塊中的,Oracle對數據塊的訪問最終轉化為對操作系統塊的訪問。
數據庫的邏輯結構與物理結構之間的關系如圖1-12所示。

圖1-12
1.6.1 表空間(TABLESPACE)
表空間是數據庫中數據的邏輯組織形式,一個數據庫在邏輯上由多個表空間組成。表空間用于將不同類型的數據組織在一起,就像一個公司里的員工是按照不同部門組織在一起一樣。表空間中的數據在物理上是存儲在數據文件中的,一個表空間對應一個或多個數據文件,就像一個部門對應若干個辦公室一樣。當表空間中的存儲空間緊張時,可以向表空間中添加數據文件,一個數據文件只能屬于一個表空間。
如果表空間中只包含一個數據文件,那么所有數據都將存儲在這個數據文件中。如果表空間對應多個數據文件,那么數據將被分割成幾部分,分別存放在這些數據文件中。表空間與數據文件的關系如圖1-13所示。

圖1-13
在數據庫中引入表空間的好處有以下幾點:
●將系統數據和用戶數據分開,有利于保護重要的數據;
●可以限制用戶對磁盤存儲空間的使用;
●將臨時數據與用戶數據分開,從而減少用戶數據存儲區的碎片,提高數據庫的性能;
●能夠將不同類型的數據分別存放在不同的磁盤上,以減少磁盤的讀/寫沖突。可以將訪問頻繁的數據存儲在速度相對較快的磁盤上,從而在整體上提高數據庫的性能;
●各個表空間可以被單獨設置為聯機或脫機狀態,這樣可以在數據庫正常運行的情況下,將單個表空間置于脫機狀態,并對其進行備份或恢復。
在一個數據庫中有5種類型的表空間,即SYSTEM表空間、SYSAUX表空間、UNDO表空間、臨時表空間和普通表空間。其中前4種表空間必不可少,在創建數據庫時就需要創建它們,普通表空間是根據需要才創建的。
(1)SYSTEM表空間
SYSTEM表空間是數據庫中一個必需的表空間。在創建數據庫時,SYSTEM表空間將被自動創建。在SYSTEM表空間中存儲著數據庫的系統信息,如數據字典、數據庫對象的定義、PL/SQL存儲程序的代碼、SYSTEM回滾段等。
(2)SYSAUX表空間
SYSAUX表空間也是數據庫中一個必需的表空間,它是在創建數據庫時自動被創建的。SYSAUX表空間是對SYSTEM表空間的輔助表空間,以前存儲在SYSTEM表空間中的數據現在存儲在SYSAUX表空間中,從而減輕了SYSTEM表空間的負擔。另外,許多以前需要單獨表空間的數據現在都可以存儲在SYSAUX表空間中,從而減少了需要維護的表空間的數目。
(3)UNDO表空間
UNDO表空間是用來存儲回滾數據的。回滾數據是被事務修改的數據,例如,假設用戶執行語句“DELETE FROM bmb WHERE ID=8902”,被DELETE命令訪問的數據就是回滾數據。在事務尚未提交之時,這一行數據被存放在UNDO表空間中。此時,假設另一個用戶執行語句“SELECT * FROM bmb WHERE ID=8902”,那么他將得到從UNDO表空間中返回的這一行數據。如果事務被回滾,UNDO表空間中的數據被寫回原來的存儲空間,就好像原來的DML操作沒有被執行一樣。
由此可見,UNDO表空間是為了回滾事務而設計的。在以前版本的數據庫中,回滾數據只能存放在回滾段中。回滾段位于某一個表空間中,或者某些特定的表空間中。回滾段的管理比較復雜,需要數據庫管理員手動執行煩瑣的命令。目前版本的數據庫都使用UNDO表空間來管理回滾數據。在UNDO表空間中只能存放回滾段,而不能存放其他類型的段,如數據段、索引段等。使用UNDO表空間的好處是可以對回滾數據進行自動管理,從而減輕了數據庫管理員的負擔。
(4)臨時表空間
臨時表空間用于存放用戶訪問數據庫時所產生的臨時數據。例如,當用戶執行語句“SELECT * FROM bmb ORDER BY id”時,將對表中的數據進行排序并產生排序結果。
排序操作一般是在PGA的排序區中進行的。如果排序區的大小不足以容納這些數據,將使用臨時表空間。在臨時表空間中只能建立臨時段。臨時段也不是永久存在的,當用戶第一次在數據庫中執行排序等操作時,臨時段將自動產生,而當數據庫關閉時,臨時段的空間將被釋放。正因如此,在臨時表空間不允許創建永久性的數據庫對象,如表、索引等。
在一個數據庫中可以創建多個臨時表空間。如果沒有臨時表空間,那么用戶在執行排序等操作時可能需要使用SYSTEM表空間存儲臨時數據。如果在SYSTEM表空間中頻繁地存儲臨時數據,將產生大量的存儲碎片,從而降低數據庫的性能。
在使用CREATE USER命令創建用戶時,可以通過TEMPORARY TABLESPACE子句為該用戶指定臨時表空間。用戶在創建之后,也可以通過ALTER USER命令為其指定臨時表空間。這樣,用戶訪問數據庫時產生的臨時數據將被存儲在指定的臨時表空間中。
(5)普通表空間
普通表空間是用戶真正關心的表空間,在數據庫中可以創建多個普通表空間。普通表空間用來存放用戶的數據。
1.6.2 段(Segment)
表空間將數據按照類型從邏輯上分離開來,如將用戶數據與系統數據分別組織在一個表空間中。在同一個表空間中,可能存在不同類型的數據庫對象,如表、索引。Oracle將不同數據庫對象中的數據以段的形式組織在一起。一個表空間包含多個段,但一個段只能屬于一個表空間。
當用戶在數據庫中創建一個數據庫對象時,在表空間中將自動創建一個段,以存儲該對象的數據。例如,在默認情況下,一個表對應一個表段,一個索引對應一個索引段。段中存儲空間的分配是以區為單位進行的。在一個段中包含若干個區。在分配段時需要指定初始的區個數。隨著段中數據的增加,數據服務器將會擴充該段,為段分配所需的區,而當段中數據被刪除時,空閑的區可以被回收。
在表空間中主要可以創建4種主要類型的段,它們是數據段、索引段、臨時段和回滾段。在每個段中存儲不同的數據庫對象。
(1)數據段
數據段用來保存表中的數據,默認情況下一個表對應一個表段。在一個表段中只能存儲一個表中的數據。當用戶在表空間中創建一個表時,數據庫服務器將自動在這個表空間中為該表創建一個段,段的名字與表的名字相同。
(2)索引段
索引段用來存儲索引中的數據,當用戶為一個表創建索引時,數據服務器將自動為該索引創建一個索引段,索引段與索引的名字相同,并且它們之間是一一對應的。當在表上創建主鍵約束或唯一性約束時,也將產生相應的索引段。
(3)臨時段
臨時段用于存放臨時數據,當用戶執行排序等操作時,將產生大量的臨時數據,這些臨時數據存儲在臨時段中。當然,臨時數據是優先存儲在PGA的排序區中的,這樣可以提高排序的速度。如果排序區的大小不足以存放這些臨時數據,才會用到臨時段。臨時段不是必需的,如果沒有創建專門的臨時段,用戶的排序操作將使用SYSTEM表空間中的臨時段。由于SYSTEM表空間存儲著重要的系統數據,頻繁地使用SYSTEM表空間將產生大量的碎片,從而降低數據庫的性能,所以Oracle建議盡量創建專門的臨時段,并將它存放在專門的臨時表空間中。
(4)回滾段
回滾段用于存儲回滾數據。當用戶執行DML語句時,數據庫服務器將修改后的數據存儲在表段中,而將修改前的數據作為回滾數據存儲在回滾段中。當用戶回滾事務時,數據庫服務器將回滾段中的數據重新寫入表段,該事務所做的修改將取消。當用戶提交事務時,回滾段中的數據將變為無效,這時用戶將無法回滾該事務。在數據庫中可以創建多個回滾段。當用戶執行DML操作時,數據庫服務器將自動為當前事務指定一個回滾段,用戶也可以通過命令指定一個回滾段。在創建數據庫時,系統在SYSTEM表空間中自動創建一個SYSTEM回滾段,SYSTEM回滾段用于維護Oracle內部的事務。數據庫管理員可以通過命令創建其他的回滾段。
值得注意的是,Oracle 11g提供了兩種管理回滾數據的方法,一種是手動管理方式,這種方法利用回滾段維護事務。另一種方法稱為自動管理方式,這種方式利用專門的UNDO表空間管理回滾數據。由于回滾段的管理太復雜,Oracle建議大家使用自動管理方式,在以后的Oracle版本中,可能會取消手動管理方式。
注:Oracle 12c增加了Temporary UNDO(臨時回滾段),可以減少存儲在UNDO表空間的生成量和重做日志的生成頻率,這是Oracle 12c的新特性。
1.6.3 區(Extent)
區是Oracle分配存儲空間的最小單位,一個段由多個區組成,一個區由若干個連續的數據塊組成,區的大小是數據塊大小的整數倍。在創建一個數據庫對象時,數據庫服務器為該對象分配若干個區,以存儲該對象的數據。數據庫對象至少占用一個區,隨著數據的增加,數據庫服務器將不斷為該對象分配所需的區,這些區的大小可能相等,也可能不相等。
1.6.4 數據塊(Block)
數據塊是Oracle中的最小存儲單位,也是數據庫服務器讀/寫數據的最小邏輯單位。數據庫服務器在為段分配空間或回收存儲空間時,是以區為單位進行的,而在讀/寫數據時,是以數據塊為單位進行的。
數據庫中的數據最終是存儲在硬盤上的,所以數據塊與操作系統中的塊必然有著密切的聯系。一個數據塊由若干個操作系統塊組成,它的大小是操作系統塊的整數倍。數據庫服務器在讀/寫數據時以數據塊為單位進行,這種訪問最終轉化為對操作系統塊的讀/寫。
在Oracle數據庫中,有兩種形式的數據塊,一種是標準塊,另一種是非標準塊,自9i開始支持兩種塊的并存。標準塊的大小由初始化參數DB_BLOCK_SIZE指定,所有標準塊的大小都相同。非標準塊的大小可以有多種情況,如2KB、4KB、8KB、16KB、32KB(但是不能與標準塊的大小相同),等等。在數據庫中可以使用一系列初始化參數DB_nK_CACHE_SIZE,其中n為2、4、8、16、32等。這些初始化參數系列用來為非標準塊指定數據庫高速緩存大小。如果在數據庫中定義了非標準塊,那么必須在SGA中為它定義相應的數據庫高速緩存。無論是哪種數據塊,它的大小在數據庫創建之后就不能再修改。
數據庫服務器在讀/寫數據時,數據塊中的數據將首先被調入SGA的數據庫高速緩存中,在緩存中必須為每一種大小的數據塊定義緩沖區,緩存區的大小與數據塊相同。當用戶訪問數據庫時,數據塊的內容被讀/寫到與之大小相同的緩沖區中。
- The Supervised Learning Workshop
- Mastering NetBeans
- .NET之美:.NET關鍵技術深入解析
- SOA實踐
- Clojure for Domain:specific Languages
- 64位匯編語言的編程藝術
- 微信公眾平臺開發:從零基礎到ThinkPHP5高性能框架實踐
- Learning Network Forensics
- Ext JS 4 Web Application Development Cookbook
- 從Excel到Python:用Python輕松處理Excel數據(第2版)
- Unity&VR游戲美術設計實戰
- Django實戰:Python Web典型模塊與項目開發
- Java圖像處理:基于OpenCV與JVM
- R Data Science Essentials
- Machine Learning for Developers