oracle 分区表 官方,Oracle分区表

间隔分区的特点:

1.由range分区派生而来

2.以定长宽度创建分区(比如年、月、具体的数字(比如100、500等))

3.分区字段必须是number或date类型

4.必须至少指定一个range分区(永久分区)

5.当有记录插入时,系统根据需要自动创建新的分区和本地索引

6.已有的范围分区可被转换成间隔分区(通过ALTER TABLE SET INTERVAL选项完成)

7.IntervalPartitioning不支持支持索引组织表

8.在Interval Partitioning表上不能创建domain index

/*

===========================================================

| 分区表的管理

============================================================

*/

--查询分区

SELECT table_name,partition_name

FROM user_tab_partitions

WHERE table_name=UPPER('sales_range1');

SELECT * FROM sales_range1 PARTITION (part1);--11前

SELECT * FROM sales_range1 PARTITION (part2);--12前

SELECT * FROM sales_range1 PARTITION (part3);--13前

SELECT * FROM sales_range1 PARTITION (part4);--14前

--添加分区

ALTER TABLE sales_range1 ADD PARTITION part5 VALUES LESS THAN (to_date('2015-01-01','yyyy-mm-dd'));

ALTER TABLE sales_range1 ADD PARTITION part6 VALUES LESS THAN (MAXVALUE);

--删除分区

ALTER TABLE sales_range1 DROP PARTITION part5

--移动分区

ALTER TABLE sales_range1 MOVE PARTITION part1 TABLESPACE tp_sales_bak;

/*

===========================================================

| 现有表创建范围分区表

============================================================

*/

CREATE TABLE sales

(sales_id NUMBER NOT NULL,

product_id VARCHAR2(5),

sales_date DATE,

sales_cost NUMBER(10),

areacode VARCHAR2(5)

)

CREATE TABLE sales_range2

partition by range(sales_date)

(partition part1 values less than (to_date('2011/01/01','yyyy/mm/dd')),

partition part2 values less than (to_date('2012/01/01','yyyy/mm/dd')),

partition part3 values less than (to_date('2013/01/01','yyyy/mm/dd')),

partition part4 values less than (to_date('2014/01/01','yyyy/mm/dd'))

)

as select * from sales;

--问题1 2014/01/01的数据落在哪个分区?

--问题2 2015年的数据落在哪个分区?

--2个解决办法:一个是添加分区;一个是创建间隔分区

/*

===========================================================

| 创建范围分区表

============================================================

*/

CREATE TABLE sales_range1

(sales_id NUMBER NOT NULL,

product_id VARCHAR2(5),

sales_date DATE,

sales_cost NUMBER(10),

areacode VARCHAR2(5)

)

partition by range(sales_date)

(partition part1 values less than (to_date('2011/01/01','yyyy/mm/dd')) TABLESPACE tp_orders,

partition part2 values less than (to_date('2012/01/01','yyyy/mm/dd')),

partition part3 values less than (to_date('2013/01/01','yyyy/mm/dd')),

partition part4 values less than (to_date('2014/01/01','yyyy/mm/dd'))

);

--查询分区情况

SELECT table_name,partition_name

FROM user_tab_partitions

WHERE table_name=UPPER('sales_range1');

--插入数据

insert into sales_range1 values (1000,'p1',to_date('2011-01-01','yyyy-mm-dd'),1000,'A1');

--查询数据

select * from sales_range1 PARTITION (part2);

/*

===========================================================

| 间隔分区表

============================================================

*/

CREATE TABLE sales_interval1

(sales_id NUMBER NOT NULL,

product_id VARCHAR2(5),

sales_date DATE,

sales_cost NUMBER(10),

areacode VARCHAR2(5)

)

PARTITION BY RANGE(sales_date)

INTERVAL(NUMTOYMINTERVAL(1,'YEAR'))

(PARTITION part1 VALUES LESS THAN (to_date('2011/01/01','yyyy/mm/dd')))

--查询分区情况

SELECT table_name,partition_name,tablespace_name

FROM user_tab_partitions

WHERE table_name=UPPER('sales_interval1');

INSERT INTO sales_interval1 VALUES (1000,'p1',SYSDATE,2000,'A2');

SELECT * FROM sales_interval1 PARTITION (SYS_P142);

--现有表创建新表

CREATE TABLE sales_interval2

PARTITION BY RANGE(sales_date)

INTERVAL(NUMTOYMINTERVAL(1,'YEAR'))

(PARTITION part1 VALUES LESS THAN (to_date('2011/01/01','yyyy/mm/dd')))

AS SELECT * FROM sales;

/*

===========================================================

| 范围分区

============================================================

*/

CREATE TABLE SALES1

(

SALES_ID NUMBER,

PRODUCT_ID VARCHAR2(5),

SALES_DATE DATE NOT NULL

)

PARTITION BY RANGE (SALES_DATE)

(

PARTITION P1 VALUES LESS THAN (to_date('2013-04-1', 'yyyy-mm-dd')),

PARTITION P2 VALUES LESS THAN (to_date('2013-07-1', 'yyyy-mm-dd')),

PARTITION P3 VALUES LESS THAN (to_date('2013-10-1', 'yyyy-mm-dd')),

PARTITION P4 VALUES LESS THAN (to_date('2014-01-1', 'yyyy-mm-dd')),

PARTITION P5 VALUES LESS THAN (maxvalue)

);

--要查看在第三季度的数据

SELECT * FROM SALES1 partition(P3);

--要删除第三季度的数据

DELETE FROM SALES1 partition(P3);

/*

===========================================================

| 间隔分区

============================================================

*/

--创建间隔分区表

CREATE TABLE SALES2

(

SALES_ID NUMBER,

PRODUCT_ID VARCHAR2(5),

SALES_DATE DATE NOT NULL

)

PARTITION BY RANGE(SALES_DATE)

INTERVAL(NUMTOYMINTERVAL(3,'MONTH'))

(PARTITION P1 VALUES LESS THAN (to_date('2013-04-1','yyyy/mm/dd')));

--插入数据

INSERT INTO sales2 VALUES (1,'a',to_date('2013-08-1'),10,'1');

--获得分区情况

SELECT table_name,partition_name

FROM user_tab_partitions

WHERE table_name=UPPER('sales2');

--查询输出结果,系统自动根据输入数据情况创建新分区“SYS_P82”

TABLE_NAMEPARTITION_NAME

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

SALES2 P1

SALES2 SYS_P82

--查询分区数据

SELECT * FROM sales2 PARTITION(sys_P82);

/*

===========================================================

| 利用间隔分区将开始创建时没有分区的表创建为新的间隔分区表

============================================================

*/

/*准备工作*/

--1.创建普通SALES表

CREATE TABLE SALES

(

SALES_ID NUMBER,

PRODUCT_ID VARCHAR2(5),

SALES_DATE DATE NOT NULL

);

--2.自行向SALES表插入数据

/*实施步骤*/

--1.创建间隔分区表SALES3

CREATE TABLE SALES3

PARTITION BY RANGE(SALES_DATE)

INTERVAL(NUMTOYMINTERVAL(3,'MONTH'))

(PARTITION P1 VALUES LESS THAN (to_date('2013-04-1','yyyy/mm/dd')))

AS SELECT * FROM SALES; --SALES表为已经创建的表

--2.查询分区情况

SELECT table_name,partition_name

FROM user_tab_partitions

WHERE table_name=UPPER('sales3');

--3.查询某一分区数据

--4.自行向SALES3表插入数据

--5.再次查询某一分区数据

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值