oracle的表

追求完美9196發表於2024-07-16

1 與表相關的以下術語

1.1 段

段是oracle中佔用儲存空間的資料庫物件。建立表時會建立一個段,建立索引也會建立一個段。需要注意的是,建立表時可能會建立多個段。例如建立一個表CREATE TEST(ID PRIMARY KEY)。TEST這個表會建立兩個段,一個是TEST表本身,一個是為主鍵所建立的索引。

1.2 段空間管理

  • 手動段空間管理(Manual Segment Space Management, MSSM )。由我們設定 FREELISTS、FREELIST GROUPS、PCTFREE 、PCTUSED和其他引數來控制如何分配、使用和重用段中的空間。
  • 自動段空間管理(Automatic Segment Space Management, ASSM ):只需由我們設定一個引數:PCTFREE。

1.3 高水位線(High-Water Mark, HWM )

高水位線是指段曾經包含資料最右邊的塊。當進行全段掃描時,oracle會掃描段中高水位線以下所有的塊。所以高水位線會影響全面掃描的效能。如下圖所示,當表建立時,高水位線位於表中的第一個塊。隨著表中資料的增加,高水位線會不斷升高。刪除資料後,高水位線不會降低。後面插入資料時,資料會插入這些高水位線以下之前刪除過資料有空餘空間的塊。要降低高水位線,只能透過重建、截除(truncate)或收縮這個物件。

1.4 PCTFREE

PCTFREE是為一個塊更新保留的空間百分比。預設是10%。當一個塊的空閒空間低於10%,則這個塊就不允許再插入資料,只能更新資料。

1.5 行遷移

行遷移是指當一行更新變得更大,無法放在原來的塊中。oracle就會將這一行資料遷移到新的塊,同時在原來的塊中保留一個轉發地址。一個表中如果發生行遷移過多,會影響效能。因為要找到發生行遷移的行,要先找到原來的塊,再根據原來的塊中的轉發地址找到新的塊,多了一步IO操作。同時,在快取記憶體中也需要同時快取兩個塊。
統計一個表上的行遷移情況

ANALYZE TABLE TEST COMPUTE STATISTICS;
SELECT chain_cnt,
      round(chain_cnt/num_rows*100,2) pct_chained,
      avg_row_len, pct_free , pct_used
 FROM user_tables
WHERE table_name = 'TEST';

1.6 LOGGING 和 NOLOGGING

正常情況下,我們在資料庫的操作都是LOGGING模式,LOGGING模式就是會讓我們的操作都會產生redo。而NOLOGGING模式則讓我們的一些操作少產生redo甚至不產生redo。
NOLOGGING 只會影響幾個特定的操作,如物件的初始建立,或使用SQLLoader的直接路徑載入,或者重建操作;後續正常的DML的不受NOLOGGING影響。如果要在insert select 語句(insert/+ append*/ into t nologging)使用append直接路徑載入資料,插入資料的表要去掉索引才能達到更好的效能,因為索引無法直接輸入磁碟,會產生很多redo。
常見dml、ddl語句使用nologging選項所生成的redo和undo大小比較:http://blog.itpub.net/53956/viewspace-1273203/

2 oracle常見的表型別

  • 堆組織表(heap organized table):這就是普通的標準資料庫表:資料在其中以堆的方式管理。增加資料時,會找到並使用段中第一個能放下此資料的自由空間。從表中刪除資料時,則允許以後的INSERT和UPDATE重用這部分空間,這就是這種表型別中“堆”這個名字的由來。 “堆”是指一組空間,被以某種隨機的方式來使用。
  • 臨時表(temporary table):臨時表中儲存的資料,只對當前會話可見。
  • 外部表(external table):這些表中的資料並不儲存在資料庫中,而是放在資料庫之外,也就是說它們被存放為普通的作業系統檔案。
  • 索引組織表(index organized table ):這些表按索引結構儲存。這就強制要求行本身有某種物理順序。在堆表中,只要空間放得下,資料可以放在其中任何位置;而索引組織表(IOT)則不同,資料要根據主鍵有序地儲存在索引組織表中。

相關文章