Oracle 分区表创建
分区分类
- 字段范围分区 range `Oracle 8`
- 哈希分区 hash `Oracle 8i`
- 组合分区 range-hash,range-list ... `Oracle 9i`
- 列表分区 list `Oracle 9i`
- 间隔分区 interval `Oracle 11g`
- 系统分区 System `Oracle 11g`
- 引用分区 Reference `Oracle 11g`
字段范围 range - NUMBER类型字段 CREATE TABLE emp ( empno NUMBER(4), ename VARCHAR2(30), sal NUMBER ) PARTITION BY RANGE(empno) ( partition e1 values less than (1000) tablespace ts1, partition e2 values less than (2000) tablespace ts2, partition e3 values less than (MAXVALUE) tablespace ts3 ); - VARCHAR2类型字段 CREATE TABLE emp ( id NUMBER(5) PRIMARY KEY, name VARCHAR2(50) NOT NULL, phone VARCHAR2(15), email VARCHAR2(100) ) PARTITION BY RANGE ( name ) ( PARTITION p1 VALUES LESS THAN ('L') TABLESPACE ts1, PARTITION p2 VALUES LESS THAN (MAXVALUE) TABLESPACE ts2 ) - 基于时间类型字段 CREATE TABLE t1 (id NUMBER, c1 DATE) PARTITION BY RANGE (c1) (PARTITION t1p1 VALUES LESS THAN (TO_DATE('2007-11-01', 'YYYY-MM-DD')), PARTITION t1p2 VALUES LESS THAN (TO_DATE('2007-12-01', 'YYYY-MM-DD')), PARTITION t1p3 VALUES LESS THAN (TO_DATE('2008-01-01', 'YYYY-MM-DD')), PARTITION t1p4 VALUES LESS THAN (MAXVALUE) ); ### Hash分区 - 两种写法 create table emp2 ( empno number(4), ename varchar2(30), sal number ) partition by hash(empno) ( partition e1 tablespace emp1, partition e2 tablespace emp2, partition e3 tablespace emp3, partition e4 tablespace emp4 ); -- tablespace 可以去掉 create table emp2 ( empno number(4), ename varchar2(30), sal number ) PARTITION BY HASH(empno) PARTITIONS 3 -- STORE IN (empts1, empts2, empts3); 组合分区 - 8i 之前 只支持 range-hash - 9i 支持 range-list - 11g 支持更多 详情看这[http://www.orafaq.com/wiki/Composite_partitioning](http://www.orafaq.com/wiki/Composite_partitioning) CREATE TABLE orders( ord# NUMBER, orderdate DATE, prod# NUMBER, quantity NUMBER) PARTITION BY RANGE(orderdate) SUBPARTITION BY HASH(prod#) SUBPARTITIONS 4 -- STORE IN(ts1, ts2, ts3, ts4) ( PARTITION q1 VALUES LESS THAN (TO_DATE('01-APR-2009', 'DD-MON-YYYY')), PARTITION q2 VALUES LESS THAN (TO_DATE('01-JUL-2009', 'DD-MON-YYYY')), PARTITION q3 VALUES LESS THAN (TO_DATE('01-OCT-2009', 'DD-MON-YYYY')), PARTITION q4 VALUES LESS THAN (MAXVALUE) ); List分区 CREATE TABLE myemp_work ( emp# NUMBER PRIMARY KEY, ename VARCHAR2(30), salary NUMBER(8,2), deptno NUMBER) PARTITION BY LIST (deptno) ( PARTITION p10 VALUES (10), PARTITION p20 VALUES (20), PARTITION p30 VALUES (30,40)); 间隔分区 Interval - 11g引入,作为range分区的补充,当插入的值超过所有其他分区的范围时,自动创建分区 - 限制 - 分区字段必须是NUMBER或者DATE类型 - 不支持索引组织表 index-organized table - 不能在间隔分区创建域索引domain index -- 创建salary有限值的分区 create table test (sno number(6), last_name varchar2(30), salary number(6)) partition by range(salary) ( partition p1 values less than (5000), partition p2 values less than (10000), partition p3 values less than (15000), partition p4 values less than (20000)); -- 插入一条超过分区区间的记录 insert into test values (1,'Michel',25000); -- 抛出分区key不能映射到某个分区的错误 ORA-14400: inserted partition key does not map to any partition -- interval分区用法 create table test (sno number(6), last_name varchar2(30), salary number(6)) partition by range(salary) Interval (5000) -- 每5000一个分区 ( partition p1 values less than (5000), partition p2 values less than (10000), partition p3 values less than (15000), partition p4 values less than (20000)); 系统分区 - 11g中引入的一种分区方法,它允许应用程序控制分区选择。系统分区不像其他分区模式那样具有分区键。 -- 创建若干分区 CREATE TABLE syspart (c1 NUMBER, c2 NUMBER) PARTITION BY SYSTEM ( PARTITION p1 TABLESPACE ts1, PARTITION p2 TABLESPACE ts2, PARTITION p3 TABLESPACE ts3 ); -- 插入数据时程序选择指定分区 INSERT INTO syspart PARTITION (p1) VALUES (1, 2); INSERT INTO syspart PARTITION (p2) VALUES (3, 4); 引用分区 - 11g中介绍的一种分区方法。使用引用分区,子表可以从父表继承分区特征。 -- 父表 CREATE TABLE orders ( order_id NUMBER PRIMARY KEY, order_date DATE NOT NULL, customer_id NUMBER NOT NULL, shipper_id NUMBER) PARTITION BY RANGE (order_date) ( PARTITION y1 VALUES LESS THAN (TO_DATE('01-JAN-2006', 'DD-MON-YYYY')), PARTITION y2 VALUES LESS THAN (TO_DATE('01-JAN-2007', 'DD-MON-YYYY')), PARTITION y3 VALUES LESS THAN (TO_DATE('01-JAN-2008', 'DD-MON-YYYY'))); -- 子表外键继承父表的分区 CREATE TABLE order_items ( order_id NUMBER NOT NULL, product_id NUMBER NOT NULL, price NUMBER, quantity NUMBER, CONSTRAINT order_items_fk FOREIGN KEY (order_id) REFERENCES orders) PARTITION BY REFERENCE (order_items_fk); 分区压缩 - 11g分区可以被单独压缩,10g只支持整表压缩 查看压缩特性 -- 创建分区表,指定分区是否压缩 CREATE TABLE test (sno NUMBER(6), last_name VARCHAR2(30), salary NUMBER(6)) PARTITION BY RANGE (salary) INTERVAL (5000) ( PARTITION p1 VALUES LESS THAN (5000) COMPRESS, PARTITION p2 VALUES LESS THAN (10000) NOCOMPRESS, PARTITION p3 VALUES LESS THAN (15000) COMPRESS, PARTITION p4 VALUES LESS THAN (20000)) NOCOMPRESS; -- 检查该表的压缩属性 SELECT table_name, partition_name, compression FROM user_tab_partitions WHERE table_name='TEST'; --单个关键字指定整个表的所有分区可被压缩 CREATE TABLE test (sno NUMBER(6), last_name VARCHAR2(30), salary NUMBER(6)) COMPRESS PARTITION BY RANGE (salary) INTERVAL (5000) ( PARTITION p1 VALUES LESS THAN (5000) , PARTITION p2 VALUES LESS THAN (10000), PARTITION p3 VALUES LESS THAN (15000), PARTITION p4 VALUES LESS THAN (20000));