Oracle 資料庫為資料庫中的所有資料配置設定邏輯空間。資料庫空間配置設定的邏輯單元是資料塊、 擴充區、 段、和表空間。而在實體級,資料被存儲在磁盤上的資料檔案中 。資料檔案中的資料存儲在作業系統塊中。
圖 12-1 是一個實體和邏輯存儲的實體關系圖。烏鴉腳表示法表示一對多關系。
邏輯存儲層次結構
圖 12-2 顯示了在表空間中的資料塊、 擴充區、和段之間的關系。在此示例中,一個段具有分别存儲在不同資料檔案中的兩個擴充區。
在最細的粒度級别, Oracle 資料庫将資料存儲為資料塊。一個邏輯資料塊對應于特定位元組數的實體磁盤空間,比如 2 KB。資料塊是Oracle 資料庫可以使用或配置設定的最小存儲機關。
擴充區是一組邏輯上連續的資料塊,被配置設定來用于存儲特定類型的資訊。在圖12-2中,這個24 KB的擴充區有12 個資料塊,而這個72 KB的擴充區有 36個資料塊。
段是為一個特定資料庫對象(如一個表)配置設定的一組擴充區。例如,employees表的資料存儲在其自己的資料段中,而該表的每個索引存儲在其自己的索引段中。會消耗存儲空間的每個資料庫對象都由單個段組成。
每個段屬于且僅屬于一個表空間。是以,一個段的所有擴充區存儲在相同的表空間中。在一個表空間中,一個段可以包括多個資料檔案中的擴充區,如圖 12-2 所示。例如,段的一個擴充區可能存儲在 users01.dbf中,而另一個存儲在 users02.dbf 中。單個擴充區絕不會跨越多個資料檔案。
邏輯空間管理
Oracle 資料庫必須使用邏輯空間管理來在表空間中跟蹤并配置設定擴充區。當資料庫對象需要擴充區時,該資料庫必須有查找和配置設定擴充區的方法。同樣,當對象不再需要擴充區時,資料庫必須提供一種方法來重用可用空間。
Oracle 資料庫基于您建立的表空間的類型來管理其中的空間。您可以建立下列類型的表空間之一:
本地管理表空間 (預設值)
資料庫使用表空間本身中的位圖來管理擴充區。是以,本地管理表空間需要預留表空間的一部分用于位圖。在一個表空間中,資料庫可以使用自動段空間管理 (ASSM) 或手動段空間管理 (MSSM)來管理段 。
字典管理表空間
資料庫使用資料字典來管理擴充區。
圖 12-3 顯示了一個表空間中的邏輯空間管理方法的可選方案。
本地管理表空間
本地管理表空間在資料檔案頭中維護一個位圖,以跟蹤資料檔案體中的可用空間和已用空間。每一位對應一組塊。當空間被配置設定或釋放時,Oracle 資料庫更改位圖值,以反映資料塊的新狀态。
下面的圖形是位圖管理存儲的概念表示。标頭中的 1 是指已用空間,而 0 指可用空間。
本地管理表空間具有如下優勢:
避免使用資料字典來管理擴充區
如果消耗或釋放一個擴充區會導緻在資料字典表或撤消段中消耗或釋放空間,則在字典管理的表空間中會發生遞歸操作。
自動跟蹤相鄰的可用空間
通過這種方式,資料庫消除了合并空閑擴充區的需要。
自動确定本地管理擴充區的大小
或者,在本地管理表空間中所有的擴充區可以具有相同的大小,并覆寫對象存儲選項。
注意:
Oracle 強烈建議使用自動段空間管理的本地管理表空間。
段空間管理是一個從包含該段的表空間繼承來的屬性。在一個本地管理表空間中,資料庫可以自動地或手動地管理段。例如,users表空間中的段使用自動管理,而tools表空間中的段使用手動管理。
自動段空間管理(ASSM)
ASSM方法使用位圖管理空間。位圖提供了以下優點:
簡化管理
ASSM 可以避免手動确定許多存儲參數的正确設定的需要。隻有一個很關鍵的控制空間配置設定的 SQL 參數: PCTFREE。此參數指定要為塊中保留用于将來的更新的空間百分比。
增強并發性
多個事務可以搜尋多個互相獨立的空閑資料塊清單,進而減少争用和等待。對很多标準工作負載,使用ASSM的應用程式性能比使用優化得很好的使用MSSM的應用程式性能更好。
對Oracle 真正應用叢集 (Oracle RAC) 環境中執行個體的空間動态親合性
ASSM 更有效,并且是永久性本地管理表空間的預設值。
注意:
本章假定在邏輯存儲空間的所有讨論中使用ASSM。
手動段空間管理(MSSM)
舊式的 MSSM 方法使用稱為空閑清單的連結清單來管理段中的可用空間。對一個具有可用空間的資料庫對象,有一個空閑清單會跟蹤位于高水位線 (HWM) 之下的資料塊,所謂高水位,即已使用段空間和未使用段空間之間的分界線。當塊被使用時,資料庫根據需要将塊放入空閑清單,或将塊從空閑清單中删除。
除了 PCTFREE,MSSM 需要您使用額外的幾個SQL 參數(如PCTUSED、FREELISTS、和FREELIST GROUPS)來控制空間配置設定。PCTUSED 設定在目前使用塊中必須存在的可用空間百分比,當使用率低于該百分比時,資料庫會将其放入空閑清單中。例如,如果CREATE TABLE 語句中設定 PCTUSED為40,則隻有當塊空間使用少于 40%的情況下,您才能往段中的塊插入新行。
作為一個說明,假設向一個表中插入行。資料庫檢查該表的空閑清單,以查找第一個可用的塊。如果行無法容納進該塊中,并在塊中已使用空間大于或等于 PCTUSED,則資料庫将該塊從空閑清單中移除,并搜尋另一個塊。如果從塊中删除行,則資料庫檢查塊中的已使用空間現在是否小于PCTUSED。如果是,則資料庫将該塊置于空閑清單的開頭。
一個對象可能有多個空閑清單。通過這種方式,在表上執行 DML的多個會話可以使用不同清單,以減少争用。每個資料庫會話在其會話持續時間隻使用一個空閑清單。
如圖12-4 所示,你也可以建立具有一個或多個空閑清單組的對象,空閑清單組是空閑清單的集合。每個組有一個主空閑清單,用于管理組中的各個的處理空閑清單。空閑清單、尤其是空閑清單組的空間開銷,可能非常顯著。
手動管理段空間可能會很複雜。您必須調整PCTFREE 和 PCTUSED,以減少行遷移 和避免空間浪費。例如,如果段中的每個使用的塊是半滿,并且 PCTUSED 是 40, 則資料庫不允許向這些塊插入新行。由于微調空間配置設定參數很困難, Oracle 強烈建議使用 ASSM。在 ASSM中,由PCTFREE 确定是否可以将新行插入一個塊中,但它不使用空閑清單,并忽略 PCTUSED。
字典管理表空間
字典管理表空間使用資料字典來管理其擴充區。每當配置設定或釋放了一個擴充區時, Oracle 資料庫更新資料字典中的表。例如,當表需要擴充區時,資料庫查詢資料字典表,并搜尋空閑擴充區。如果資料庫找到了空間,則修改一個資料字典表,并插入一行。按這種方式,資料庫通過修改和移動資料來管理空間。
資料庫在背景為資料庫對象擷取空間而執行的SQL是遞歸 SQL。頻繁使用遞歸 SQL 可能會對性能有負面影響,因為必須串行化對資料字典的更新。而預設的本地管理表空間避免了這種性能問題。