精华内容
下载资源
问答
  • Oracle自动创建分区

    千次阅读 2020-01-07 11:56:24
    Oracle的分区表大家应该都不陌生,分区表有范围分区,列表分区,HASH分区及组合分区4种。其中,范围分区应用的最为广泛,列表次之。 范围分区有几个关键字,一个是partition by range,表示分区为范围分区;values ...

    Oracle的分区表大家应该都不陌生,分区表有范围分区,列表分区,HASH分区及组合分区4种。其中,范围分区应用的最为广泛,列表次之。

    范围分区有几个关键字,一个是partition by range,表示分区为范围分区;values less than 是范围分区的特定语法,指明具体的范围。
    
    在生产应用中,我们经常会根据年份或者月份去创建范围分区。目前有个客户,他们需要根据月份做一个范围分区表,但是现在他们要每到月底,需要手动去创建一个分区。有时候因为遗忘可能导致新的数据进来没有对应的分区而报错。因此希望通过一个自动脚本,定时自动创建这个分区。
    
    大致思路:创建一个存储过程,这个存储过程根据日期,对字符串进行操作,生成对应的分区表名,然后创建一个作业,到月底最后一天的晚上10点执行。
    
    首先,分区表的创建语句如下:
    

    create table PAR_TEST
    (
    LOANTYPE VARCHAR2(8),
    REFNO VARCHAR2(25),
    CUSTCOD VARCHAR2(12),
    BRANCH VARCHAR2(6),
    FLSTSCD VARCHAR2(16),
    LNCCY VARCHAR2(3),
    VSPREAD NUMBER,
    DFTYPE VARCHAR2(4000),
    A23ACIT VARCHAR2(13),
    MAP_GL VARCHAR2(13),
    TSDATE DATE,
    CCY_TYPE CHAR(1)
    )
    partition by range (TSDATE)
    (
    partition DPT1 values less than (TO_DATE(’ 2015-07-31 00:00:00’, ‘SYYYY-MM-DD HH24:MI:SS’, ‘NLS_CALENDAR=GREGORIAN’))
    tablespace CRMDATA
    pctfree 10
    initrans 1
    maxtrans 255,
    partition DPT2 values less than (TO_DATE(’ 2015-08-31 00:00:00’, ‘SYYYY-MM-DD HH24:MI:SS’, ‘NLS_CALENDAR=GREGORIAN’))
    tablespace CRMDATA
    pctfree 10
    initrans 1
    maxtrans 255,
    partition DPT3 values less than (TO_DATE(’ 2015-09-30 00:00:00’, ‘SYYYY-MM-DD HH24:MI:SS’, ‘NLS_CALENDAR=GREGORIAN’))
    tablespace CRMDATA
    pctfree 10
    initrans 1
    maxtrans 255
    );
    根据我们对分区表的了解,多加一个分区的语句如下:

    alter table PAR_TEST add partition DPTxx values less than (to_date(‘2017-01-31 00:00:00’,‘SYYYY-MM-DD HH24:MI:SS’,‘NLS_CALENDAR=GREGORIAN’))
    tablespace CRMDATA pctfree 10 initrans 1 maxtrans 255;
    所以根据创建分区的语句,编写如下自动创建的存储过程:

    create or replace procedure add_newpartitions
    as
    cursor c_parts is
    select max(partition_name) as part_name from user_tab_partitions where table_name=‘PAR_TEST’ group by table_name; --捕捉表最大分区的分区表名

    v_pname varchar2(32);
    v_sql varchar2(3999);
    v_npart varchar2(32);
    v_newp date;

    begin
    for i in c_parts loop
    v_pname := i.part_name; --将刚才捕捉到的表名赋值给该变量

    dbms_output.put_line(‘v_pname:’); --代码调试打印,需要打开set serveroutput on才能看到结果
    dbms_output.put_line(v_pname);

    v_npart := substr(v_pname,instr(v_pname,‘T’)+1); --用字母T截取表名,获得DPTxx的T后面的数字xx

    v_newp := last_day(last_day(sysdate)+1); --取到下个月的最后一天
    dbms_output.put_line(v_newp);

    v_pname := substr(v_pname,1,instr(v_pname,‘T’))||to_char(to_number(v_npart)+1); --字符串拼接,拼接出将要创建的分区表的表名
    dbms_output.put_line(‘v_pname:’);
    dbms_output.put_line(v_pname);

    v_sql := ‘alter table DW_DPDAILY add partition ‘||v_pname||’ values less than (’||‘to_date(’’’||to_char(v_newp,‘yyyy-mm-dd’)||’ 00:00:00’’,’’’||‘SYYYY-MM-DD HH24:MI:SS’||’’’,’‘NLS_CALENDAR=GREGORIAN’’)’||’)’||’ tablespace CRMDATA pctfree 10 initrans 1 maxtrans 255’;

    dbms_output.put_line(v_sql);
    execute immediate v_sql;
    end loop;
    end;
    有了这个存储过程,需要定期执行,因此就需要创建一个JOB,让这个存储过程定期被调用执行,具体如下:

    DECLARE
    v_job number;
    begin
    dbms_job.submit(
    job => v_job,
    what => ‘add_newpartitions;’,
    next_date => trunc(last_day(SYSDATE))+22/24, --每月最后一天的晚上10点执行
    interval => ‘trunc(last_day(add_months(SYSDATE,1)))+22/24’); --下个月的最后一天晚上10点执行
    commit;
    end;
    /
    注:此脚本创建分区表的格式为DPT20,如果每个分区的命名规则不是这样,需要修改字符串拼接那部分。

    转自 http://www.learnfuture.com/article/1706

    展开全文
  • oracle 创建分区表以及自动添加分区

    万次阅读 2018-08-01 16:25:51
     列表分区(list)  范围-哈希复合分区(range-hash)  范围-列表复合分区(range-list)    查看分区数 :select*from user_tab_partitions where table_name='表名'  查看分区内容:s...

    oracle提供了以下几种分区类型:
        范围分区(range)
        哈希分区(hash)
        列表分区(list)
        范围-哈希复合分区(range-hash)
        范围-列表复合分区(range-list)
        
        查看分区数  :select*from user_tab_partitions where table_name='表名'
        查看分区内容:select * from 表名 partition(分区名) ;
        
        alter table 表名 add partition 分区名 values (分区字段)
        tablespace tbs_zba_czc       --表空间
        pctfree 10                      --预留的空间大小,10%
        initrans 1                      --的是一个 block 上初始预分配给并行交易控制的空间
        maxtrans 255                  --如果initrans 不够了,自动扩展,最大这个值
        
        分区表示例:
            create table temp_fee(
            month_id             varchar2(6),
            prov_id              varchar2(3),
            total_fee            number)
            nologging
            
            partition by range (month_id)  --主分区
            
            subpartition by list (prov_id) --子分区
            (
              partition part201606 values less than ('201711')
                tablespace tbs_zba_jm
                pctfree 10
                initrans 1
                maxtrans 255
              (
                subpartition sys_subp20429 values (default) tablespace tbs_zba_jm
              )
            );
        
    一、范围分区(特别要注意的是"范围"中不包含=)

        1、单范围
            create table temp_fee(
                month_id             varchar2(6),
                prov_id              varchar2(3),
                device_number        varchar2(40))
                nologging
            partition by range (month_id)
            (
              partition part201606 values less than ('201711'),
              partition part201607 values less than ('201710'),
              partition part201608 values less than ('201709'),
              partition part201609 values less than ('201708')
            );
            
        2、多范围分区
            create table temp_fee(
                month_id             varchar2(6),
                prov_id              varchar2(3),
                device_number        varchar2(40))
                nologging
            partition by range (month_id,prov_id)
            (
              partition part201606 values less than ('201711','011'),
              partition part201607 values less than ('201710','012'),
              partition part201608 values less than ('201709','013'),
              partition part201609 values less than ('201708','014')
            );
            
        3、循环分区
        
            1)建表
                create table temp_fee(
                    month_id             varchar2(6),
                    prov_id              varchar2(3),
                    device_number        varchar2(40))
                    nologging
                partition by range (month_id)
                (
                  partition part201606 values less than ('201711')
                );
                
            2)分区拓展
                declare
                 v_table varchar2(64):='temp_fee';
                 v_month_start varchar2(8) := '201801';
                 v_month_end   varchar2(8) := '201803';
                 i     varchar2(8);
                 v_sql varchar2(5000);
                 v_nmon varchar2(8);
                begin
                        i := v_month_start;
                  while i <= v_month_end loop
                    v_nmon := to_char(add_months(to_date(i,'yyyymm'),1),'yyyymm');
                    v_sql := 'alter table '||v_table||' add partition part'||i||' values less than ('''||v_nmon||''')'; 
                    execute immediate v_sql ;
                    i := to_char(add_months(to_date(i,'yyyymm'),1),'yyyymm');
                  end loop;
                  commit;
                end;
        
    二、列表分区

        1、建表
              create table temp_qw(
                prov_id              varchar2(3),
                d_number             varchar2(15),
                user_id              varchar2(15))
                nologging
              partition by list (prov_id)
              (
                partition part09 values ('009')       
              );
              
        2、分区拓展
            declare
             v_table varchar2(64):='temp_qw';
             v_sql varchar2(5000);
            begin
                for j in (select prov_id from prov order by prov_id) loop
                  v_sql := 'alter table '||v_table||' add partition part'||j.prov_id||' values ('''||j.prov_id||''')'; 
                  execute immediate v_sql ;
                end loop;
              commit;
            end;
        
        需要注意的问题:
            一但列表分区后,如果插入了未分区的字段会报错,为了防止出现这种情况一般我们在添加完分区后
            alter table temp_qw add partition part_default values (default); 
            这样做的后续问题就是,在想添加分区的时候就的把这个分区删除掉
          示例:
              create table temp_qwe(
                    prov_id              varchar2(3),
                    d_number             varchar2(15),
                    user_id              varchar2(15))
                    nologging
              partition by list (prov_id)
                  (
                    partition part11 values ('011'),
                    partition part10 values ('010'),
                    partition part09 values (default)       
                  );
              删除分区:alter table temp_qwe drop partition part09
            需要注意的是,在删除分区的时候一定要将分区内数据备份,不然删除分区的时候会将数据删除
          
    三、哈希分区
        再碰到未知怎么去分区的时候
            create table test(
                      transaction_id number primary key,
                      item_id number(8) not null)
            partition by hash(transaction_id)
            (
                partition part_01 tablespace tablespace01,
                partition part_02 tablespace tablespace02,
                partition part_03 tablespace tablespace03
            );

    四、组合分区
        在生产中我们会常常用到这样的分区
        示例:
            create table temp_lfc_zcdwk_acct
                   (month_id      varchar2(6),
                   day_id         varchar2(6),
                   prov_id        varchar2(6),
                   flag           varchar2(2) 
                   )
            partition by range (month_id, prov_id)
            subpartition by list (day_id)
            (
              partition part201801_049 values less than ('201801', '050')
                
              (
                subpartition part201801_049_subpart_01 values ('01')  ,
                subpartition part201801_049_subpart_02 values ('02')  ,
                subpartition part201801_049_subpart_03 values ('03')  ,
                subpartition part201801_049_subpart_04 values ('04')  ,
                subpartition part201801_049_subpart_05 values ('05')  ,
                subpartition part201801_049_subpart_06 values ('06')  ,
                subpartition part201801_049_subpart_07 values ('07')  ,
                subpartition part201801_049_subpart_08 values ('08')  ,
                subpartition part201801_049_subpart_09 values ('09')  ,
                subpartition part201801_049_subpart_10 values ('10')  ,
                subpartition part201801_049_subpart_11 values ('11')  ,
                subpartition part201801_049_subpart_12 values ('12')  ,
                subpartition part201801_049_subpart_13 values ('13')  ,
                subpartition part201801_049_subpart_14 values ('14')  ,
                subpartition part201801_049_subpart_15 values ('15')  ,
                subpartition part201801_049_subpart_16 values ('16')  ,
                subpartition part201801_049_subpart_17 values ('17')  ,
                subpartition part201801_049_subpart_18 values ('18')  ,
                subpartition part201801_049_subpart_19 values ('19')  ,
                subpartition part201801_049_subpart_20 values ('20')  ,
                subpartition part201801_049_subpart_21 values ('21')  ,
                subpartition part201801_049_subpart_22 values ('22')  ,
                subpartition part201801_049_subpart_23 values ('23')  ,
                subpartition part201801_049_subpart_24 values ('24')  ,
                subpartition part201801_049_subpart_25 values ('25')  ,
                subpartition part201801_049_subpart_26 values ('26')  ,
                subpartition part201801_049_subpart_27 values ('27')  ,
                subpartition part201801_049_subpart_28 values ('28')  ,
                subpartition part201801_049_subpart_29 values ('29')  ,
                subpartition part201801_049_subpart_30 values ('30')  ,
                subpartition part201801_049_subpart_31 values ('31')  
              ),    
                partition part201801_050 values less than ('201801', '051')
                
              (
                subpartition part201801_050_subpart_01 values ('01')  ,
                subpartition part201801_050_subpart_02 values ('02')  ,
                subpartition part201801_050_subpart_03 values ('03')  ,
                subpartition part201801_050_subpart_04 values ('04')  ,
                subpartition part201801_050_subpart_05 values ('05')  ,
                subpartition part201801_050_subpart_06 values ('06')  ,
                subpartition part201801_050_subpart_07 values ('07')  ,
                subpartition part201801_050_subpart_08 values ('08')  ,
                subpartition part201801_050_subpart_09 values ('09')  ,
                subpartition part201801_050_subpart_10 values ('10')  ,
                subpartition part201801_050_subpart_11 values ('11')  ,
                subpartition part201801_050_subpart_12 values ('12')  ,
                subpartition part201801_050_subpart_13 values ('13')  ,
                subpartition part201801_050_subpart_14 values ('14')  ,
                subpartition part201801_050_subpart_15 values ('15')  ,
                subpartition part201801_050_subpart_16 values ('16')  ,
                subpartition part201801_050_subpart_17 values ('17')  ,
                subpartition part201801_050_subpart_18 values ('18')  ,
                subpartition part201801_050_subpart_19 values ('19')  ,
                subpartition part201801_050_subpart_20 values ('20')  ,
                subpartition part201801_050_subpart_21 values ('21')  ,
                subpartition part201801_050_subpart_22 values ('22')  ,
                subpartition part201801_050_subpart_23 values ('23')  ,
                subpartition part201801_050_subpart_24 values ('24')  ,
                subpartition part201801_050_subpart_25 values ('25')  ,
                subpartition part201801_050_subpart_26 values ('26')  ,
                subpartition part201801_050_subpart_27 values ('27')  ,
                subpartition part201801_050_subpart_28 values ('28')  ,
                subpartition part201801_050_subpart_29 values ('29')  ,
                subpartition part201801_050_subpart_30 values ('30')  ,
                subpartition part201801_050_subpart_31 values ('31')  
                ));                 

    双分区
        1、建表        
            create table temp_ee(
                month_id             varchar2(6),
                prov_id              varchar2(3),
                device_number        varchar2(40))
                nologging

            partition by range (month_id)
            subpartition by list (prov_id)
            (
              partition part201606 values less than ('201711')
              (
                subpartition sys_default values (default)
              )
            );

        2、分区拓展
            declare
             v_table varchar2(64):='temp_ee';
             v_month_start varchar2(8) := '201711';
             v_month_end   varchar2(8) := '201803';
             i     varchar2(8);
             v_sql varchar2(5000);
             v_nmon varchar2(8);
            begin
              i := v_month_start;
              while i <= v_month_end loop
                v_nmon := to_char(add_months(to_date(i,'yyyymm'),1),'yyyymm');
                v_sql := 'alter table '||v_table||' add partition part'||i||' values less than ('''||v_nmon||''')
                (
                  ';
                for j in (select prov_id from prov order by prov_id) loop
                  v_sql := v_sql || '  subpartition part'||i||'_subpart'||j.prov_id||' values ('''||j.prov_id||''') ,
                  ';
                end loop;
                v_sql := v_sql || '  subpartition part'||i||'_subpartdefault values (default) ) ';
                execute immediate v_sql ;
                i := to_char(add_months(to_date(i,'yyyymm'),1),'yyyymm');
              end loop;
              commit;
            end;

     

     

     

     

     

     

     

     

    展开全文
  • 创建两个表空间,参考《Oracle创建表空间和表》 SQL> create TABLESPACE TBSP_1 DATAFILE 'D:\app\Administrator\oradata\oracle\TBSP_1.dbf' SIZE 10M; 表空间已创建。 SQL> CREATE TABLESPACE TBSP_2 ...


    通过PL/SQL developer工具查看表空间的情况
    在这里插入图片描述
    创建两个表空间,参考《Oracle创建表空间和表》
    在这里插入图片描述

    SQL>  create TABLESPACE TBSP_1 DATAFILE 'D:\app\Administrator\oradata\oracle\TBSP_1.dbf' SIZE 10M;
    表空间已创建。
    SQL> CREATE TABLESPACE TBSP_2 DATAFILE 'D:\app\Administrator\oradata\oracle\TBSP_2.dbf' SIZE 10M;
    表空间已创建。
    

    查看创建好的表空间

    SQL> select * from v$tablespace;
    
           TS# NAME                           INC BIG FLA ENC
    ---------- ------------------------------ --- --- --- ---
             0 SYSTEM                         YES NO  YES
             1 SYSAUX                         YES NO  YES
             2 UNDOTBS1                       YES NO  YES
             4 USERS                          YES NO  YES
             3 TEMP                           NO  NO  YES
             6 TBSP_1                         YES NO  YES
             7 TBSP_2                         YES NO  YES
    

    分区

    1. 减少维护工作量
    2. 增强数据库可用性
    3. 均衡I/O
    4. 分区对用户透明,对其存在无感知
    5. 提高查询速度

    1 范围分区(range)

    • 数据根据分区键的范围进行分布

    例如:日期分区键–“08-2019”就会包括从“01-08-2019”到“31-08-2019”之间的所有分区键值。

    实例:
    创建一个商品零售表,根据销售日期创建四个范围分区。

    create table ware_retail_part(
     id integer primary key,
     retail_date date,
     ware_name varchar2(50)
     )
     partition by range(retail_date)
     (
     partition par_01 values less than(to_date('2011-04-01','yyyy-mm-dd')) tablespace TBSP_1,
      partition par_02 values less than(to_date('2011-07-01','yyyy-mm-dd')) tablespace TBSP_1,
      partition par_03 values less than(to_date('2011-10-01','yyyy-mm-dd')) tablespace TBSP_2,
       partition par_04 values less than(to_date('2012-01-01','yyyy-mm-dd')) tablespace TBSP_2
      )
    

    创建好后,插入若干条记录:

    SQL> insert into ware_retail_part values(1,to_date('2011-01-20','yyyy-mm-dd'),'平板电  脑');
    
    SQL> insert into ware_retail_part values(2,to_date('2011-04-15','yyyy-mm-dd'),'智能手  机');
    
    SQL>  insert into ware_retail_part values(3,to_date('2011-07-25','yyyy-mm-dd'),'MP5');
    

    查看分区和表格:

    SQL> select * from ware_retail_part partition(par_02);
    
            ID RETAIL_DATE    WARE_NAME
    ---------- -------------- --------------------------------------------------
             2 15-4-11     智能手 机
    
    SQL> select * from ware_retail_part;
    
            ID RETAIL_DATE    WARE_NAME
    ---------- -------------- --------------------------------------------------
             1 20-1-11     平板电 脑
             2 15-4-11     智能手 机
             3 25-7-11     MP5
    

    如果是多范围分区,比如根据销售编号和销售日期的组合创建三个分区:
    参考《oracle 创建分区表以及自动添加分区》

    SQL> create table ware_retail_part2(
      2   id integer primary key,
      3   retail_no integer,
      4   retail_date date,
      5   ware_name varchar2(5067   partition by range(retail_date,retail_no)
      8   (
      9   partition par_01 values less than(to_date('2011-04-01','yyyy-mm-dd'),5) tablespace TBSP_1,
     10    partition par_02 values less than(to_date('2011-08-01','yyyy-mm-dd'),10) tablespace TBSP_1,
     11    partition par_03 values less than(to_date('2011-12-01','yyyy-mm-dd'),15) tablespace TBSP_2
     12    )
     13  /
     SQL> insert into ware_retail_part2 values(2,12,to_date('2011-10-25','yyyy-mm-dd'),'MP5');
     SQL> select * from ware_retail_part2 partition(par_03);
    
            ID  RETAIL_NO RETAIL_DATE    WARE_NAME
    ---------- ---------- -------------- ----------------------
             2         12 25-10-11     MP5
    

    2 HASH列分区

    即散列分区,列值无法确定时采用。

    实例:
    创建一个person表,为该表创建hash分区(分区列为id)

    SQL> create table person
      2  (
      3  id number,
      4  personname varchar2(50)
      5  )
      6  storage(initial 2084k)
      7  partition by hash(id)
      8  (
      9  partition part1 tablespace tbsp_1,
     10  partition part2 tablespace tbsp_2
     11  );
    
    表已创建。
    
    SQL> insert into person values(55,'wj');
    
    已创建 1 行。
    
    SQL> select * from person partition(part1);
    
            ID PERSONNAME
    ---------- --------------------------------------------------
            55 wj
    

    3 列表分区

    创建一个用于保存客户信息的clients,然后以PROVINCE列为分区键创建列分区;

    SQL> l
     1  create table clients
     2  (
     3  id integer primary key,
     4  name varchar2(50),
     5  province varchar2(20)
     6  )
     7  partition by list(province)
     8  (
     9  partition shandong values('山东省'),
    10   partition guangdong values('广东省'),
    11   partition yunnan values('云南省')
    12* )
    SQL> /
    
    表已创建。
    
    SQL> insert into clients values (19,'东方','云南省');
    
    已创建 1 行。
    
    SQL> select * from clients partition(yunnan);
    
           ID NAME                                               PROVINCE
    ---------- -------------------------------------------------- --------------------
           19 东方                                               云南省
    

    列表分区这里有一个小测试可以自我简单测试下:链接🔗

    分区表添加子分区

    参考《对分区表添加子分区》
    创建一个保存人员信息的数据表PERSON2,然后建立三个范围分区,每个分区包含两个子分区,子分区没有名字,有系统自动生成,并要求其分布在2个制定的表空间中。

    create table persons2(
     id integer primary key,
     personname varchar2(50)
     )
     partition by range(id)
     subpartition by hash(personname)
     SUBPARTITIONS 2
     (
     partition part_1 values less than(5) tablespace tbsp_1,
     partition part_2 values less than(10) tablespace tbsp_1,
     partition part_3 values less than(15) tablespace tbsp_2
     );
    

    4 interval分区

    创建的分区作为元数据,只有最开始的分区是永久分区,随着数据增加会分配更多,并自动创建新的分区和本地索引。
    实例:
    创建一个表saleRecord,然后为该表创建一个Interval分区

    SQL> create table saleRecord
     2  (
     3  id number primary key,
     4  goodsname varchar2(50),
     5  saledate date,
     6  quantity number
     7  )
     8  partition by range(saledate)
     9  interval (numtoyminterval(1,'year'))
    10  (
    11  partition par_first values less than (to_date('2020-01-01','yyyy-mm-dd'))
    12  );
    
    表已创建。
    SQL> insert into saleRecord values(1,'MP5',sysdate,123);
    SQL> select TABLE_NAME, PARTITION_NAME from user_tab_partitions where table_name='SALERECORD';
    #查看表中包含的分区
    TABLE_NAME  PARTITION_NAME
    ----------- ------------------------------
    SALERECORD  PAR_FIRST
    SALERECORD  SYS_P47
    SQL> select * from saleRecord partition(par_first);
    未选定行
    SQL> select * from saleRecord partition(SYS_P47);
           ID GOODSNAME                                          SALEDATE         QUANTITY
    ---------- -------------------------------------------------- -------------- ----------
            1 MP5                                                02-4-20            123
    

    5 添加分区

    实例:
    为cilents添加一个省分为“河北省”的表分区

    SQL> alter table clients
      2  add partition hebei values('河北省')
      3  storage(initial 10K next 20k)tablespace tbsp_1
      4  nologging;
    
    表已更改。
    SQL> select partition_name from user_tab_partitions where table_name ='CLIENTS';
    
    PARTITION_NAME
    ------------------------------
    SHANDONG
    GUANGDONG
    YUNNAN
    HEBEI
    

    6 并入表分区

    • MERGE PARTITION语句,将相邻的范围分区合并在一起,变成新的分区;
    • 合并分区为空,则标识为UNSABLE;
    • 不能对HASH分区表执行MERGE PARTITION语句;
    • 并入范围分区是将两个以上的分区合并到一个存在的分区中,合并后索引需重建

    实例:
    创建一个销售记录表sales,然后岁该表的记录按照销售日期分为四个分区;再建立局部索引

    SQL> create table sales
      2  (
      3  id number primary key,
      4  goodsname varchar2(10),
      5  saledate date
      6  )
      7  partition by range(saledate)
      8  (
      9  partition part_seal values less than (to_date('2011-04-01','yyyy-mm-dd')) tablespace tbsp_1,
     10  partition part_sea2 values less than (to_date('2011-07-01','yyyy-mm-dd')) tablespace tbsp_2,
     11  partition part_sea3 values less than (to_date('2011-10-01','yyyy-mm-dd')) tablespace tbsp_1,
     12  partition part_sea4 values less than (to_date('2012-01-01','yyyy-mm-dd')) tablespace tbsp_2
     13  )
     14  /
    表已创建。
    SQL> create index index_3_4 on sales(saledate)
      2  local
      3  (
      4  partition part_sea1 tablespace tbsp_1,
      5  partition part_sea2 tablespace tbsp_2,
      6  partition part_sea3 tablespace tbsp_1,
      7  partition part_sea4 tablespace tbsp_2
      8  );
    索引已创建。
    

    将第三个分区并入到第四个分区中,并重建局部索引:

    # 这里的merge partitions记得加s
    SQL> alter table sales merge partitions part_sea3,part_sea4 into partition part_sea4;
    表已更改。
    SQL> alter table sales modify partition part_sea4 rebuild unusable local indexes;
    表已更改。
    SQL> select partition_name from user_tab_partitions where table_name ='SALES';
    
    PARTITION_NAME
    ------------------------------
    PART_SEAL
    PART_SEA2
    PART_SEA4
    

    如果是将第二个和第三个分区并入到第四个分区中,可以合并两次:

    SQL> alter table sales2 merge partitions part_sea2,part_sea3 into partition part_sea3;
    表已更改。
    SQL> alter table sales2 merge partitions part_sea3,part_sea4 into partition part_sea4;
    表已更改。
    SQL>  select partition_name from user_tab_partitions where table_name ='SALES2';
    PARTITION_NAME
    ------------------------------
    PART_SEAL
    PART_SEA4
    

    7 创建本地索引分区

    本地索引分区与该表分区所采用的列是相同的。
    1 准备表空间:

    SQL> create TABLESPACE ts_1 DATAFILE 'D:\app\Administrator\oradata\oracle\ts_1.dbf' SIZE 10M extent management local autoallocate;
    表空间已创建。
    SQL> create TABLESPACE ts_2 DATAFILE 'D:\app\Administrator\oradata\oracle\ts_2.dbf' SIZE 10M extent management local autoallocate;
    表空间已创建。
    SQL> create TABLESPACE ts_3 DATAFILE 'D:\app\Administrator\oradata\oracle\ts_3.dbf' SIZE 10M extent management local autoallocate;
    表空间已创建。
    

    2 创建一个存储学生成绩的分区表studentgrade,该表有三个分区,分别位于三个不同表空间:

    SQL> create table studentgrade
      2  (
      3  id number primary key,
      4  name varchar2(10),
      5  subject varchar2(10),
      6  grade number
      7  )
      8  partition by range(grade)
      9  (
      #小于60分,不及格
     10  partition par_nopass values less than(60) tablespace ts_1,
     #小于70分,及格
     11  partition par_pass values less than(70) tablespace ts_2,
     #大于等于70分,优秀
     12  partition par_good values less than(maxvalue) tablespace ts_3
     13  );
    
    表已创建。
    

    3 根据表分区创建本地索引分区

    SQL> create index grade_index on studentgrade(grade)
      2  local
      3  (
      4  partition p1 tablespace ts_1,
      5  partition p2 tablespace ts_2,
      6  partition p3 tablespace ts_3
      7  );
    
    索引已创建。
    

    4 根据dba_ind_partitions查看索引分区信息

    SQL> select partition_name,tablespace_name from dba_ind_partitions where index_name ='GRADE_INDEX';
    
    PARTITION_NAME                 TABLESPACE_NAME
    ------------------------------ ------------------------------
    P3                             TS_3
    P2                             TS_2
    P1                             TS_1
    

    8 索引分区维护

    在这里插入图片描述

    SQL> create table books2(
      2      BooksNo number(4) not null,
      3      BookName varchar2(20),
      4      Author varchar2(10),
      5      SalePrice number(9,2),
      6      PublisherNo varchar2(4) not null,
      7      PublisherDate date,
      8      ISBN varchar2(20) not null
      9  );
    
    表已创建。
    
    SQL>
    SQL> create index index_salesprice on Books2(SalePrice)
      2      global partition by range(SalePrice)
      3      (
      4          partition p1 values less than (30),
      5          partition p2 values less than (50),
      6          partition p3 values less than (maxvalue)
      7      );
    
    索引已创建。
    SQL> alter index index_salesprice drop partition p2;
    索引已更改。
    SQL> alter index index_salesprice drop partition p1;
    索引已更改。
    

    全局索引分区,不能删除索引的最高分区,否则系统报错

    SQL> alter index index_salesprice drop partition p3;
    alter index index_salesprice drop partition p3
                                                *1 行出现错误:
    ORA-14078: 您不能删除 GLOBAL 索引的最高分区
    

    9 索引分区重命名

    alter index index_name rename partition partition_old_name to parttion_new_name;
    
    展开全文
  • 列表分区表;哈希分区表;组合分区表 范围分区表 创建一个按字段数据范围分区的表,分区置于指定的不同表空间中 可以先创建一些分区,然后在把表和分区结合,也可以直接在创建表的时候结合分区名(分区会...

    在做小程序的时候,经理让创建基于时间的分区表,由于以前没弄过,所以做起来做的磕磕碰碰的。现在总结下:


    首先需要知道的 是:

    Oracle分区表分为四类:范围分区表;列表分区表;哈希分区表;组合分区表

    范围分区表

    创建一个按字段数据范围分区的表,分区置于指定的不同表空间中

    可以先创建一些分区,然后在把表和分区结合,也可以直接在创建表的时候结合分区名(分区会自动创建),我是直接创建的表然后结合的分区名:

    CREATE TABLE "JMTDBA"."W_LOG"(
    	"GUID" VARCHAR2(64) NOT NULL ENABLE PRIMARY KEY,
    	"TYPE" CHAR(1) DEFAULT '1',
    	"REPORT_GUID" NUMBER,
    	 "CREATE_TIME" DATE )
    PARTITION BY RANGE("CREATE_TIME")
    (
    partition p1 values less than(to_date('2017-04-01 00:00:00','yyyy-mm-ddhh24:mi:ss')),
    partition p2 values less than(to_date('2017-07-01 00:00:00','yyyy-mm-ddhh24:mi:ss')),
    partition p3 values less than(to_date('2017-10-01 00:00:00','yyyy-mm-ddhh24:mi:ss')),
    partition p4 values less than(to_date('2018-01-01 00:00:00','yyyy-mm-ddhh24:mi:ss'))
    );
    

    这样就把分区表创建好了,

    然后插入的时候用的语句:

      INSERT INTO W_LOG (
                    GUID,
                    TYPE,
                    REPORT_GUID,
                    CREATE_TIME
                )
                VALUES
                    (
                        '',
                       '',
                       '',
                        "TO_DATE" (
                            '2017-09-13 :14:23:00','yyyy-mm-dd hh24:mi:ss'
                        )
    	    )

    然后查询的话有两种,一种是在表上直接查询:

    select * from W_LOG


    另一种是在表分区上进行查询:

    select * from W_LOG
    partition(p3)

    现在表也建好了,需要在mybatis中进行添加了,

    首先是先创建一个实体类,

    package com.jmt.wx.model;
    
    import java.io.Serializable;
    import java.util.Date;
    
    /**
     * 日志实体类
     * Created by T430 on 2017/9/13.
     */
    public class WLog  implements Serializable{
        private String guid;//日志唯一标识
        private String type;//小程序类型,1,我要报警2,户政
        private long reportGuid;//登录人的标识,用登录人的userId
        private String createTime;//登录时间
    
        public String getGuid() {
            return guid;
        }
    
        public void setGuid(String guid) {
            this.guid = guid;
        }
    
        public String getType() {
            return type;
        }
    
        public void setType(String type) {
            this.type = type;
        }
    
        public long getReportGuid() {
            return reportGuid;
        }
    
        public void setReportGuid(long reportGuid) {
            this.reportGuid = reportGuid;
        }
    
        public String getCreateTime() {
            return createTime;
        }
    
        public void setCreateTime(String createTime) {
            this.createTime = createTime;
        }
    
        @Override
        public String toString() {
            return "{" +
                    "guid:'" + guid + '\'' +
                    ", type:'" + type + '\'' +
                    ", reportGuid:'" + reportGuid + '\'' +
                    ", createTime:" + createTime +
                    '}';
        }
    }
    

    这里我先说下,创建时间不用date类型,把自己走过的坑给大家说下:因为在添加数据的时候,用的是TO_DATE('2017-10-01 00:00:00','yyyy-mm-ddhh24:mi:ss'),所以换成了String类型,方便后期转换

    下一步就是mybatis中添加日志的sql语句了:

    <!-- 添加日志  -->
        <insert id="insertLog" >
            INSERT INTO W_LOG (
                    GUID,
                    TYPE,
                    REPORT_GUID,
                    CREATE_TIME
                )
                VALUES
                    (
                        #{guid,jdbcType=VARCHAR},
                        #{type,jdbcType=VARCHAR},
                        #{reportGuid,jdbcType=BIGINT},
                        "TO_DATE" (
                            #{createTime,jdbcType=VARCHAR},'yyyy-mm-dd hh24:mi:ss'
                        )
    	    )
        </insert>

    这些写好后,就看controller里写的了

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    
    
    		 WLog wLog=new WLog();
                        wLog.setGuid(GUID);
                        wLog.setType(type);
                        wLog.setReportGuid(userId);
    
                        wLog.setCreateTime(sdf.format(new Date()));
    
                        logService.insertLog(wLog);
    


    这些都写好后,就可以开始运行了,下面把我成功保存的截图给大家发一下:




    插入成功!到此为止,分区表插入信息已经做完!


    每天进步一点点,多学习!!!





    展开全文
  • 1.2、列表分区表; 1.3、哈希分区表; 1.4、组合分区表; 1.1 范围分区表 CREATE TABLE range_Partition_Table( range_key_column DATE, NAME VARCHAR2(20), ID integer ) PARTITION BY RANGE(range_...
  • Oracle 分区创建

    2018-11-08 14:23:00
    分区分类 - 字段范围分区 range `Oracle 8` - 哈希分区 hash `Oracle 8i` - 组合分区 range-hash,...- 列表分区 list `Oracle 9i` - 间隔分区 interval `Oracle 11g` - 系统分区 System `Oracle 11g` - ...
  • 创建分区: [code="java"] create table GPS_POSITION ( ID NVARCHAR2(32) not null, GPSTIME DATE, LONGITUDE NUMBER, LATITUDE NUMBER, SPEED NVARCHAR2(16), CI...
  • Oracle10g分区常用的是:range(范围分区)、list(列表分区)、hash(哈希分区)、range-hash(范围—哈希分区)、range-list(列表—复合分区)。Range分区:Range分区是应用范围比较广的表分区方式,它是以列的值的范围来做...
  • Oracle10g分区常用的是:range(范围分区)、list(列表分区)、hash(哈希分区)、range-hash(范围—哈希分区)、range-list(列表—复合分区)。 Range分区:Range分区是应用范围比较广的表分区方式,它是以列的...

空空如也

空空如也

1 2 3 4 5 ... 10
收藏数 188
精华内容 75
关键字:

oracle创建列表分区