Oracle表分區(qū)

          自從oracle8i 開始可以把一個(gè)表分割為多個(gè)小的部分,這樣可以對(duì)oracle的性能優(yōu)化帶來很大的好處~
          例如:改善表的查詢性能,更加容易管理表數(shù)據(jù),備份和恢復(fù)操作更方便

          在oracle 中分區(qū)表 分為好幾種的(范圍分區(qū),散列分區(qū),子分區(qū),列表分區(qū),索引分區(qū))下面我們來慢慢介紹

          現(xiàn)在我們來建立一個(gè)[范圍分區(qū)]
          create table RangeTable(
          id int primary key,
          name varchar(20),
          grade int
          )
          partition by rang(grade)
          (
          partition part1 values less then(50) tablespace Part1_tb,
          partition part2 values less then(MAXVALUE) tablespace Part2_tb
          );
          如果grade的值小于50的話 就把記錄放到名為part1的分區(qū)當(dāng)中,part1分區(qū)將被存儲(chǔ)在Part1_tb表空間中
          其他的就放在part2中 MAXVALUE是oracle的關(guān)鍵字 表示最大值

          [散列分區(qū)]
          create table HashTable(
          id int primary key,
          name varchar(20),
          grade int
          )
          /*有兩種方式,1就是指定分區(qū)數(shù)目和所使用的表空間,2指定以命名的分區(qū)*/
          partition by hash(grade)
          partitions 10 -- 指定分區(qū)的數(shù)目
          store in(Part1_tb,Part2_tb,Part3_tb) --如果指定的分區(qū)數(shù)目比表空間多,分區(qū)會(huì)以循環(huán)方式分配到表空間
          /*------------------------------------*/
          partition by rang(grade)--這種方式就是 指定以命名的分區(qū)
          (
          partition part1 tablespace Part1_tb,
          partition part2 tablespace Part2_tb
          );

          [子分區(qū)]即是分區(qū)的分區(qū)
          create table ChildTable(
          id int primary key,
          name varchar(20),
          grade int
          )
          partition by rang(grade)
          subpartition by hash(grade)
          partitions 5
          (
          partition part1 values less then(30) tablespace Part1_tb,
          partition part2 values less then(60) tablespace Part2_tb,
          partition part3 values less then(MAXVALUE) tablespace Part3_tb
          );

          [列表分區(qū)]告訴oracle所有可能的值
          create table ListTable(
          id int primary key,
          name varchar(20),
          area varchar(10)
          )
          partition by list(area)
          (
          partition part1 values('guangdong','beijing') tablespace Part1_tb,
          partition part2 values('shanghai','nanjing') tablespace Part2_tb
          );

          [索引分區(qū)]索引也可以按照和表進(jìn)行分區(qū)時(shí)使用的相同的值范圍來分區(qū)
          create index IndexTable_index
          on IndexTable(name)
          local
          (
          partition part1 tablespace Part1_tb,
          partition part2 tablespace Part2_tb
          )
          --local 告訴oracle表 IndexTable的每一個(gè)分區(qū)建立一個(gè)獨(dú)立的索引
          create index IndexTable_index
          on IndexTable(name)
          global;
          --global為全局索引 全局索引可以包含多個(gè)分區(qū)的值 局部索引比全局索引容易管理,而全局索引比較快
          注意:不能為散列分區(qū) 或者 子分區(qū)創(chuàng)建全局索引

          查詢某一個(gè)表分區(qū)
          select * from table partition(part1);

           

           

           

           

           

           

           


          oracle表分區(qū)主要是為了容易管理和性能方面考慮,有四種分區(qū)方法:

          1.區(qū)間分區(qū):
          create table range_example
          (
          range_column number,
          sj date
          )
          PARTITION BY RANGE(range_column)
          (
          PARTITION part_1 VALUE LESS THAN(18),
          PARTITION part_2 VALUE LESS THAN(40),
          PARTITION part_3 VALUE LESS THAN(120)
          )
          ;

          2.散列分區(qū)
          create table range_example
          (
          range_column number,
          sj date
          )
          PARTITION BY HASH(range_column)
          (
          PARTITION part_1,
          PARTITION part_2
          );
          使用散列分區(qū)你無法控制一行放在哪個(gè)分區(qū)中,如果改變散列分區(qū)的個(gè)數(shù),所有的數(shù)據(jù)都將在分區(qū)中重新分布.

          3.列表分區(qū)
          create table range_example
          (
          range_column number,
          sj date
          )
          PARTITION BY LIST(range_column)
          (
          PARTITION part_1 VALUES(1,2,3),
          PARTITION part_2 VALUES(4,5,6),
          PARTITION part_2 VALUES(default)
          );

          4.組合分區(qū)
          組合分區(qū)是區(qū)間分區(qū)和散列分區(qū)的組合或區(qū)間分區(qū)和列表分區(qū)的組合,
          頂層分區(qū)總是區(qū)間分區(qū),第二層分區(qū)可能是列表分區(qū)或散列分區(qū)
          create table range_example
          (
          range_column number,
          id varchar2(2),
          sj date
          )
          PARTITION BY RANGE(range_column)
          SUBPARTITION BY LIST(id)
          (
          PARTITION part_1 VALUES LESS THAN(18)
          (
          SUBPARTITOIN part_sub_1 VALUES('A','B','C'),
          SUBPARTITOIN part_sub_2 VALUES('D','E','F')
          )
          PARTIRION part_2 VALUES LESS THAN(40)
          (
          SUBPARTITION part_sub_3 VALUES('AA','BB','CC'),
          SUBPARTITION part_sub_4 VALUES('DD','EE','FF')
          )
          PARTITION part_3 VALUES LESS THAN(120)
          (
          SUBPARTITION part_sub_5 VALUES(default)
          )
          )

           

          分區(qū)維護(hù)
                移動(dòng)分區(qū) alter table goods move partition p1 tablespace system;
                刪除分區(qū) alter table goods drop partition p1;
                添加分區(qū) alter table goods add partition p1 values
                         less than(to_date('1999-08=01','YYYY-MM-DD'));
                結(jié)合分區(qū)(只能用于散列方法分區(qū))
                         alter table goods coalesce partition;
                截?cái)喾謪^(qū) alter table goods truncate partition p3;
                拆分分區(qū) alter table goods split partiiton p2
                         at(to_date('1999-12-12','yyyy-mm-dd'))
                         into(partiiton p4,partiiton p5);
                合并分區(qū) alter table goods merge partitions p4,p5 into parititon                p6

          交換表中的數(shù)據(jù)
                 alter table tab2 exchange partiiton p1
                 with table tab1



          二,-------------------------------------------------------------
          -- Create table(創(chuàng)建分區(qū)表)
          create table BILL_MONTHFEE_ZERO
          (
            SERV_ID             NUMBER(20) not null,
            BILLING_CYCLE_MONTH NUMBER(6) not null,
            DATE_TYPE           NUMBER(1),
            ACC_NBR             VARCHAR2(80)
          )
           partition by range (BILLING_CYCLE_MONTH)
            (partition p_200407 values less than (200407)
              tablespace TS_ZIKEN
                storage(initial 100k next 100k minextents 1 maxextents unlimited pctincrease 0),
             partition p_200408 values less than (200408)
              tablespace TS_ZIKEN
                storage(initial 100k next 100k minextents 1 maxextents unlimited pctincrease 0))
                ;
          create index idx_bill_monthfee_zero_idx01 on bill_monthfee_zero(billing_cycle_month)
          tablespace TS_ZIKEN_idx
          storage(initial 100k next 100k minextents 1 maxextents unlimited pctincrease 0) nologging;
          grant all on bill_monthfee_zero to dxsq_dev;
           
          --增加分區(qū)表
           
          alter table BILL_MONTHFEE_ZERO add Partition p_200409
          values less than (200409) tablespace ts_ziken;

          --刪除一分區(qū)
          alter table part_tbl drop Partition part_tbl_08;
           
          --將一個(gè)分區(qū)分為兩個(gè)分區(qū)
          alter table bill_monthfee_zero split Partition p_200409 at (200409)
          into (Partition p_200409_1 tablespace ts_ziken,
          Partition p_200409_2 tablespace ts_ziken_idx);
           
          --合并分區(qū)
          ALTER TABLE bill_monthfee_zero
             MERGE PARTITIONS p_200408, p_200409 INTO PARTITION p_all
           
          --將分區(qū)改名
          alter table bill_monthfee_zero rename Partition p_200408 to p_fee_200408
           
          --將分區(qū)改表空間
          alter table bill_monthfee_zero move Partition p_200409
          tablespace ts_ziken_01 nologging
           
          --查詢特定分區(qū)
          select count(*) from BILL_MONTHFEE_ZERO partition (p_200407);
           
          --添加數(shù)據(jù)
          insert into bill_monthfee_zero select * from bill_monthfee_zero partition (p_200407)
           
          --分區(qū)表的導(dǎo)出
          userid=dxsq/teledoone@jndxsq154
          buffer=102400
          tables=bill_monthfee:P_200401,
          file=E:\exp_para\exp_dxsq_tables.dmp
          log=E:\exp_para\exp_dxsq_tables.log
           
          --exchange partition:
          交換分區(qū)是將一個(gè)分區(qū)的數(shù)據(jù)和一個(gè)非分區(qū)的表數(shù)據(jù)進(jìn)行數(shù)據(jù)交換。條件是兩者邏輯結(jié)構(gòu)相同,而且表數(shù)據(jù)的數(shù)據(jù)不能超出分區(qū)主鍵的范圍,否則:
          SQL> alter table baisadmin.t_name exchange partition p5 with table baisadmin.t_n
          ame_check_reg;
          alter table baisadmin.t_name exchange partition p5 with table baisadmin.t_name_bak
           
           
          技巧:
          刪除表中一個(gè)字段:
          alter table bill_monthfee_zero set unused column date_type;
          添加一個(gè)字段:alter table bill_monthfee_zero add date_type number(1);
          posted on 2009-12-02 11:48 sanmao 閱讀(218) 評(píng)論(0)  編輯  收藏

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           

          常用鏈接

          留言簿(5)

          隨筆分類

          隨筆檔案

          搜索

          •  

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 陆丰市| 元江| 花莲市| 南溪县| 垫江县| 灯塔市| 墨玉县| 聂荣县| 高密市| 奉化市| 拉孜县| 大安市| 马关县| 南木林县| 建阳市| 夏津县| 楚雄市| 九龙县| 韶山市| 鸡西市| 黎城县| 阳高县| 黄大仙区| 靖远县| 定陶县| 巴林右旗| 双城市| 九台市| 肃宁县| 环江| 古丈县| 通州市| 中宁县| 平舆县| 阿拉善盟| 疏附县| 武宁县| 息烽县| 大姚县| 鹤庆县| 盐津县|