段就是占用儲存空間的資料庫物件,占用儲存空間的每乙個物件最後都會儲存在乙個段中,如表、索引、回滾段等。
段的型別
1)表段
2)表分割槽段(table partition)或子分割槽段(subpartition)
這種段型別用於分割槽,與表段很相似。分割槽表由乙個或多個分割槽段(table partition segment)組成,組合分割槽表則由乙個或多個錶子分割槽段(tablesubpartition segment)組成。
3)聚簇段(cluster)
「聚簇」是指這個段能把相關的資訊物理的聚在一起。有兩種型別的聚簇:b*樹聚簇和雜湊聚簇。
4)索引段(index)
5)索引分割槽(index partition)
類似與表分割槽,這種段型別包含乙個索引的某個片。分割槽索引由乙個或多個索引分割槽段(index partition segment)組成。
6)lob段(lobsegment),lob索引段(lobindex),lob分割槽段(lob partition)、lob子分割槽段(lob subpartition)
用於儲存大物件 (large object或lob)。
7)巢狀表段(nested table)
為巢狀表指定的段型別。
8)回滾段(rollback)和type2 undo段
undo資料就儲存在這裡。回滾段是dba手動建立的段。type2 undo段由oracle自動建立和管理。
建立表時,會建立乙個表段。建立分割槽表時,則每個分割槽會建立乙個段。建立索引時,就會建立乙個索引段,依此類推。
例如 create table t( x int primary key, y clob) 這樣乙個簡單的語句就會建立4個段:
乙個是table t的表段;
乙個是索引段(這個索引是為支援主鍵而建立的);
另外還有兩個clob段(乙個是lob 索引,另乙個段是lob資料本身)。
11g release2之後,預設情況下,段會延遲到插入第一行資料之後才建立。也可以用下面語句在建立**同時就建立段。
create table t( x int primary key, y clob) segment creation immediate;
段空間管理
段空間管理是從段的表空間(而且段從不會跨表空間)繼承來的乙個屬性。使用create tablespace語句建立乙個本地管理的表空間時,可以使用 segment space management 子句來設定段內的可用/已用空間如何管理。
表空間-〉
1)手動段空間管理(manual segment space management,mssm)
oracle 使用可用塊列表(free list)來管理段內的可用空間。可用塊列表記錄了所有可以被用於插入新資料的資料塊。
2)自動段空間管理(automatic segment space management,assm)
oracle 使用位圖(bitmap)管理段內的可用空間。[注意此處的點陣圖與本地管理的表空間使用的點陣圖不一樣]此處的點陣圖用於描述段內每個資料塊是否有足夠的可用空間來插入新資料。隨著乙個資料塊中可用空間的變化,她的狀態也被及時地反映到位圖中。oracle 使用位圖可以更自動化地管理段內的可用空間。
應用於assm的儲存設定引數只有:
· buffer_pool
· pctfree
· initrans和maxtrans(->
建立段時也可以接受其他引數,但是這些引數將被忽略。
高水位線
在段中有乙個高水位線(high-water mark,hwm)。如果把段想象成從下到上的一系列的塊,hwm代表包含了資料的最上面的塊。
hwm首先位於新建立表的第乙個塊中。在這個表中插入資料後,hwm會公升高。如果我們刪除了表中的一些(甚至全部)行,hwm也不會降低。這樣就可能會有許多塊不再包含資料,但是它們仍在hwm之下,直到重建、截除(truncate)或收縮這個段。
(段收縮是oracle 10g的乙個新特性,只有當段在乙個assm表空間中時才支援這個特性,通過下述語句
alter table t enable row movement; alter table t shrink space;
可以在乙個**上執行段收縮)
因為oracle在全面掃瞄段時會掃瞄hwm之下的所有塊,即使其中不包含任何資料,這會影響全面掃瞄的效能,特別是當hwm之下的大多數塊都為空時。所以刪除表中所有行的時候,如果可能就使用truncate。
在assm表空間中,除了乙個hwm外,還有乙個低hwm。在mssm中,hwm推進時 (例如,插入行時。段分配空間時以區段(extent)為單位,乙個區段包括很多物理連續的塊),所有塊都會被格式化並立即有效,oracle可以安全地讀取這些塊。不過,對於assm,hwm推進時,oracle並不會立即格式化所有塊,只有在第一次向這些塊插入記錄時才會完成格式化,以便安全地讀取。對於assm,資料可能插入到高水位和低水位之間的任意塊,因此這個區域中的很多塊都不會被格式化。全面掃瞄時,需要知道讀取的塊是否未格式化,為了避免段中每個塊都要做檢查,oracle對低水位以下的所有塊都會直接讀取,低水位和高水位之間的塊則需要參考assm的塊點陣圖資訊來檢視哪些塊應該讀取,哪些應該忽略。
freelist
使用mssm時,oracle會在freelist中維護hwm以下,可供用來插入資料的塊。如果預計到會有多個併發使用者在乙個物件上執行大量的insert或update活動,就可以配置多個freelist,這對效能提公升很有好處。
pctfree和pctused
pctfree引數用來告訴oracle應該在塊上保留多少空間來完成將來的更新。預設情況下,這個值是10%。如果未用空間的百分比高於pctfree中的指定值,這個塊就認為是「可用」,可以用來插入資料。
pctused則告訴oracle當前已經變成「不可用」的乙個塊上未用空間百分比需要達到多大(由於刪除,更新等釋放了空間)才能使它再次變為"可用"的。預設值是40%。
使用mssm時,這2個引數控制著塊何時放入freelist中,以及何時從freelist中取出。如果使用預設值:pctfree為10,pctused為40,那麼在塊到達90%滿之前(有10%以上的自由空間),這個塊會一直在freelist
上。一旦到達90%滿,就會從freelist中取出,而且直到塊上的自由空間超過了塊的60%時,才會重新回到freelist上。
使用assm時,pctfree仍然會限制能否將乙個新行插入到乙個塊中,但是pctused將被忽略。
pctfree設定太大,則會浪費空間;設定太小,更新行時就會導致行遷移。
行遷移(row migration)是指由於某一行變得太大,導致塊中已經放不下這一行,oracle 將此行資料遷移(migrate)到新的資料塊中,在被遷移資料行原來所在位置儲存乙個指向新資料塊的指標。被遷移資料行的rowid保持不變。行遷移會影響效能,必須執行更多的i/o才能得到行資料。
《Oracle程式設計藝術》學習筆記 23 段
段就是占用儲存空間的資料庫物件,占用儲存空間的每乙個物件最後都會儲存在乙個段中,如表 索引 回滾段等。段的型別 1 表段 2 表分割槽段 table partition 或子分割槽段 subpartition 這種段型別用於分割槽,與表段很相似。分割槽表由乙個或多個分割槽段 table partit...
程式設計藝術學習筆記(1)
序言習題 1 通過一系列的替代,將四個變數的值 a,b,c,d 變為 b,c,d,a 用最少的步驟 開門菜,然而還是有很多值得思考的地方。能幫助人理解計算機對於賦值的操作。通過觀察,可以認為這是乙個a i 賦值給a i 1 的操作。最少的步驟,只需要五步即可。需要乙個t來作輔助,t a,a b,b ...
《Oracle程式設計藝術》學習筆記 22 表型別
oracle中主要有9種表型別 1 堆組織表 heap organized table 這就是標準資料庫表。資料以堆的方式管理。增加資料時,會使用段中找到的第乙個能放下此資料的自由空間。從表中刪除資料後,允許以後的insert和update重用這部分空間。堆 heap 是一組空間,以一種隨機的方式使...