oracle按dt字段建立分区,Oracle技术之11g分区表按时间自动创建

11g新特性_分区表按时间自动创建(Interval Partitioning(MONTH、YEAR))

Interval Partitioning(MONTH、YEAR)

create table sales6

(

sales_id    number,

sales_dt    date

)

partition by range (sales_dt)

interval (numtoyminterval(1,'MONTH'))

(

partition p0701 values less than (to_date('2007-02-01','yyyy-mm-dd'))

);

SQL>insert into sales6 values (1,'01-jun-07');

1 row created.

SQL> select partition_name, high_value from user_tab_partitions where table_name = 'SALES6';

PARTITION_NAME       HIGH_VALUE

-------------------- ----------------------------------------

P0701                TO_DATE(' 2007-02-01 00:00:00', 'SYYYY-M

M-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA

SYS_P23              TO_DATE(' 2007-07-01 00:00:00', 'SYYYY-M

M-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA

注意新分区 SYS_P42,其上限为 6 月 1 日,因此该分区可以保留 2006 年 5 月的数据。该分区是通过拆分 SYS_P41 分区创建的(针对 6 月份)。因此,当您定义一个间隔分区方案时,Oracle 会自动创建和维护分区。

如果您希望将分区存储在特定表空间中,可以使用 store in 子句执行该操作:

interval (numtoyminterval(1,'MONTH'))

store in (par01,par02,par03,par04,par05,par06,par07,par08,par09,par10,par011,par012)

该子句以循环方式将分区存储在表空间 TS1、TS2 和 TS3 中。

如:

create tablespace par01 datafile '+DGDATGA' size 10m ;

create tablespace par02 datafile '+DGDATGA' size 10m ;

create tablespace par03 datafile '+DGDATGA' size 10m ;

create tablespace par04 datafile '+DGDATGA' size 10m ;

create tablespace par05 datafile '+DGDATGA' size 10m ;

create tablespace par06 datafile '+DGDATGA' size 10m ;

create tablespace par07 datafile '+DGDATGA' size 10m ;

create tablespace par08 datafile '+DGDATGA' size 10m ;

create tablespace par09 datafile '+DGDATGA' size 10m ;

create tablespace par010 datafile '+DGDATGA' size 10m ;

create tablespace par011 datafile '+DGDATGA' size 10m ;

create tablespace par012 datafile '+DGDATGA' size 10m ;

alter user fmismain quota unlimited on par01;

alter user fmismain quota unlimited on par02;

alter user fmismain quota unlimited on par03;

alter user fmismain quota unlimited on par04;

alter user fmismain quota unlimited on par05;

alter user fmismain quota unlimited on par06;

alter user fmismain quota unlimited on par07;

alter user fmismain quota unlimited on par08;

alter user fmismain quota unlimited on par09;

alter user fmismain quota unlimited on par010;

alter user fmismain quota unlimited on par011;

alter user fmismain quota unlimited on par012;

create table sales12

(

sales_id    number,

sales_dt    date

)

partition by range (sales_dt)

interval (numtoyminterval(1,'MONTH'))

store in (par01,par02,par03,par04,par05,par06,par07,par08,par09,par010,par011,par012)

(

partition p0701 values less than (to_date('2007-02-01','yyyy-mm-dd'))

);

insert into sales12 values (1,'01-jun-07');

select partition_name, high_value from user_tab_partitions where table_name = 'SALES12';

insert into sales12 values (1,'01-may-07');

select table_name,partition_name,tablespace_name,high_value from user_tab_partitions where table_name = 'SALES12';

SQL> select table_name,partition_name,tablespace_name,high_value from user_tab_partitions where table_name = 'SALES12';

TABLE_NAME           PARTITION_NAME       TABLESPACE_NAME                HIGH_VALUE

-------------------- -------------------- ------------------------------ ----------------------------------------

SALES12              P0701                FMISMAIN                       TO_DATE(' 2007-02-01 00:00:00', 'SYYYY-M

M-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA

SALES12              SYS_P41              PAR05                          TO_DATE(' 2007-06-01 00:00:00', 'SYYYY-M

M-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA

SALES12              SYS_P25              PAR06                          TO_DATE(' 2007-07-01 00:00:00', 'SYYYY-M

M-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA

CREATE TABLE interval_tab (

id           NUMBER,

code         VARCHAR2(10),

description  VARCHAR2(50),

created_date DATE

)

PARTITION BY RANGE (created_date)

INTERVAL (NUMTOYMINTERVAL(1,'MONTH'))

(

PARTITION part_01 values LESS THAN (TO_DATE('01-NOV-2007','DD-MON-YYYY'))

);

EXEC DBMS_STATS.gather_table_stats(USER, 'INTERVAL_TAB');

COLUMN table_name FORMAT A20

COLUMN partition_name FORMAT A20

COLUMN high_value FORMAT A40

SELECT table_name, partition_name, high_value, num_rows

FROM   user_tab_partitions

ORDER BY table_name, partition_name;

INSERT INTO interval_tab VALUES (1, 'ONE', 'One', TO_DATE('16-OCT-2007', 'DD-MON-YYYY'));

INSERT INTO interval_tab VALUES (2, 'TWO', 'Two', TO_DATE('31-OCT-2007', 'DD-MON-YYYY'));

COMMIT;

EXEC DBMS_STATS.gather_table_stats(USER, 'INTERVAL_TAB');

SELECT table_name, partition_name, high_value, num_rows

FROM   user_tab_partitions

ORDER BY table_name, partition_name;

INSERT INTO interval_tab VALUES (3, 'THREE', 'Three', TO_DATE('01-NOV-2007', 'DD-MON-YYYY'));

INSERT INTO interval_tab VALUES (3, 'THREE', 'Three', TO_DATE('01-NOV-2007', 'DD-MON-YYYY'));

COMMIT;

EXEC DBMS_STATS.gather_table_stats(USER, 'INTERVAL_TAB');

SELECT table_name, partition_name, high_value, num_rows

FROM   user_tab_partitions

ORDER BY table_name, partition_name;

INSERT INTO interval_tab VALUES (5, 'FIVE', 'Five', TO_DATE('01-JAN-2008', 'DD-MON-YYYY'));

INSERT INTO interval_tab VALUES (4, 'FOUR', 'Four', TO_DATE('31-JAN-2008', 'DD-MON-YYYY'));

COMMIT;

EXEC DBMS_STATS.gather_table_stats(USER, 'INTERVAL_TAB');

SELECT table_name, partition_name, high_value, num_rows

FROM   user_tab_partitions

ORDER BY table_name, partition_name;

INSERT INTO interval_tab VALUES (5, 'FIVE', 'Five', TO_DATE('01-JAN-2008', 'DD-MON-YYYY'));

INSERT INTO interval_tab VALUES (4, 'FOUR', 'Four', TO_DATE('31-JAN-2008', 'DD-MON-YYYY'));

COMMIT;

EXEC DBMS_STATS.gather_table_stats(USER, 'INTERVAL_TAB');

SELECT table_name, partition_name, high_value, num_rows

FROM   user_tab_partitions

ORDER BY table_name, partition_name;

TABLE_NAME           PARTITION_NAME       HIGH_VALUE                                 NUM_ROWS

-------------------- -------------------- ---------------------------------------- ----------

INTERVAL_TAB         PART_01              TO_DATE(' 2007-11-01 00:00:00', 'SYYYY-M          2

M-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA

INTERVAL_TAB         SYS_P21              TO_DATE(' 2007-12-01 00:00:00', 'SYYYY-M          2

M-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA

INTERVAL_TAB         SYS_P22              TO_DATE(' 2008-02-01 00:00:00', 'SYYYY-M          5

M-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值