1. 程式人生 > >邏輯儲存結構簡介

邏輯儲存結構簡介

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 可能會對效能有負面影響,因為必須序列化對資料字典的更新。而預設的本地管理表空間避免了這種效能問題。