2020年10月22日 星期四

5.6 Segment 介紹

Oracle Segment 的種類總共分為 Undo Segment 、 Data Segment 、 Index Segment , Temporary Segment 四種。


  • Undo Segment: 作為 rollback Segment 所使用,主要是存放 rollback data ,提供 transaction rollback 或是 instance recovery 所使用,自 Oracle 9i 開始以 Undo Tablespace 取代傳統的 rollback Segment , Undo Tablespace 裡面的 Undo Segment (或 rollback Segment) 交由 Oracle 自動管理,管理方式由參數 undo_management 所決定,預設為 auto (Oracle 自動管理) ,若改為 manual 則還原為傳統 rollback segment 的方式,由 DBA 自行手動管理。


  • Data Segment: 存放資料所使用,在 Tablespace 建立 Table 時就會建立相對應的 Data Segment。


  • Index Segment: 建立 Index 時就會建立相對應的 Index Segment。


  • Temporary Segment: 主要存在於 Temporary Tablespace ,為 Global Temporary Table 或是 SQL 執行過程中的排序行為所使用。


Segment 的管理方式分為 Manual 與 Auto 兩種,同樣可以透過 dba_tablespaces 來得知目前是使用哪一種管理方式:


Manual 的管理方式屬於 Oracle 早期的功能,在 Oracle 9i 以前的版本都是使用此種方式管理,代表 Segment 是使用 Freelists 來管理可用空間。


Freelists 存在於 Segment Header 當中,裡面記錄著此 Segment 有哪些 Block 是可被使用的,當一個 Block 從未被使用或是使用率小於 pctused 就會被放置在 Freelists 當中,每當有資料需要新增進來時,必須先於 Segment Header 查閱 Freelists 得知有哪些 Block 可用,獲得可用的 Block 訊息之後再把資料塞入到這些 Block 當中。透過 dba_segments 可以得知目前 Freelists 的設定:


Freelists 預設為 1 ,代表著 Segment Header 只有一份可用空間的清單,當同時有兩個人要來塞資料時,只有一個人有 Freelists 可以查閱,另一個人由於得不到 Freelists ,所以它也不知道有哪些 Block 可以用來塞資料,此時就必須等待另一個人使用完畢才能夠查閱 Freelists ,這個時候就會產生等待事件 Buffer Busy Wait 。如果這時候有兩份清單存在,那麼另一個人就可以不用等待了,透過 alter table 指令來修改 Data Segment 的 Freelists 數量,例如將它改為2:


由於 Freelists 會產生爭用的情況而影響效能,自 Oracle 9i 開始推出了另一種管理方式 Automatic Segment Space Management(ASSM) ,也就是 Segment Management 為 Auto 的管理方式。


ASSM 同樣的也是把可用的 Block 訊息存放在 Segment Header 當中,只不過不是以 Freelists 形式存放,而是類似於 Index 的 B-Tree 結構存放。 ASSM 首先把一個 Data Block 的使用程度分為四類: 剩餘 25% 可用為 FS1、剩餘 25% ~ 50% 可用為 FS2、剩餘 50% ~ 75% 可用為 FS3,剩餘 75% ~ 100% 可用為 FS4。

FS1 ~ FS4 取代了 pctused 參數,在 ASSM 架構下只須設定 pctfree 參數來控制此 Block 可填滿的程度,這樣分類的好處是可以很快的幫一筆資料找到可以配置的 Data Block ,例如一筆小資料進來只需配置 FS1 的空間就足夠了,或者是大資料進來需要配置到 FS4 的空間甚至 FS4 + FS3 的空間才足夠,這種做法比起從 Freelists 上搜尋可用的 Block 還要有效率。那麼 ASSM 是怎麼找到這些具有 FS1 ~ FS4 空間的 Block ? 這就透過之前提到的 B-Tree 結構來查找。


ASSM 的 B-Tree 結構只有三層,單位是 BMB (Bitmap Block) ,最上層的 是Root Block,也就是 Level 3 (L3) 的 BMB;其次為 Branch Block 、 Level 2 (L2) 的 BMB,最底層為 Leaf Block 、 Level 1 (L1) 的 BMB。L3 BMB 記錄著底下有多少個 L2 BMB 以及前後可參照的其他 L3 BMB 資訊; L2 BMB記錄著底下有多少個 L1 BMB ,而 L1 BMB 則是記錄著包括 FS1 ~ FS4 外加完全使用 (Full) 以及尚未使用 (Unformatted) 等六種 Data Block 的信息,一個 L1 的 BMB 可以容納 16 ~ 1024 個 DBA (Data Block Address),當一筆資料 Insert 進來,則會經由 L3 的 BMB 開始搜尋到 L1 ,然後由 L1 的 BMB 來配置可用的 Data Block 來存放。

由於 BMB 的特性,衍生出了 High “High Water Mark” (HHWM) 與 Low “High Water Mark” (LHWM) 兩種概念。 “High Water Mark” (HWM) 表示 Segment 在此水位之上的所有 Data Block 都未曾被使用過 (Unformatted)、在此水位下的 Data Block 已經被使用 (Formatted),而 BMB 裡面分佈的 Data Block 並非是連續排列的,因此對 ASSM 來說,它的高水位記號 (HWM) 並非只是一條直線,而是一個區間,區間上緣稱作 High “High Water Mark” (HHWM) 、 區間下緣稱作 Low “High Water Mark” (LHWM) , HHWM 之上表示所有的 Data Block 都未曾被使用 (Unformatted) 、 LHWM 之下則表示 Data Block 已被使用 (Formatted) ,而中間的部分則是包含了使用 (Formatted) 與未曾使用 (Unformatted) 的 Block。


雖然 ASSM 這個功能從 Oracle 9i 的時候開始推出,但到了 Oracle 10g 之後才變成預設的 Segment 管理方式,由於 ASSM 的效率優於 Freelists ,對於 Permanent Tablespace來說,現在已經不再使用 Freelists ,也就是 Manual 的 Segment 管理方式了。




沒有留言:

張貼留言