ORACLE10G 分区建立的例子

 1   、分区表的建立:     

    某公司的每年产生巨大的销售记录,DBA向公司建议每季度的数据放在一个分区内,以下示范的是该公司1999年的数据(假设每月产生30M的数据),操作如下:     
  STEP1、建立表的各个分区的表空间:     
  CREATE   TABLESPACE   ts_sale1999q1     
  DATAFILE   ‘/u1/oradata/sales/sales1999_q1.dat’     
  SIZE   100M     
  DEFAULT   STORAGE   (INITIAL   30m   NEXT   30m   MINEXTENTS   3   PCTINCREASE   0)     
  CREATE   TABLESPACE   ts_sale1999q2     
  DATAFILE   ‘/u1/oradata/sales/sales1999_q2.dat’     
  SIZE   100M     
  DEFAULT   STORAGE   (INITIAL   30m   NEXT   30m   MINEXTENTS   3   PCTINCREASE   0)     
  CREATE   TABLESPACE   ts_sale1999q3     
  DATAFILE   ‘/u1/oradata/sales/sales1999_q3.dat’     
  SIZE   100M     
  DEFAULT   STORAGE   (INITIAL   30m   NEXT   30m   MINEXTENTS   3   PCTINCREASE   0)     
  CREATE   TABLESPACE   ts_sale1999q4     
  DATAFILE   ‘/u1/oradata/sales/sales1999_q4.dat’     
  SIZE   100M     
  DEFAULT   STORAGE   (INITIAL   30m   NEXT   30m   MINEXTENTS   3   PCTINCREASE   0)     
  STEP2、建立基于分区的表:     
  CREATE   TABLE   sales     
  (invoice_no   NUMBER,     
  ...     
  sale_date   DATE   NOT   NULL   )     
  PARTITION   BY   RANGE   (sale_date)     
  (PARTITION   sales1999_q1     
  VALUES   LESS   THAN   (TO_DATE(‘1999-04-01’,’YYYY-MM-DD’)     
  TABLESPACE   ts_sale1999q1,     
  PARTITION   sales1999_q2     
  VALUES   LESS   THAN   (TO_DATE(‘1999-07-01’,’YYYY-MM-DD’)     
  TABLESPACE   ts_sale1999q2,     
  PARTITION   sales1999_q3     
  VALUES   LESS   THAN   (TO_DATE(‘1999-10-01’,’YYYY-MM-DD’)     
  TABLESPACE   ts_sale1999q3,     
  PARTITION   sales1999_q4     
  VALUES   LESS   THAN   (TO_DATE(‘2000-01-01’,’YYYY-MM-DD’)     
  TABLESPACE   ts_sale1999q4   );     
    
    
  2   、分区表的扩容:     
    
  到了1999年年底,DBA应向表中加入2000年的表空间,同样是每季度一个表空间,由于公司业务欣欣向荣,预计每个分区为40M,操作如下。     
  STEP1、建立表空间:     
  CREATE   TABLESPACE   ts_sale2000q1     
  DATAFILE   ‘/u1/oradata/sales/sales2000_q1.dat’     
  SIZE   130M     
  DEFAULT   STORAGE   (INITIAL   40m   NEXT   40m   MINEXTENTS   3   PCTINCREASE   0)     
  其他表空间ts_sale2000q2,ts_sale2000q3,ts_sales2000q4如法炮制。     
  STEP2、为表添加表空间:     
  ALTER   TABLE   sales     
  ADD   PARTITION   sales2000_q1     
  VALUES   LESS   THAN   (TO_DATE(‘2000-04-01’,’YYYY-MM-DD’)     
  TABLESPACE   ts_sale2000q1;     
  其他分区sales2000_q1,sales2000_q1,sales2000_q1如法炮制。     
    
    
  3   、删除不必要的分区:     
    
  公司规定:销售的明细数据两年内必须保存在线。到2001年,DBA必须将1999年的数据备份(备份方法见5、EXPORT分区),将1999年的分区删除,将空间供后来的数据使用。如此循环,永远保持两年的销售数据在线。     
    
  STEP1、DROP   分区:     
  ALTER   TABLE   sales     
  DROP   PARTION   sales1999_q1;     
  ALTER   TABLE   sales     
  DROP   PARTION   sales1999_q2;     
  ALTER   TABLE   sales     
  DROP   PARTION   sales1999_q3;     
  ALTER   TABLE   sales     
  DROP   PARTION   sales1999_q4;     
  STEP2、利用操作系统的工具删除以上表空间占用的文件(表空间基于裸设备无须次步),UNIX系统为例:     
  oracle$   rm   /u1/oradata/sales/sales1999_q1.dat     
  oracle$   rm   /u1/oradata/sales/sales1999_q2.dat     
  oracle$   rm   /u1/oradata/sales/sales1999_q3.dat     
  oracle$   rm   /u1/oradata/sales/sales1999_q4.dat     
    
    
  4   、分区的其他操作:     
    
  分区的其他操作包括截短分区(truncate),将存在的分区划分为多个分区(split),交换分区(exchange),重命名(rename),为分区建立索引等。DBA可以根据适当的情况使用。     
  以下仅说明分裂分区(split),例如该公司1999年第四季度销售明细数据急剧增加(因为庆国庆、迎千禧、贺回归),DBA向公司建议将第四季度的分区划分为两个分区,每个分区放两个月份的数据,操作如下:     
  STEP1、按(1)的方法建立两个分区的表空间ts_sales1999q4p1,     
  ts_sales1999q4p2;     
  STEP2、给表添加两个分区sales1999_q4_p1,sales1999_q4_p2;     
  STEP3、分裂分区:     
  ALTER   TABLE   sales     
  SPLIT   PARTITON   sales1999_q4     
  AT   TO_DATE   (‘1999-11-01’,’YYYY-MM-DD’)     
  INTO   (partition   sales1999_q4_p1,   partition   sales1999_q4_p2)     
    
    
  5   、查看分区信息:     
    
  DBA要查看表的分区信息,可查看数据字典USER_EXTENTS,操作如下:     
  SVRMGRL>SELECT   *   FROM   user_extents   WHERE   SEGMENT_NAME=’SALES’;     
  SEGMENT_NA   PARTITION_   SEGMENT_TYPE   TABLESPACE     
  ----------   ------------   ---------------   --------------     
  SALES   SALES1999_Q1   TABLE   PARTITION   TS_SALES1999Q1     
  SALES   SALES1999_Q2   TABLE   PARTITION   TS_SALES1999Q2     
  SALES   SALES1999_Q3   TABLE   PARTITION   TS_SALES1999Q3     
  SALES   SALES1999_Q4   TABLE   PARTITION   TS_SALES1999Q4     
  SALES   SALES2000_Q1   TABLE   PARTITION   TS_SALES1999Q1     
  SALES   SALES2000_Q2   TABLE   PARTITION   TS_SALES1999Q2     
  SALES   SALES2000_Q3   TABLE   PARTITION   TS_SALES1999Q3     
  SALES   SALES2000_Q4   TABLE   PARTITION   TS_SALES1999Q4     
    
    
  5   、EXPORT分区:     
    
  ORACLE8的EXPORT   工具可在表的分区以及导出数据,例如到2001年,DBA必须将1999年的数据按分区导出,操作如下:     
  oracle$   exp   sales/sales_password   tables=sales:sales1999_q1   rows=Y     
  file=sales1999_q1.dmp     
  oracle$   exp   sales/sales_password   tables=sales:sales1999_q2   rows=Y     
  file=sales1999_q2.dmp     
  oracle$   exp   sales/sales_password   tables=sales:sales1999_q3   rows=Y     
  file=sales1999_q3.dmp     
  oracle$   exp   sales/sales_password   tables=sales:sales1999_q4   rows=Y     
  file=sales1999_q4.dmp     
  exp userid=es_dba/change_on_install@ora140    tables=(ei_srcdata_hist.HA_JSMX_CL:M_200807) file=D:/ES_DWH_PUB.dmp log=D:/ES_DWH_PUB.log  rows=y   statistics=none
  pause    
  exp userid= ei_srcdata_hist/ei_srcdata_hist@ora140  tables=(HA_JSMX_CL:M_200807) file=D:/ES_DWH_PUB.dmp log=D:/ES_DWH_PUB.log  rows=y
 exp userid=es_dba/change_on_install@SWESIM106 tables=(ET_CUSTODY_HIST.FUND_BAL)  file=E:/lszc/FUND_BAL.dmp log=E:/lszc/FUND_BAL_EXP.log rows=y statistics=NONE
  6   、IMPORT分区:     
    
  ORACLE8的IMPORT   工具可在表的分区以及导入数据,例如在2001年,用户要查看1999年的数据,DBA必须导入1999年的数据,使之在线,操作如下:     
  STEP1、建立表的1999年的四个表空间和相应的分区,参照(2);     
  STEP2、导入数据:     
  oracle$   imp   sales/sales_password   FILE   =sales1999_q1.dmp     
  TABLES   =   (sales:sales1999_q1)   IGNORE=y     
  oracle$   imp   sales/sales_password   FILE   =sales1999_q2.dmp     
  TABLES   =   (sales:sales1999_q2)   IGNORE=y     
  oracle$   imp   sales/sales_password   FILE   =sales1999_q3.dmp     
  TABLES   =   (sales:sales1999_q3)   IGNORE=y     
  oracle$   imp   sales/sales_password   FILE   =sales1999_q4.dmp     
  TABLES   =   (sales:sales1999_q4)   IGNORE=y     
                  [若有用,你参考参考]
imp userid=es_dba/change_on_install@ORA18 buffer=102400 fromuser=(EI_SRCDATA_HIST) touser=(ES_DWH_HIST) file=D:/ES_DWH_PUB.dmp log=D:/ES_DWH_PUB.log  TABLES   =   (HA_JSMX_CL:M_200807)  ignore=y 
pause
imp userid=system/oracle@dwh125 buffer=102400 fromuser=(ET_CUSTODY_HIST) touser=(ES_DWH_HIST) file=E:/lszc/FUND_BAL.dmp log=E:/lszc/FUND_BAL_EXP.log  TABLES=(FUND_BAL)  ignore=y 
数据库大表的优化:采用蔟表(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.     
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值