Oracle database 12.2有不少分区加强的特性:
我们来列举几个看看:
1. multi-column list partition。注:最多支持16个列
Connected to Oracle Database 12c Enterprise Edition Release 12.2.0.0.1 
Connected as test@ORA122_windows_pdb122
 
SQL>
CREATE TABLE t_oracleblog (salername varchar(200),region VARCHAR2(50), channel VARCHAR2(50))
PARTITION BY LIST (region, channel)  --Note keywork :region, channel, Here are 2 columns
( 
partition p1 values ('USA','Direct'),
partition p2 values ('USA','Partners'),
partition p3 values ('GERMANY','Direct'),
partition p4 values (('GERMANY','Partners'),('GERMANY','Web')),
partition p5 values ('CHINA','Direct'),
partition p6 values (('CHINA','Partners'),('CHINA','Web'),('CHINA','Oversee')),
partition p7 values ('JAPAN','Direct'),
partition p8 values (DEFAULT)
)
/
insert into t_oracleblog values('AAA','USA','Direct');
insert into t_oracleblog values('BBB','CHINA','Direct');
insert into t_oracleblog values('CCC','CHINA','Web');
insert into t_oracleblog values('DDD','CHINA','Partners');
insert into t_oracleblog values('EEE','GERMANY','Direct');
insert into t_oracleblog values('FFF','GERMANY','Partners');
insert into t_oracleblog values('GGG','JAPAN','Direct');
insert into t_oracleblog values('HHH','CHINA','Oversee');
insert into t_oracleblog values('III','JAPAN','Web');
insert into t_oracleblog values('JJJ','FRANCE','Direct');
insert into t_oracleblog values('KKK','CHINA','DIRECT');
SQL> select * from t_oracleblog partition(p1);
 
SALERNAME            REGION                                             CHANNEL
-------------------- -------------------------------------------------- --------------------------------------------------
AAA                  USA                                                Direct
 
SQL> select * from t_oracleblog partition(p2);
 
SALERNAME            REGION                                             CHANNEL
-------------------- -------------------------------------------------- --------------------------------------------------
 
SQL> select * from t_oracleblog partition(p3);
 
SALERNAME            REGION                                             CHANNEL
-------------------- -------------------------------------------------- --------------------------------------------------
EEE                  GERMANY                                            Direct
 
SQL> select * from t_oracleblog partition(p4);
 
SALERNAME            REGION                                             CHANNEL
-------------------- -------------------------------------------------- --------------------------------------------------
FFF                  GERMANY                                            Partners
 
SQL> select * from t_oracleblog partition(p5);
 
SALERNAME            REGION                                             CHANNEL
-------------------- -------------------------------------------------- --------------------------------------------------
BBB                  CHINA                                              Direct
 
SQL> select * from t_oracleblog partition(p6);
 
SALERNAME            REGION                                             CHANNEL
-------------------- -------------------------------------------------- --------------------------------------------------
CCC                  CHINA                                              Web
DDD                  CHINA                                              Partners
HHH                  CHINA                                              Oversee
 
SQL> select * from t_oracleblog partition(p7);
 
SALERNAME            REGION                                             CHANNEL
-------------------- -------------------------------------------------- --------------------------------------------------
GGG                  JAPAN                                              Direct
 
SQL> select * from t_oracleblog partition(p8);
 
SALERNAME            REGION                                             CHANNEL
-------------------- -------------------------------------------------- --------------------------------------------------
III                  JAPAN                                              Web
JJJ                  FRANCE                                             Direct
KKK                  CHINA                                              DIRECT
 
SQL> 
2. auto-list partition
CREATE TABLE t_car (brand VARCHAR2(50),model VARCHAR2(50), year char(4))
PARTITION BY LIST (brand) AUTOMATIC --Note keywork :AUTOMATIC
(
partition p1 values ('BMW'),
partition p2 values ('BENZ')
)
/
 
 
SQL> select table_name,partition_name from dba_tab_partitions where table_name='T_CAR';
 
TABLE_NAME                                                                       PARTITION_NAME
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
T_CAR                                                                            P1
T_CAR                                                                            P2
 
SQL> 
SQL> 
SQL> 
SQL> 
SQL> insert into t_car values('BMW','AAA','1984');
 
1 row inserted
SQL> insert into t_car values('BMW','BBB','1986');
 
1 row inserted
SQL> insert into t_car values('BENZ','CCC','1992');
 
1 row inserted
SQL> insert into t_car values('BENZ','DDD','1983');
 
1 row inserted
 
SQL> 
SQL> select table_name,partition_name from dba_tab_partitions where table_name='T_CAR';
 
TABLE_NAME                                                                       PARTITION_NAME
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
T_CAR                                                                            P1
T_CAR                                                                            P2
 
SQL> 
SQL> 
SQL> 
SQL> insert into t_car values('JEEP','EEE','1991'); ---插入之前没有在partition key定义的行。
 
1 row inserted
 
SQL> select table_name,partition_name from dba_tab_partitions where table_name='T_CAR';
 
TABLE_NAME                                                                       PARTITION_NAME
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
T_CAR                                                                            P1
T_CAR                                                                            P2
T_CAR                                                                            SYS_P1328
 
SQL> 
SQL> 
SQL> 
SQL> insert into t_car values('BYD','FFF','2015');
 
1 row inserted
SQL> insert into t_car values('FORD','FFF','2015');
 
1 row inserted
 
SQL> 
SQL> 
SQL> select table_name,partition_name from dba_tab_partitions where table_name='T_CAR'; --可以看到自动生成了新分区。
 
TABLE_NAME                                                                       PARTITION_NAME
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
T_CAR                                                                            P1
T_CAR                                                                            P2
T_CAR                                                                            SYS_P1328
T_CAR                                                                            SYS_P1329
T_CAR                                                                            SYS_P1330
 
SQL> 
3. interval subpartition
4.online DDL for partition
CREATE TABLE t_oracleblog (salername varchar(200),region VARCHAR2(50), channel VARCHAR2(50));
ALTER TABLE t_oracleblog MODIFY 
PARTITION BY LIST (region)
(partition p1 values ('USA'),
partition p2 values ('GERMANY'),
partition p3 values ('JAPAN'),
partition p4 values (DEFAULT)) 
ONLINE ---Note keyword: ONLINE
/
注1:统计信息会收集
注2:从10046的trace看,似乎是临时创建了SYS_JOURNAL_
5. Filtered Partition on Maintenance Operations
在MOVE,SPLIT,MERGE partition的时候,可以进行过滤:
SQL> select * from T_ORACLEBLOG partition(p4); SALERNAME REGION CHANNEL -------------------- -------------------------------------------------- -------------------------------------------------- BBB CHINA Direct CCC CHINA Web DDD CHINA Partners HHH CHINA Oversee JJJ FRANCE Direct KKK CHINA DIRECT 6 rows selected SQL> SQL> SQL> SQL> SQL> SQL> SQL> ALTER TABLE T_ORACLEBLOG MOVE PARTITION p4 2 TABLESPACE SYSAUX 3 INCLUDING ROWS WHERE REGION = 'CHINA' --Note keyword INCLUDING ROW WHERE 4 / Table altered SQL> SQL> select * from T_ORACLEBLOG partition(p4); SALERNAME REGION CHANNEL -------------------- -------------------------------------------------- -------------------------------------------------- BBB CHINA Direct CCC CHINA Web DDD CHINA Partners HHH CHINA Oversee KKK CHINA DIRECT SQL>
注1:where条件后面的字段千万不能写错,不然数据全没了。如错写成INCLUDING ROWS WHERE channel = ‘CHINA’,MOVE之后则分区4的数据全没了。因为including row表示留下的数据,而channel = ‘CHINA’ 这样的数据一条都没有,所以就清空了分区。
6.Read only partition
SQL> CREATE TABLE orders
  2  (
  3  order_id number,
  4  order_date DATE,
  5  customer_name varchar2(200)
  6  ) read only  ----Note keyword read only, which mean table read only
  7  PARTITION BY RANGE(order_date)
  8  (
  9  partition q1_2015 values less than (to_date('2014-10-01','yyyy-mm-dd')),
 10  partition q2_2015 values less than (to_date('2015-01-01','yyyy-mm-dd')),
 11  partition q3_2015 values less than (to_date('2015-04-01','yyyy-mm-dd')),
 12  partition q4_2015 values less than (to_date('2015-07-01','yyyy-mm-dd')) read write ----Note keyword read only, which mean partition q4 read write
 13  )
 14  /
 
Table created
 
SQL> 
SQL> 
SQL> insert into orders values(1,to_date('2015-04-20','yyyy-mm-dd'),'AAA');
 
1 row inserted
 
SQL> insert into orders values(1,to_date('2015-06-20','yyyy-mm-dd'),'AAA');
 
1 row inserted
 
SQL> insert into orders values(1,to_date('2015-01-20','yyyy-mm-dd'),'AAA'); --对于read only的partition,插入数据会报错。
 
insert into orders values(1,to_date('2015-01-20','yyyy-mm-dd'),'AAA')
 
ORA-14466: Data in a read-only partition or subpartition cannot be modified.
 
SQL> 
SQL> 
SQL> select * from orders;
 
  ORDER_ID ORDER_DATE  CUSTOMER_NAME
---------- ----------- --------------------------------------------------------------------------------
         1 2015/4/20   AAA
         1 2015/6/20   AAA
 
SQL>