本博文Think主要從兩個問題著手:
① 在哪些情況下某種類型的表比其他表類型更適用?
② 不同類型的表其資料是如何組織和儲存的?
閑言少敘,一家之言,歡迎拍磚:
㈠ 堆組織表
⑴ 資料存放區
如果把一個區當作一個箱子,那麼一個表就是一組無序的箱子堆在一起
只要有可用的空間,資料可以放在任何地方
全表掃時,會按命中順序來擷取資料,而非插入的順序
⑵ 適用情境
應用中99%的情況下使用的可能都是堆組織表
執行create table語句時,預設得到的表類型就是堆組織表
由於堆組織表在儲存速度上較快,比較適合write I/O較多的情景
⑶ 相關參數
以下參數僅適用ASSM
① PCTFREE
這個參數用於控制能否將一行增加到一個塊上
如果設定的PCTFREE參數過小,也會導致沒有給update操作留下足夠的空閑空間
② INITRANS
為塊初始化分配的事務槽數,預設為2,這也是最小值
每個並發事務都需要一個事務槽
倘若您認為將對同樣的塊完成多個並行作業,就應該考慮增大該值
不過現在該參數已經可以自動調整了,除非遇到相關等待,不需要過多關注
㈡ 索引組織表
⑴ 資料存放區
索引組織表的資料儲存在Index段中而不是Table段
也就是,索引和資料是在一起的,資料是有序被儲存
⑵ 適用情境
什麼時候用IOT要考慮的因素很多,連Tom 說一大堆也沒說明白.
但什麼時候不用IOT卻很清楚:如果不是大多情況下使用主鍵訪問表,就不要用IOT
⑶ 相關參數
① OVERFLOW
該選項允許您建立另一個段(這就使得IOT成為一個多段對象)
如果IOT的行資料變得太大,就可以溢出到這個段中
② PCTTHRESHOLD
如果PCTTHREHOLD是10%,而塊大小是8K,則長度>800位元組的行就會把其中一部分放到溢出段中
③ INCLUDING
行中從第一列直到INCLUDING子句所指定列(也包括這一列)的所有列都儲存在索引塊上,餘下的列儲存在溢出段中
④ PCTFREE和PCTUSED對於考慮OVERFLOW段時的IOT意義非凡,像對待堆表時一樣對待溢出段
㈢ 索引聚簇表
⑴ 資料存放區
含2層意義:
多張表的相關欄位儲存在同一個塊中
多張表共同使用一個索引
⑵ 適用情境
如果資料主要用於讀,而且要通過索引來讀,另外還會頻繁地把這些資訊連接在一起,此時,索引聚簇表就很合適了
⑶ 相關參數
① SIZE
控制每個塊上儲存多少個聚簇鍵
㈣ 雜湊聚簇表
⑴ 資料存放區
資料在儲存上同索引聚簇一樣,然而在索引方面
雜湊簇是通過雜湊函數直接定位元據的物理地址
⑵ 適用情境
適合可以估計出大小的表,並且絕大多數查詢都是通過HASH列進行等值查詢
全表掃描效率較低
而且,HASH聚簇同樣不適合大量DML操作
⑶ 相關參數
① HASHKEYS
指定hash表的大小
雜湊簇要預分配足夠的空間來儲存(HASHKEYS/trunc(blocksize/SIZE))位元組的資料
例如:如果將SIZE設定為1500位元組,而且塊大小為4KB
則Oracle會在每個塊上儲存2個鍵
如果你計劃有1000個hashkeys
那麼,Oracle將分配500個塊
㈤ 有序雜湊聚簇表
⑴ 資料存放區
資料在儲存上同雜湊聚簇上是一樣的
唯一不同的是,資料可以按你選擇的某個欄位有序地儲存
⑵ 適用情境
形如:
select *
from t
where KEY = (例如 cust_id = :x)
order by sorted_column
也就是說,要按照某個鍵擷取資料,但要求這些資料按另外某個列排序
⑶ 相關參數
① SORT
比如,我們指定:create table t (order_dt timestamp SORT)
則資料按order_dt物理地擷取和排序
㈥ 巢狀表格
⑴ 資料存放區
隱藏列增加raw(16)儲存開銷
父表上會預設建立一個惟一索引
巢狀表格模型,每個父行都有一個虛擬表;而在父/子表(關聯式模式),每個父行都有一個行集
⑵ 適用情境
2個用途:
① 用於擴充PL/SQL 語言,這是常見的用法
② 作為一種實體儲存體機制(幾乎沒用!)
如果把巢狀表格用作一個儲存機制,一定要保證將巢狀表格建立為一個IOT
以避免nested_table_id上索引的開銷以及巢狀表格本身的開銷
倘若沒用IOT,則要確保nested_table_id列上建立一個索引,來避免為尋找子行而全表掃
在工業環境,完全可以用父子表+視圖的方案來替代
㈦ 暫存資料表
⑴ 資料存放區
暫存資料表的資料是放在PGA中的,如果往暫存資料表中插入的資料量很大,超過PGA的大小,則資料將放於暫存資料表空間
⑵ 適用情境
參看Think之前寫的一篇文章:Oracle 暫存資料表之暫存資料表的應用問題
㈧ 外部表格
⑴ 資料存放區
資料在OS層,中繼資料在資料字典裡定義
⑵ 適用情境
大量資料 一般檔案 只查詢 不更新
還有就是對文本.日誌.進行查詢.統計.分析
㈨ 對象表
⑴ 資料存放區
對象表實際上是偽裝的關係表,總會轉換為原來的關係行和列
偽主鍵增加raw(16)儲存開銷
建立了一個額外的索引
⑵ 適用情境
① 儲存上:工業環境,我們一般使用關係表上的視圖來取代對象表作為一種儲存機制
② 封裝性:對象表的引用是為了使資料更有封裝的特點
③ 開發上:擴充了PL/SQL,方便開發
㈩ 分區表
⑴ 資料存放區
一張分區表對應多個分區,每個分區是一個Segment,這些分區Segment可建在相同的Tablespace上,也可一個分區對應一個Tablespace
⑵ 適用情境
① 管理上:分區,分而治之,其重點在於高可用(管理),而附屬價值才是效能的提高
② 查詢時:在查詢時指定訪問某個Segment,這樣從物理檔案上減少I/O訪問,從而可以最佳化查詢
③ 理資料:我認為最能體現分區表好處的地方就是處理曆史資料的時候