ITPub博客

首页 > Linux操作系统 > Linux操作系统 > oracle分区表

oracle分区表

原创 Linux操作系统 作者:zui019 时间:2011-04-07 12:59:14 0 删除 编辑

一、 oracle表分区的分类

表是逻辑存在的,将一个表分成多个段叫做分区表。当表中的数据逐渐增大时,查询数据的速度也会逐渐的变慢,应用程序的性能也就随着下降,这时就应该考虑对表进行分区。表分区后,逻辑上表仍然是一张完整的表,只是将表中的数据在物理上存放在多个数据文件中,这样在查询数据的时候,就不至于扫描整个表。

通常分区的分区的方式有四种:

1、范围分区

   orcl@ TEST> CREATE TABLE CUSTOMER

  2  (

  3      CUSTOMER_ID NUMBER NOT NULL PRIMARY KEY,

  4      FIRST_NAME  VARCHAR2(30) NOT NULL,

  5      LAST_NAME   VARCHAR2(30) NOT NULL,

  6      PHONE        VARCHAR2(15) NOT NULL,

  7      EMAIL        VARCHAR2(80),

  8      STATUS       CHAR(1))

  9  PARTITION BY RANGE(CUSTOMER_ID)

 10  ( PARTITION CUS_PART1 VALUES LESS THAN(10000) ,

 11  PARTITION CUS_PART2 VALUES LESS THAN(20000));

 

表已创建。

 

已用时间:  00: 00: 00.02

orcl@ TEST> SELECT  TABLE_NAME,PARTITION_NAME,TABLESPACE_NAME,PARTITION_POSITION FROM USER_TAB_PARTITIONS;

 

TABLE_NAME      PARTITION_NAME                 TABLESPACE_NAME                PARTITION_POSITION

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

CUSTOMER        CUS_PART2                      USERS                                           2

CUSTOMER        CUS_PART1                      USERS                                           1

 

已用时间:  00: 00: 00.25

同样的道理也可以指定分区表所在的表空间,只需把建表语句改为:

orcl@ TEST> CREATE TABLE CUSTOMER

  2  (

  3      CUSTOMER_ID NUMBER NOT NULL PRIMARY KEY,

  4      FIRST_NAME  VARCHAR2(30) NOT NULL,

  5      LAST_NAME   VARCHAR2(30) NOT NULL,

  6      PHONE        VARCHAR2(15) NOT NULL,

  7      EMAIL        VARCHAR2(80),

  8      STATUS       CHAR(1))

  9  PARTITION BY RANGE(CUSTOMER_ID)

 10  ( PARTITION CUS_PART1 VALUES LESS THAN(10000) tablespace us_t1 ,

 11  PARTITION CUS_PART2 VALUES LESS THAN(20000) tablespace us_y2);

------------------------基于日期的范围分区-------------------------------

 create table dt

 (id number not null primary key,

  name varchar2(200),

  riqi date)

  partition by range(riqi)

  (

  partition values less than(to_date('2011-01-19','yyyy-mm-dd')),

  partition values less than(to_date('2011-02-19','yyyy-mm-dd')),

  partition values less than(to_date('2011-03-19','yyyy-mm-dd')));

 

  select TABLE_NAME,TABLESPACE_NAME, NUM_ROWS,PARTITIONED from ALL_tables where table_name='DT';

--------------------maxvalue  分区------------------

  create table dt

 (id number not null primary key,

  name varchar2(200),

  riqi date)

  partition by range(id)

  (partition  part1 values less than(10000) tablespace part1,

  partition part2 values less than(20000) tablespace part2,

  partition part3 values less than(maxvalue) tablespace part3);

  -----------------------列表分区----------

  CREATE TABLE PROBLEM_TICKETS

(

    PROBLEM_ID   NUMBER(7) NOT NULL PRIMARY KEY,

    DESCRIPTION  VARCHAR2(2000),

    CUSTOMER_ID  NUMBER(7) NOT NULL,

    DATE_ENTERED DATE NOT NULL,

    STATUS       VARCHAR2(20)

)

PARTITION BY LIST (STATUS)

(

      PARTITION PROB_ACTIVE   VALUES ('ACTIVE') TABLESPACE PROB_TS01,

      PARTITION PROB_INACTIVE VALUES ('INACTIVE') TABLESPACE PROB_TS02)

-------------------散列分区hash分区--------------

CREATE TABLE HASH_TABLE

(

  COL NUMBER(8),

  INF VARCHAR2(100)

)

PARTITION BY HASH (COL)

(

  PARTITION PART01 TABLESPACE HASH_TS01,

  PARTITION PART02 TABLESPACE HASH_TS02,

  PARTITION PART03 TABLESPACE HASH_TS03

)

 

 

create table slfq

(id number,

inf varchar2(12))

partition by hash(id)

(partition part1,

partition part2);

---------------混合分区---------------

CREATE TABLE SALES

(

 

PRODUCT_ID VARCHAR2(5),

 

SALES_DATE DATE,

 

SALES_COST NUMBER(10),

 

STATUS VARCHAR2(20)

 

)

 

PARTITION BY RANGE(SALES_DATE) SUBPARTITION BY LIST (STATUS)

 

(

 

   PARTITION P1 VALUES LESS THAN(TO_DATE('2003-01-01','YYYY-MM-DD'))TABLESPACE rptfact2009

          (

              SUBPARTITION P1SUB1 VALUES ('ACTIVE') TABLESPACE rptfact2009,

              SUBPARTITION P1SUB2 VALUES ('INACTIVE') TABLESPACE rptfact2009

          ),

   PARTITION P2 VALUES LESS THAN (TO_DATE('2003-03-01','YYYY-MM-DD')) TABLESPACE rptfact2009

          (

              SUBPARTITION P2SUB1 VALUES ('ACTIVE') TABLESPACE rptfact2009,

              SUBPARTITION P2SUB2 VALUES ('INACTIVE') TABLESPACE rptfact2009

          )

)

 

 

        -------实验------------

       

  CREATE TABLE SALES

(

PRODUCT_ID VARCHAR2(5),

SALES_DATE DATE,

SALES_COST NUMBER(10),

STATUS VARCHAR2(20)

)

partition by range(sales_date) subpartition by list(status)

(

partition p1 values less than(to_date('2009-03-19','yyyy-mm-dd'))

        (subpartition p1sub1 values('active'),

         subpartition p1sub2 values('inactive')),

partition p2 values less than(to_date('2011-03-19','yyyy-mm-dd'))

       (subpartition  p2sub1 values('active'),

         subpartition p2sub2 values('inactive')));

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

1.添加分区

ALTER  TABLE  SALES  ADD  PARTITION P3  VALUES  LESS  THEN (TO_DATE('2003-06-01','YYYY-MM-DD'))  TABLESPACE  SPACE_NAME;

2.添加子分区

ALTER  TABLE  SALES  MODIFY  PARTITION  P3  ADD SUBPARTITION P3SUB1 VALUES('COMPLETE')  TABLESPACE  SPACE_NAME;

3.删除分区

ALTER  TABLE  SALES  DROP  PARTITION  P3;

  删除子分区

  ALTER  TABLE  SALES  DROP  SUBPARTITION  P4SUB1;

 果删除的分区是表中唯一的分区,那么此分区将不能被删除,要想删除此分区,必须删除表。

4.合并分区是将相邻的分区合并成一个分区,结果分区将采用较高分区的界限,值得注意的是,不能将分区合并到界限较低的分区。以下代码实现了P1 P2分区的合并:

  ALTER  TABLE  SALES  MERGE  PARTITIONS  P1, P2  INTO  PARTITION  P2;

5.分区重命名

  ALTER TABLE SALES RENAME PARTITION P21 TO P2;

6.分区表的转换(把hisdeliverx表转为分区表t_hisdeliverx)

  alter table t_hisdeliverx exchange partition pmax with table hisdeliverx;

 

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/25623297/viewspace-691867/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2011-04-01

  • 博文量
    16
  • 访问量
    28881