gdufo

           

          oracle大表分區的一點點心得

          http://www.knowsky.com/388420.html

          最近在做一個客戶關系治理系統,項目做的到不是非常成功,可還是學到了不少的知識,由于數據量很大,沒有專門的Oracle數據庫人員支持,對數據庫優化治理等也只有我這個約懂一點的人上了。在對數據庫優化上有一點點心得寫出來希望能同大家一起學習和交流。

          數據庫大表的優化:采用蔟表(clustered tables)及蔟索引(Clustered Index)
          蔟表和蔟索引是oracle所提供的一種技術,其基本思想是將幾張具有相同數據項、 并且經常性一起使用的表通過共享數據塊(data block)的模式存放在一起。各表間的共同字段作為蔟鍵值(cluster key),數據庫在訪問數據時,首先找到蔟鍵值,以此同時獲得若干張表的相關數據。蔟表所能帶來的好處是可以減少I/O和減少存儲空間,其中我更看重前 者。采用表分區(partition)
          表分區技術是在超大型數據庫(VLDB)中將大表及其索引通過分區(patition)的形式分割為若干較小、可治理的小塊,并且每一分區可 進一步劃分為更小的子分區(sub partition)。而這種分區對于應用來說是透明的。通過對表進行分區,可以獲得以下的好處:
          1)減少數據損壞的可能性。
          2)各分區可以獨立備份和恢復,增強了數據庫的可治理性。
          3)可以控制分區在硬盤上的分布,以均衡IO,改善了數據庫的性能。
          蔟表與表分區技術的側重點各有不同,前者側重于改進關聯表間查詢的效率,而表分區側重于大表的可治理性及局部查詢的性能。而這兩項對于我的系統來說都是極為重要。由于本人技術限制,目前尚不確定兩者是否可以同時實現,有那位在這方面有經驗的給點指導將不勝感激。 
          在兩者無法同時實現的情況下,應依照需實現的功能有所取舍。綜合兩種模式的優缺點,我認為采用表分區技術較為適用于我們的應用。
          Oracle的表分區有以下幾種類型:
          1)范圍分區:將表按某一字段或若干個字段的取值范圍分區。
          2)hash分區:將表按某一字段的值均勻地分布到若干個指定的分區。
          3)復合分區:結合了前面兩種分區類型的優點,首先通過值范圍將表進行分區,然后以hash模式將數據進一步均勻分配至物理存儲位置。
          綜合考慮各項因素,以第三種類型最為優越。(本人實在技術有限僅采用了第1種范圍分區,因為比較簡單,便于治理)
          優化的具體步驟:
          1.確定需要優化分區的表:
          經過對系統數據庫表結構和字段,應用程序的分析,現在確定那些大表需要進行分區:
          如帳戶交易明細表acct_detail.
          2.確定表分區的方法和分區鍵:
          分區類型:采用范圍分區。
          分 區 鍵:
          按trans_date(交易時間)字段進行范圍分區.
          3.確定分區鍵的分區范圍,及打算分多少分區:
          如:帳戶交易明細表acct_detail.
          根據字段(trans_date)分成一下分區:
          1).分區1:09/01/2003   
          2).分區2:10/01/2003   
          3).分區3:11/01/2003   
          4).分區4:12/01/2003   
          5).分區5:01/01/2004 
          6).分區6:02/01/2004 
             該表明顯需要在以后增加分區。
          4.建立分區表空間和分區索引空間
            1).建立表的各個分區的表空間: 
             1.分區1:crm_detail_200309
             CREATE TABLESPACE crm_detail_200309  DATAFILE  
             ‘/u1/oradata/orcl/crm_detail_20030901.dbf’ 
             SIZE 2000M EXTENT MANAGEMENT LOCAL UNIFORM size 16M;
             其它月份以后同以上(我在此采用oracle的表空間本地治理的方法)。

            2). 建立分區索引表空間
             1.分區1:index_detail_200309
             CREATE TABLESPACE index_detail_200309  DATAFILE  
             ‘/u3/oradata/orcl/index_detail_20030901.dbf’ 
             SIZE 2000M  EXTENT MANAGEMENT LOCAL UNIFORM size 16M;
          5.建立基于分區的表:
             create  table  table name
             (

              ........
              )
              enable row movment               --此語句是能修改行分區鍵值,也就是如不添加該                                     句不能修改記錄的分區鍵值,不能使記錄分區遷移
              PARTITION   BY   RANGE  (TRANS_DATE)
              (
                 PARTITION     crm_detail_200309  VALUES  LESS THAN 
          (TO_DATE (‘09/01/2003’,’mm/dd/yyyy’ ) )
          TABLESPACE   crm_detail_200309,
                 其他分區.....
               );
          6.建立基于分區的索引:
            create  index   index_name  on table_name (分區鍵+…)
             global                                  --這里是全局分區索引,也可以建本地索引
             PARTITION   BY   RANGE  (TRANS_DATE)
             (
               PARTITION     index_detail_200309  VALUES  LESS THAN 
               (TO_DATE ('09/01/2003','mm/dd/yyyy' )) 
               TABLESPACE   index_detail_200309,
               其他索引分區...
              );
             
          對表的分區就這樣完成了,第一次主要確定表分區的分區策約是最重要的,可我覺得對表分區難在以后對表分區的治理上面,因為隨著數據量的增加,表分 區必然存在刪除,擴容,增加等。在這些過程中還牽涉到全局等索引,因為對分區表進行ddl操作為破壞全局索引,故全局索引必須在ddl后要重 rebuild.

          以上寫的很亂也很差,希望大家多多諒解和指點。

          posted on 2009-11-15 10:25 gdufo 閱讀(1670) 評論(1)  編輯  收藏 所屬分類: Database (oracle, sqlser,MYSQL)

          評論

          # re: oracle大表分區的一點點心得 2013-02-19 15:46 小葉

          Oracle看來很復雜啊,有很多地方不明白!  回復  更多評論   

          導航

          統計

          常用鏈接

          留言簿(6)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          收藏夾

          Hibernate

          友情鏈接

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 遂川县| 神池县| 天台县| 抚州市| 梁平县| 博野县| 阿巴嘎旗| 开江县| 道孚县| 渭南市| 栾川县| 济宁市| 乾安县| 伊宁市| 天柱县| 长汀县| 通河县| 新晃| 望江县| 琼中| 漳州市| 白沙| 彭泽县| 雷波县| 特克斯县| 炎陵县| 福贡县| 噶尔县| 邯郸市| 缙云县| 咸宁市| 岳阳市| 江津市| 安化县| 桂阳县| 寿宁县| 曲阳县| 高尔夫| 洛扎县| 博爱县| 凌源市|