Oracle分区的一些问题,关于子分区~~

    xiaoxiao2025-09-04  21

    1分区表的一些操作 1.1创建分区带有子分区的分区表 2种方法

    一种是模板式的,只要增加分区,就会自动增加相应的子分区,创建方法如下:

    我们开始做啦~~

    –创建分区带有子分区的分区表 1

    create table tb_test11

    (

    STATIS_DATE DATE,

    SERV_NUMBER VARCHAR2(100),

    CUST_TYPE INTEGER

    )

    tablespace TBS_NG_USER_01

    partition by list (STATIS_DATE)

    subpartition by list(CUST_TYPE)

    subpartition template

    (

    subpartition spart_1 values(1)tablespace TBS_NG_USER_01 compress,

    subpartition spart_2 values(2)tablespace TBS_NG_USER_01 compress,

    subpartition spart_3 values(3)tablespace TBS_NG_USER_01 compress,

    subpartition spart_4 values(4)tablespace TBS_NG_USER_01 compress,

    subpartition spart_5 values(5)tablespace TBS_NG_USER_01 compress

    )

    (

    partition part_20150101 values (date’2015-1-1’) tablespace TBS_NG_USER_01 compress,

    partition part_20150102 values (date’2015-1-2’) tablespace TBS_NG_USER_01 compress,

    partition part_20150103 values (date’2015-1-3’) tablespace TBS_NG_USER_01 compress,

    partition part_20150104 values (date’2015-1-4’) tablespace TBS_NG_USER_01 compress,

    partition part_20150105 values (date’2015-1-5’) tablespace TBS_NG_USER_01 compress,

    partition part_20150106 values (date’2015-1-6’) tablespace TBS_NG_USER_01 compress,

    partition part_20150107 values (date’2015-1-7’) tablespace TBS_NG_USER_01 compress,

    partition part_20150108 values (date’2015-1-8’) tablespace TBS_NG_USER_01 compress,

    partition part_20150109 values (date’2015-1-9’) tablespace TBS_NG_USER_01 compress,

    partition part_20150110 values (date’2015-1-10’) tablespace TBS_NG_USER_01 compress);

    创建完成~~

    在实际工作中发现,刚开始建模时,建立该表,但是后期业务发生变化,需要增加子分区,这时候你会发现增加的子分区不会随增加分区而相应的增加,咨询了一个前辈,说是可以设置为自动,但是说比较复杂,鉴于知识有限,我就手动管理了新增加的子分区。。。如果哪位朋友,有好的出力方法,欢迎留言~~

    那么让我们来看第二种方法吧~~

    –创建分区表带有子分区的分区表 2

    create table tb_test111

    (

    STATIS_DATE DATE,

    SERV_NUMBER VARCHAR2(100),

    CUST_TYPE INTEGER

    )

    tablespace TBS_NG_USER_01

    partition by list(STATIS_DATE)

    subpartition by list(CUST_TYPE)

    (

    partition part_20150101 values (date’2015-1-1’) tablespace TBS_NG_USER_01 compress

    (

    subpartition spart_1 values(1)tablespace TBS_NG_USER_01 compress,

    subpartition spart_2 values(2)tablespace TBS_NG_USER_01 compress,

    subpartition spart_3 values(3)tablespace TBS_NG_USER_01 compress,

    subpartition spart_4 values(4)tablespace TBS_NG_USER_01 compress,

    subpartition spart_5 values(5)tablespace TBS_NG_USER_01 compress

    ));

    好啦,以上两种方法都可以,自由选择~~ 1.2清空子分区

    alter table tb_test11 truncate subpartition part_20150101_spart_1; –清空子分区

    删除子分区

    alter table tb_test11 drop subpartition part_20150101_spart_1; –删除子分区 1.3在已有的分区上增加子分区

    –在已有的分区上增加子分区

    alter tabletb_test11

    modify partition part_20150101

    add subpartition part_20150101_spart_6 values(6) tablespace TBS_NG_USER_01 compress; 1.4新增分区以及子分区

    –新增分区以及子分区

    alter table tb_test11

    add partition part_20150111 values(date’2015-9-1’) tablespace TBS_NG_USER_01 compress

    (subpartition part_20150111_spart_6 values(6)tablespace TBS_NG_USER_01 compress); 1.5查看分区明细

    select/+parallel(a,8)/* from all_tab_partitions a where a.table_name=’TB_TEST11’;–查看分区明细 1.6查看分区表

    select/+parallel(a,8)/* from all_part_tables a where a.table_name=’TB_TEST11’; –查看分区表

    select* from all_tab_subpartitions a where a.table_name=’TB_MK_SC_USER_MON’;–查看子分区名称

    select* from all_part_key_columns a where a.name=’TB_MK_SC_USER_MON’; –查看分区列名

    select* from all_subpart_key_columns a where a.name=’TB_MK_SC_USER_MON’; –查看子分区列名 1.7创建分区,有数据插入时自动增加分区

    Oracle11g 提供了插入数据,自动增加分区的功能,很方便哦赶快去试一试吧

    create tabletb_interval_test (v_date date,feenumber(10,2))

    partition by range(v_date)

    interval(numtods interval(1,’day’))

    (partition part_201508 values less than(to_date(20140831,’yyyymmdd’)),

    partition part_201509 values less than(to_date(20140930,’yyyymmdd’)));

    下面是重要部分,我的多说几句~~ 1.8组合分区表空间移动方法

    关于分区移动表空间的问题,正常的移动表空间我就不介绍了,此处说一下组合分区表空间的移动问题!!

    其实很简单,知道思路就行了~~

    分为以下两步:

    –1先移动子分区的表空间

    –2修改Father表空间的属性

    –创建测试用表

    create table tb_test111

    (

    STATIS_DATE DATE,

    SERV_NUMBER VARCHAR2(100),

    CUST_TYPE INTEGER

    )

    tablespace TBS_NG_USER_01

    partition by range(STATIS_DATE)

    subpartition by list(CUST_TYPE)

    (

    partition part_20150101 values less than(date’2015-1-1’) tablespace TBS_NG_USER_01 compress

    (

    subpartition spart_1 values(1)tablespaceTBS_NG_USER_01 compress,

    subpartition spart_2 values(2)tablespaceTBS_NG_USER_01 compress,

    subpartition spart_3 values(3)tablespaceTBS_NG_USER_01 compress,

    subpartition spart_4 values(4)tablespaceTBS_NG_USER_01 compress,

    subpartition spart_5 values(5)tablespaceTBS_NG_USER_01 compress

    ));

    –1先移动子分区的表空间

    alter tabletb_test111 movesubpartitionspart_1 tablespaceTBS_USER_01;

    alter tabletb_test111 movesubpartitionspart_2 tablespaceTBS_USER_01;

    alter tabletb_test111 movesubpartitionspart_3 tablespaceTBS_USER_01;

    alter tabletb_test111 movesubpartitionspart_4 tablespaceTBS_USER_01;

    alter tabletb_test111 movesubpartitionspart_5 tablespaceTBS_USER_01;

    –2修改Father表空间的属性

    alter tabletb_test111 modifydefaultattributesforpartition part_20150101 tablespaceTBS_USER_01;

    –检验表空间移动是否成功

    selecta.tablespace_name,a.* fromuser_tab_partitions a wherea.table_name=’TB_TEST111’;

    selecta.tablespace_name,a.* fromuser_tab_subpartitions a wherea.table_name=’TB_TEST111’;

    好啦~通过以上两个步骤移动就不会出现问题了,搞定~~

    下面还有一个问题比较重要~~请重点看!! 1.9带有max分区的添加分区的方法

    如果你建立分区表是有max分区,那么你以后再添加分区时,如果按照正常的添加分区add的话,是会报错的亲~~【【ORA-14080】无法在指定的上限来分隔分区】

    那么怎么搞呢?

    请看下面的测试用例~~

    –常见测试用例

    createtabletb_test

    (

    STATIS_DATE DATE,

    SERV_NUMBER VARCHAR2(100),

    CUST_TYPE INTEGER

    )

    tablespace TBS_NG_USER_01

    partition by range(STATIS_DATE)

    (partition part_20150101 values less than(date’2015-1-1’),

    partition part_max values less than(maxvalue));

    –正常添加报错–【ORA-14080】无法在指定的上限来分隔分区

    alter table tb_test split partition part_max at(date’2015-1-2’)into(partition,partition part_max);

    –运用split添加分区

    alter table tb_test splitpartition part_max at(date’2015-1-3’)into(partition part_20150103,partition part_max);

    –检查处理结果

    select* from user_tab_partitions a wherea.table_name=’TB_TEST’;

    看,是不是很简单,是不是这样就可以搞定MAX啦

    关于分区的问题,今天就谈到这,这是今天一天碰见的问题总结的一些东西,温习一下吧~~~

    最新回复(0)