Oracle分区表创建

一、分区表的创建
1、创建范围分区

create table range_part_tab (id number,deal_date date,area_code number,nbr number,contents varchar2(4000))
           partition by range (deal_date)
           (
           partition p_201301 values less than (TO_DATE('2013-02-01', 'YYYY-MM-DD')),
           partition p_201302 values less than (TO_DATE('2013-03-01', 'YYYY-MM-DD')),
           partition p_201303 values less than (TO_DATE('2013-04-01', 'YYYY-MM-DD')),
           partition p_201304 values less than (TO_DATE('2013-05-01', 'YYYY-MM-DD')),
           partition p_201305 values less than (TO_DATE('2013-06-01', 'YYYY-MM-DD')),
           partition p_201306 values less than (TO_DATE('2013-07-01', 'YYYY-MM-DD')),
           partition p_201307 values less than (TO_DATE('2013-08-01', 'YYYY-MM-DD')),
           partition p_201308 values less than (TO_DATE('2013-09-01', 'YYYY-MM-DD')),
           partition p_201309 values less than (TO_DATE('2013-10-01', 'YYYY-MM-DD')),
           partition p_201310 values less than (TO_DATE('2013-11-01', 'YYYY-MM-DD')),
           partition p_201311 values less than (TO_DATE('2013-12-01', 'YYYY-MM-DD')),
           partition p_201312 values less than (TO_DATE('2014-01-01', 'YYYY-MM-DD')),
           partition p_201401 values less than (TO_DATE('2014-02-01', 'YYYY-MM-DD')),
           partition p_201402 values less than (TO_DATE('2014-03-01', 'YYYY-MM-DD')),
           partition p_max values less than (maxvalue)
           )
           ;

2、创建列表分区

create table list_part_tab (id number,deal_date date,area_code number,nbr number,contents varchar2(4000))
           partition by list (area_code)
           (
           partition p_591 values  (591),
           partition p_592 values  (592),
           partition p_593 values  (593),
           partition p_594 values  (594),
           partition p_595 values  (595),
           partition p_596 values  (596),
           partition p_597 values  (597),
           partition p_598 values  (598),
           partition p_599 values  (599),
           partition p_other values  (DEFAULT)
           )
           ;

3、创建HASH分区

create table hash_part_tab (id number,deal_date date,area_code number,nbr number,contents varchar2(4000))
            partition by hash (deal_date)
            PARTITIONS 12
            ;```



4、联合字段范围分区

create table range_part_mult_col_tab (id number,deal_date date,area_code number,nbr number,contents varchar2(4000))
partition by range (area_code,deal_date)
(
partition p_591_201312 values less than (591,TO_DATE(‘2014-01-01’, ‘YYYY-MM-DD’)),
partition p_591_201401 values less than (591,TO_DATE(‘2014-02-01’, ‘YYYY-MM-DD’)),
partition p_591_201402 values less than (591,TO_DATE(‘2014-03-01’, ‘YYYY-MM-DD’)),
partition p_591_max values less than (591,maxvalue),
partition p_592_201312 values less than (592,TO_DATE(‘2014-01-01’, ‘YYYY-MM-DD’)),
partition p_592_201401 values less than (592,TO_DATE(‘2014-02-01’, ‘YYYY-MM-DD’)),
partition p_592_201402 values less than (592,TO_DATE(‘2014-03-01’, ‘YYYY-MM-DD’)),
partition p_592_max values less than (592,maxvalue),
partition p_593_201401 values less than (593,TO_DATE(‘2014-02-01’, ‘YYYY-MM-DD’)),
partition p_593_201402 values less than (593,TO_DATE(‘2014-03-01’, ‘YYYY-MM-DD’)),
partition p_593_max values less than (593,maxvalue)
)
;

“`

二、注意事项
1、分区表默认不允许跨分区移到的,如果更新表导致记录会跨分区移到,将会报如下的错误
ORA-14402: 更新分区关键字列将导致分区的更改
避免该错误,执行:
alter table part_tab_rowid enable row movement;

2、记录跨分区移到后,rowid将会改变

3、只查询某一个分区数据
select * from 表名 partition(分区名)

Oracle中,为分区表创建索引与为非分区表创建索引基本相同,只需要在创建索引时指定分区表分区键即可。 下面是一个示例: ``` CREATE TABLE my_partitioned_table ( id NUMBER(10) NOT NULL, created_at TIMESTAMP(6) NOT NULL, some_data VARCHAR2(100), CONSTRAINT pk_my_partitioned_table PRIMARY KEY (id, created_at) ) PARTITION BY RANGE (created_at) ( PARTITION p1 VALUES LESS THAN (TO_DATE('2018-01-01', 'YYYY-MM-DD')), PARTITION p2 VALUES LESS THAN (TO_DATE('2019-01-01', 'YYYY-MM-DD')), PARTITION p3 VALUES LESS THAN (MAXVALUE) ); CREATE INDEX idx_my_partitioned_table ON my_partitioned_table(created_at, some_data) GLOBAL PARTITION BY RANGE (created_at) ( PARTITION p1 VALUES LESS THAN (TO_DATE('2018-01-01', 'YYYY-MM-DD')), PARTITION p2 VALUES LESS THAN (TO_DATE('2019-01-01', 'YYYY-MM-DD')), PARTITION p3 VALUES LESS THAN (MAXVALUE) ); ``` 在这个示例中,我们创建了一个名为 `my_partitioned_table` 的分区表,它根据 `created_at` 列的值进行分区。然后,我们为该表创建了一个名为 `idx_my_partitioned_table` 的索引,该索引也根据 `created_at` 列的值进行分区。 注意,我们在创建索引时使用了 `GLOBAL PARTITION BY RANGE` 语句,这是因为我们想要为每个分区创建一个单独的索引分区,以便能够更好地利用分区表的性能优势。 需要注意的是,在为分区表创建索引时,我们必须指定每个分区的索引分区。如果我们不这样做,Oracle将自动为我们创建一个全局索引分区,这会导致性能问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值