深入理解Oracle表(7):10種表類型的資料存放區和適用情境淺析

來源:互聯網
上載者:User
       本博文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訪問,從而可以最佳化查詢
             ③ 理資料:我認為最能體現分區表好處的地方就是處理曆史資料的時候

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.