设为首页 收藏本站
查看: 1329|回复: 0

[经验分享] ORACLE 区间分区(Interval Partitioning)

[复制链接]

尚未签到

发表于 2018-9-9 07:03:05 | 显示全部楼层 |阅读模式
  11g在分区上有了很大的改进,其中有一个特性是Interval-Partition,他是range分区的派生,自动创建指定间隔的分区。
  在 11g 之前,如果数据中出现未能匹配分区条件的情况,系统会拒绝进行数据操作。
  对时间类型和数字类型的支持:
  1.对于采用date类型或TIMESTAMP类型的Interval Partitioning可以支持按year、month、day、hour、minute、second六种类型的定长宽度分区,分别通过如下函数转换
  numtoyminterval ( n, { 'YEAR'|'MONTH'})
  numtodsinterval ( n, { 'DAY'|'HOUR'|'MINUTE'|'SECOND'})
  2. Interval (number) 即多少值一个分区
  创建示例
  1.时间类型
  --创建表
  SQL> CREATE TABLE cai.intervalpart1 (c1 NUMBER, c2 DATE)
  2  PARTITION BY RANGE (c2)
  3     INTERVAL ( NUMTOYMINTERVAL (1, 'MONTH') )
  4     (PARTITION part1
  5         VALUES LESS THAN (TO_DATE ('02/01/2013', 'MM/DD/YYYY'))
  6    );
  Table created.
  --查询只有一个分区
  SQL> select table_name, partition_name, HIGH_VALUE
  2    from dba_tab_partitions t
  3   where table_name = 'INTERVALPART1';
  TABLE_NAME       PARTITION_NAME           HIGH_VALUE
  ---------------- -----------------         -------------------------------------------------------
  INTERVALPART1       PART1                 TO_DATE(' 2013-02-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA
  --增加2行记录一行是2月份的,一行是1月份的
  SQL>   insert into cai.intervalpart1 values (1,TO_DATE ('02/02/2013', 'MM/DD/YYYY'));
  1 row created.
  SQL> commit;
  Commit complete.
  SQL> insert into cai.intervalpart1 values (1,TO_DATE ('01/01/2013', 'MM/DD/YYYY'));
  1 row created.
  SQL> commit;
  Commit complete.
  SQL>
  SQL>   Select Count(1) From cai.intervalpart1;
  COUNT(1)
  ----------
  2
  --增加了2月份的分区
  SQL>
  SQL> select table_name, partition_name, HIGH_VALUE
  2    from dba_tab_partitions t
  3   where table_name = 'INTERVALPART1';
  TABLE_NAME      PARTITION_NAME    HIGH_VALUE
  -------------- ----------------- -------------------------------------------------------------
  INTERVALPART1        PART1        TO_DATE(' 2013-02-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA
  INTERVALPART1        SYS_P105     TO_DATE(' 2013-03-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA
  --插入当前时间的分区
  SQL>  insert into cai.intervalpart1 values (1,sysdate);
  1 row created.
  SQL> commit;
  Commit complete.
  --又有一个分区新建了,如果插入的时间在两个月以后或者更久,则Oracle只生成必须的分区,并不会生成连续分区。
  SQL> select table_name, partition_name, HIGH_VALUE
  2    from dba_tab_partitions t
  3   where table_name = 'INTERVALPART1';
  TABLE_NAME         PARTITION_NAME    HIGH_VALUE
  ----------------- ---------------    --------------------------------------------------------------------------------
  INTERVALPART1      PART1             TO_DATE(' 2013-02-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA
  INTERVALPART1      SYS_P105          TO_DATE(' 2013-03-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA
  INTERVALPART1      SYS_P106          TO_DATE(' 2013-06-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA
  SQL>
  配置多个表空间的分区存储 --会循环不断往这几个表空间插入(随机插入某个表空间)

  create  tablespace tablespace1 datafile '+DATA'>
  create  tablespace tablespace2 datafile '+DATA'>
  create  tablespace tablespace3 datafile '+DATA'>
  create  tablespace tablespace4 datafile '+DATA'>
  create  tablespace tablespace5 datafile '+DATA'>  alter table cai.intervalpart1 set STORE IN (tablespace1,tablespace2,tablespace3,tablespace4,tablespace5);
  insert into cai.intervalpart1 values (1,TO_DATE ('04/04/2013', 'MM/DD/YYYY'));
  insert into cai.intervalpart1 values (1,TO_DATE ('05/05/2013', 'MM/DD/YYYY'));
  insert into cai.intervalpart1 values (1,TO_DATE ('06/06/2013', 'MM/DD/YYYY'));
  insert into cai.intervalpart1 values (1,TO_DATE ('07/07/2013', 'MM/DD/YYYY'));
  insert into cai.intervalpart1 values (1,TO_DATE ('08/08/2013', 'MM/DD/YYYY'));
  insert into cai.intervalpart1 values (1,TO_DATE ('09/08/2013', 'MM/DD/YYYY'));
  insert into cai.intervalpart1 values (1,TO_DATE ('10/08/2013', 'MM/DD/YYYY'));
  SQL> select table_name, partition_name, HIGH_VALUE,TABLESPACE_NAME
  2   from dba_tab_partitions t
  3   where table_name = 'INTERVALPART1';
  TABLE_NAME      PARTITION_NAME       HIGH_VALUE                                                                                           TABLESPACE_NAME
  --------------- -------------------- ---------------------------------------------------------------------------------------------------- ------------------
  INTERVALPART1   SYS_P908             TO_DATE(' 2013-11-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA                     TABLESPACE5
  INTERVALPART1   SYS_P907             TO_DATE(' 2013-10-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA                     TABLESPACE4
  INTERVALPART1   SYS_P906             TO_DATE(' 2013-09-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA                     TABLESPACE3
  INTERVALPART1   SYS_P905             TO_DATE(' 2013-08-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA                     TABLESPACE2
  INTERVALPART1   SYS_P904             TO_DATE(' 2013-07-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA                     TABLESPACE1
  INTERVALPART1   SYS_P903             TO_DATE(' 2013-06-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA                     TABLESPACE5
  INTERVALPART1   SYS_P902             TO_DATE(' 2013-05-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA                     TABLESPACE4
  INTERVALPART1   SYS_P901             TO_DATE(' 2015-11-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA                     USERS
  INTERVALPART1   SYS_P881             TO_DATE(' 2013-03-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA                     USERS
  INTERVALPART1   PART1                TO_DATE(' 2013-02-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA                     USERS
  2.数字类型
  ----创建表
  SQL> CREATE TABLE cai.intervalpart2 (c1 NUMBER, c2 DATE)
  2   PARTITION BY RANGE (c1)
  3     INTERVAL (100)
  4      (PARTITION part1
  5          VALUES LESS THAN (100)
  6    );
  Table created.
  --查询只有一个分区
  SQL> select table_name, partition_name, HIGH_VALUE
  2     from dba_tab_partitions t
  3    where table_name = 'INTERVALPART2';
  TABLE_NAME                     PARTITION_NAME                 HIGH_VALUE
  ------------------------------ ------------------------------ -------------------------
  INTERVALPART2                  PART1                          100
  SQL>
  --增加2行记录一行是1,一行是101
  SQL> insert into  cai.intervalpart2 values (1,sysdate);
  1 row created.
  SQL> insert into  cai.intervalpart2 values (101,sysdate);
  1 row created.
  SQL> commit;
  Commit complete.
  SQL>
  SQL>  Select Count(1) From  cai.intervalpart2;
  COUNT(1)
  ----------
  2
  --增加了101的分区
  SQL> select table_name, partition_name, HIGH_VALUE
  2  from dba_tab_partitions t
  3  where table_name = 'INTERVALPART2';
  TABLE_NAME                     PARTITION_NAME                 HIGH_VALUE
  ------------------------------ ------------------------------ --------------------------
  INTERVALPART2                  PART1                          100
  INTERVALPART2                  SYS_P107                       200
  --插入1101数值的分区
  SQL>  insert into  cai.intervalpart2 values (1101,sysdate);
  1 row created.
  SQL> commit;
  Commit complete.
  --又有一个分区新建了,如果插入的数值是差别很大或者更久,则Oracle只生成必须的分区,并不会生成连续分区。
  SQL> select table_name, partition_name, HIGH_VALUE
  2  from dba_tab_partitions t
  3  where table_name = 'INTERVALPART2';
  TABLE_NAME                     PARTITION_NAME                 HIGH_VALUE
  ------------------------------ ------------------------------ ---------------------------------------
  INTERVALPART2                  PART1                          100
  INTERVALPART2                  SYS_P107                       200
  INTERVALPART2                  SYS_P108                       1200
  管理:
  1.自动分区与自动分区的转换
  --创建普通分区表
  SQL> CREATE TABLE cai.intervalpart3 (c1 NUMBER, c2 DATE)
  2         PARTITION BY RANGE (c1)
  3         (PARTITION part1 VALUES LESS THAN (100)
  4  );
  Table created.
  SQL>  insert into  cai.intervalpart3 values (1,sysdate);
  1 row created.
  SQL> commit;
  Commit complete.
  --当插入超出值时会报错
  SQL>  insert into  cai.intervalpart3 values (101,sysdate);
  insert into  cai.intervalpart3 values (101,sysdate)
  *
  ERROR at line 1:
  ORA-14400: inserted partition key does not map to any partition
  --设置100数值为分区

  SQL>>
  Table>  --插入成功
  SQL> insert into  cai.intervalpart3 values (101,sysdate);
  1 row created.
  SQL> commit;
  Commit complete.
  --新生成分区
  SQL> select table_name, partition_name, HIGH_VALUE
  2    from dba_tab_partitions t
  3   where table_name = 'INTERVALPART3';
  TABLE_NAME                     PARTITION_NAME                 HIGH_VALUE
  ------------------------------ ------------------------------ ----------------------------------
  INTERVALPART3                  PART1                          100
  INTERVALPART3                  SYS_P109                       200
  SQL>
  SQL>
  --也可以设置个更高的值

  SQL>>
  Table>  --插入数据
  SQL> insert into  cai.intervalpart3 values (201,sysdate);
  1 row created.
  SQL> commit;
  Commit complete.
  SQL>  insert into  cai.intervalpart3 values (401,sysdate);
  1 row created.
  SQL> commit;
  Commit complete.
  SQL> insert into  cai.intervalpart3 values (501,sysdate);
  1 row created.
  SQL> commit;
  Commit complete.
  SQL> insert into  cai.intervalpart3 values (601,sysdate);
  1 row created.
  SQL> commit;
  Commit complete.
  --更改的值生效,之前的分区不影响。
  SQL> select table_name, partition_name, HIGH_VALUE
  2    from dba_tab_partitions t
  3   where table_name = 'INTERVALPART3';
  TABLE_NAME                     PARTITION_NAME                 HIGH_VALUE
  ------------------------------ ------------------------------ ----------------------
  INTERVALPART3                  PART1                          100
  INTERVALPART3                  SYS_P109                       200
  INTERVALPART3                  SYS_P110                       500
  INTERVALPART3                  SYS_P111                       800
  SQL>
  --关闭自动分区

  SQL>>
  Table>  --插入数据不成功
  SQL>  insert into  cai.intervalpart3 values (801,sysdate);
  insert into  cai.intervalpart3 values (801,sysdate)
  *
  ERROR at line 1:
  ORA-14400: inserted partition key does not map to any partition
  2.配置多个表空间的分区存储
  alter table cai.intervalpart3 set STORE IN (tablespace1, tablespace2, tablespace3);
  这3个表空间,分区会循环分配到这3个表空间。
  3. rename 分区名
  分区:
  alter table cai.INTERVALPART3  rename partition SYS_P109 to part2;
  子分区:
  alter table cai.INTERVALPART3  rename partition SYS_P109 to part2;


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-568362-1-1.html 上篇帖子: oracle启动脚本 下篇帖子: Oracle 数据泵导数据(expdp,impdp)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表