Oracle 分区表相关语法

来源:互联网 发布:程序员年入百万 编辑:程序博客网 时间:2024/06/06 20:25

Oracle offers six different ways to partition your table data:

  1. range partition
  2. interval partition
  3. hash partition
  4. list partition
  5. reference partition
  6. system partition

range partition

范围分区是第一个被引入到Oracle中的分区技术。范围分区技术一般用在准备以时间作为分区列的表上。

范围分区一-单一的分区键值

create table TABLE_RANGE1(  as_of_date      DATE not null,  org_unit_id     VARCHAR2(32),  gl_account_id   VARCHAR2(10),  iso_currency_cd CHAR(3))partition by range (AS_OF_DATE)(  partition P20160720 values less than (TO_DATE(' 2016-07-21 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')),  partition P20160721 values less than (TO_DATE(' 2016-07-22 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')));

范围分区二-多分区键值

-- Create tablecreate table TABLE_RANGE2(  order_no       NUMBER,  year_of_order  INTEGER not null,  month_of_order INTEGER not null,  day_of_order   INTEGER not null)partition by range (YEAR_OF_ORDER, MONTH_OF_ORDER, DAY_OF_ORDER)(  partition PART_Q1 values less than (2016, 4, 1),  partition PART_Q2 values less than (2016, 7, 1),  partition PART_Q3 values less than (2016, 10, 1),  partition PART_Q4 values less than (2017, 1, 1));

Caution
It is common in range-partition tables to use a catchall partition as the very last one. The last partition will contain values less than a value called maxvalue, which is simply any value higher than the values in the second-to-last partition.
这段话的意思就是说,不管怎么样,建议在最大的分区上定义一个叫 maxvalue 的分区用于兜底,一旦发生超过最大分区的数据产生,那么可以进行使用 maxvalue 分区进行保存数据。

范围分区三-有maxvalue分区

create table TABLE_RANGE3(  as_of_date      DATE not null,  org_unit_id     VARCHAR2(32),  gl_account_id   VARCHAR2(10),  iso_currency_cd CHAR(3))partition by range (AS_OF_DATE)(  partition P20160720 values less than (TO_DATE(' 2016-07-21 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')),  partition P20160721 values less than (TO_DATE(' 2016-07-22 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')),  partition pmax values less than (maxvalue));

Note that each partition has a specific name and is stored in a separate tablespace.
需要注意的是每一个分区都有一个名字,保存在独立的空间中。

Interval Partition

Interval partitioning is an extension of the traditional range-partitioning method. In order to implement interval partitioning for a table, you must first specify a minimum of one range partition for that table. Whether you use the minimum singe-range partition or multiple-range partitions, the high value of the range partitioning key is called the transition point. The database automatically creates interval partitions after the data in the table crosses the transition point.

Interval分区技术是传统的范围分区的一种延伸,可以为超过分区键值的数据自动创建对应的分区。但是为了使用Interval分区,那么必须在分区表上至少含有一个以上的分区。

Interval 分区一-根据时间(年)

create table TABLE_INTERVAL1(  as_of_date    DATE,  org_unit_id   VARCHAR2(30),  gl_account_id VARCHAR2(30))partition by range (AS_OF_DATE)INTERVAL(NUMTOYMINTERVAL(1, 'YEAR'))(  partition P2016 values less than (TO_DATE(' 2017-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))  partition P2017 values less than (TO_DATE(' 2018-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')));

Interval 分区二-根据时间(月)

create table TABLE_INTERVAL2(  as_of_date    DATE,  org_unit_id   VARCHAR2(30),  gl_account_id VARCHAR2(30))partition by range (AS_OF_DATE)INTERVAL(NUMTOYMINTERVAL(1, 'MONTH'))(  partition P201701 values less than (TO_DATE(' 2017-02-01', 'YYYY-MM-DD')),  partition P201702 values less than (TO_DATE(' 2018-03-01', 'YYYY-MM-DD')));

Interval 分区三-根据时间(天)

create table TABLE_INTERVAL3(  as_of_date    DATE,  org_unit_id   VARCHAR2(30),  gl_account_id VARCHAR2(30))partition by range (AS_OF_DATE)INTERVAL(NUMTODSINTERVAL(1, 'DAY'))(  partition P20170101 values less than (TO_DATE(' 2017-01-02', 'YYYY-MM-DD')),  partition P20170102 values less than (TO_DATE(' 2018-01-03', 'YYYY-MM-DD')));

Interval 分区四-根据数字

-- Create tablecreate table TABLE_INTERVAL4(  id   INTEGER not null,  name VARCHAR2(30))partition by range (ID)INTERVAL(1000)(  partition P1 values less than (1000),  partition P2 values less than (2000));

Interval 分区五-指定分区

create table TABLE_INTERVAL5(  id   INTEGER not null,  name VARCHAR2(20))partition by range (ID)INTERVAL(1000) STORE IN (REPORT_TS, ETL_TS)(  partition P1 values less than (1000),  partition P2 values less than (2000));

Range 分区转换为 Interval 分区

ALTER TABLE TABLE_RANGE2 SET INTERVAL(NUMTODSINTERVAL(1, 'DAY'));

Caution
具有maxvalue分区的范围分区无法变成Interval分区。

Interval 分区转换为 Range 分区

ALTER TABLE TABLE_INTERVAL4 SET INTERVAL();

Interval 分区添加指定分区(添加RAYLEE)

ALTER TABLE TABLE_INTERVAL5 SET STORE IN (REPORT_TS, ETL_TS, RAYLEE);

Interval 分区删除指定分区(删除RAYLEE)

ALTER TABLE TABLE_INTERVAL5 SET STORE IN (REPORT_TS, ETL_TS);

如果要删除的表空间上已经存在分区

ALTER TABLE TABLE_NAME MOVE PARTITION PARTITION_NAME TABLESPACE TARGET_TABLESPACE;

Interval 分区注意事项

  • Use the INTERVAL caluse in the CREATE TABLE statement to create an
    interval-partitioned table.
    在建表语句中使用INTERVAL关键字创建Interval 分区

  • Specify at least one range partition using the partition clause,
    before specifying your interval partitions.
    创建Interval 分区最少使用存在一个范围分区

  • The partitioning key must be of the NUMBER or DATE type.
    分区的列必须是 NUMBER 或者 DATE 类型

  • You can optionally specify the tablespaces for the partition data by
    including the STORE IN clause in the CREATE TABLE statement.
    可以选择是否在建表语句中使用 STORE IN 子句用于指定表空间

HASH 分区

Use the hash-partitioning, all you have to do is decide on the number of partitions, and Oracle’s hashing algorithms will assign a hash value to each row’s partitioning key and place it in the appropriate partition.

对于 HASH 分区,你所需要做的就是决定要 hash 成多少个分区,Oracle的 hash 分区算法将会给每一个行的分区列的键值一个hash 值,并把它放置到对应的分区去

HASH 分区代码

CREATE TABLE TABLE_HASH(   ID INT NOT NULL,    YEAR_OF_ORDER INT NOT NULL,    MONTH_OF_ORDER INT NOT NULL,    DAY_OF_ORDER INT NOT NULL)PARTITION BY HASH(ID)PARTITIONS 2STORE IN (REPORT_TS, ETL_TS);

LIST 分区

对于非连续型的分区的一种补充使用 LIST 分区。

LIST 分区代码-使用默认分区

-- Create tablecreate table TABLE_LIST1(  alpha_id CHAR(1),  name     VARCHAR2(20))partition by list (ALPHA_ID)(  partition P_AG values ('A', 'B', 'C', 'D', 'E', 'F', 'G'),  partition P_H values ('H', 'I', 'J', 'K', 'L', 'M', 'N'));

LIST 分区代码-指定分区

create table TABLE_LIST2(  alpha_id CHAR(1),  name     VARCHAR2(20))partition by list (ALPHA_ID)(  partition P_AG values ('A', 'B', 'C', 'D', 'E', 'F', 'G')   TABLESPACE REPORT_TS,  partition P_H values ('H', 'I', 'J', 'K', 'L', 'M', 'N')   TABLESPACE ETL_TS);

Reference 分区(未完成)

0 0
原创粉丝点击