DM数据库分区表

分区表的类型:水平分区
水平分区类型:范围分区,列表分区,哈希分区,间隔分区-自增
目的:把一张超大表,逻辑拆分出多张小表,分散 i/o,方便管理,提高数据查询和 DML 操作的效率。

查看分区表:

select owner,table_name,tablespace_name from dba_tables where partitioned='YES';

查看表分区:

select table_owner,table_name, partition_name,high_value,tablespace_name, subpartition_count from DBA_TAB_PARTITIONS order by 1,2,4;

范围分区

要求:分区列是数字或是日期类型。
每一个分区都必须有一个 VALUES LESS THAN 子句,它指定了一个不包括在该分区中的上限值。分区键的任何值等于或者大于这个上限值的记录都会被加入到下一个高一些的分区中。
所有分区,除了第一个,都会有一个隐式的下限值,这个值就是此分区的前一个分区的上限值。
在最高的分区中,MAXVALUE 被定义。MAXVALUE 代表了一个不确定的值。这个值高于其它分区中的任何分区键的值,也可以理解为高于任何分区中指定的 VALUE LESS THAN 的值,同时包括空值。

创建分区表:

CREATE table test.T3(ID INT, NAME VARCHAR(20))
PARTITION BY RANGE(ID)
(PARTITION P1 VALUES LESS THAN (100) tablespace TBS1,
PARTITION P2 VALUES LESS THAN (200)  tablespace TBS2,
PARTITION P3 VALUES LESS THAN (300) tablespace TBS3);

添加分区:

alter table test.t3 add partition PN values less than (MAXVALUE);

查看分区数据:

select * from test.t3 partition(p1);

插入测试数据:

BEGIN
FOR I IN 1..200 LOOP
INSERT INTO TEST.T3 VALUES (I,'AAA'||I);
COMMIT;
END LOOP;
END;

堆表分区表:

CREATE table test01.T_R4(SID INT, ID INT, NAME VARCHAR(20))
PARTITION BY RANGE(SID)
(PARTITION P1 VALUES LESS THAN (100) ,
PARTITION P2 VALUES LESS THAN (200) ,
PARTITION P3 VALUES LESS THAN (300) )
STORAGE(NOBRANCH);

列表分区

分区列适合字符串类型
通过指定表中的某个列的离散值集,来确定应当存储在一起的数据。分区的特点是某列的值只有几个,基于这样的特点我们可以采用列表分区。

CREATE TABLE TEST.T4(
SALES_ID INT,
SALEMAN VARCHAR(20),
SALEDATE DATETIME,
CITY CHAR(10))
PARTITION BY LIST(CITY)
(PARTITION P1 VALUES ('北京','天津','河北'),
PARTITION P2 VALUES ('上海','南京','杭州'),
PARTITION P3 VALUES ('武汉','长沙'),
PARTITION P4 VALUES ('广州','深圳'),
PARTITION PN VALUES (DEFAULT));

增加分区:

ALTER TABLE TEST.T4 ADD PARTITION PN VALUES (DEFAULT);

哈希分区

存数据非常快,取数据慢,数据平均分配各个子分区。
如果 hash 分区不指定分区表名,那就通过指定哈希的分区数来创建,分区表名统一使用 DMHASHPART+分区号(从 0 开始)作为分区名。
分区是在列值上使用散列算法,以确定将行放入哪个分区中。当列的值没有合适的条件时,建议使用散列分区。散列分区为通过指定分区编号来均匀分布数据的一种分区类型,因为通过在 I/O 设备上进行散列分区,使得这些分区大小一致。建议分区的数量采用 2 的 n 次方,这样可以使得各个分区间数据分布更加均匀。

CREATE TABLE TEST.T5(ID INT) PARTITION BY HASH (ID)
PARTITIONS 5;

插入数据:

BEGIN
FOR I IN 1..100000 LOOP
INSERT INTO TEST.t5 VALUES(I);
END LOOP;
COMMIT;
END;

组合分区

Range---list     range--hash     range-range     list-list     Hash-hash     list---range
DM 支持最多八层分区

List --range

create table test.t6(sales_id int,
saleman varchar(20),
saledate datetime,
city char(10))
partition by list(city)					------主分区
	subpartition by range(saledate)		------子分区
		subpartition template(			------子分区模板
		SUBPARTITION p11 values less than('2012-04-01'),
		SUBPARTITION p12 values less than('2013-04-01'),
		SUBPARTITION p13 values less than(maxvalue))
(partition p1 values('北京','天津','河北')
	(	subpartition s1 values less than ('2012-08-01'),		----自定义子分区
		subpartition s2 values less than('2013-08-01'),
		subpartition s3 values less than(maxvalue)),
PARTITION P2 VALUES('上海','南京','杭州'),
PARTITION P3 VALUES('武汉','长沙')
	(	subpartition s1 values less than ('2012-08-01'),		----自定义子分区
		subpartition s2 values less than('2013-08-01'),
		subpartition s3 values less than(maxvalue)),
PARTITION P4 VALUES ('广州','深圳'));

间隔分区-自增

间隔分区(interval partitioning)它就是以一个区间分区表为“起点”,并在定义中增加了一个规则(即间隔),使数据库知道将来如何增加分区。间隔分区关键字:numtoyminterval(年,月)。
Numtoyminterval(n,interval_unit)
N: 数据类型 interval_unit:year,month
实际上是范围分区的一个扩展。

SELECT SYSDATE+numtoyminterval(1,'YEAR') FROM DUAL;

SELECT SYSDATE+numtoyminterval(-1,'YEAR') FROM DUAL;

CREATE TABLE TEST.T_R8_INTERVAL_YEAR
(EMPLOYEE_ID NUMBER,
EMPLOYEE_NAME VARCHAR(20),
BIRTHDAY DATE)
PARTITION BY RANGE(BIRTHDAY)
INTERVAL(NUMTOYMINTERVAL(1,'YEAR')) -- 按年间隔分区函数
(PARTITION P1990 VALUES LESS THAN(TO_DATE('1991-01-01','YYYY-MM-DD')));

用了时间间隔函数做分区,在数据插入的时候,如果没有适合该数据分区,数据库会自动给你创建一个新的分区.

CREATE TABLE TEST.T_R8_INTERVAL_MONTH
(EMPLOYEE_ID NUMBER,
EMPLOYEE_NAME VARCHAR(20),
BIRTHDAY DATE)
PARTITION BY RANGE(BIRTHDAY)
INTERVAL(NUMTOYMINTERVAL(1,'MONTH')) -- 按月间隔分区函数
(PARTITION P1990 VALUES LESS THAN(TO_DATE('1991-01-01','YYYY-MM-DD')));

插入不属于分区时间段的数据,会自动创建分区:

INSERT INTO TEST.T_R8_INTERVAL_YEAR VALUES(1,'AAA','1993-03-01');

分区表维护

数据字典:DBA_TAB_PARTITIONS
1、增加分区

ALTER TABLE TEST01.T_R4 ADD PARTITION PN VALUES LESS THAN(MAXVALUE);

2、删除分区

ALTER TABLE TEST01.T_R4 DROP PARTITION PN;

3、合并分区

ALTER TABLE TEST01.T_R3 MERGE PARTITIONS P1,P2 INTO PARTITION P1_2;

4、拆分分区

ALTER TABLE TEST01.T_R3 SPLIT PARTITION P1_2 AT (100) INTO (PARTITION P1,PARTITION P2);

5、交换分区

ALTER TABLE TEST01.T_R1 EXCHANGE PARTITION P1 WITH TABLE TEST01.T4;

注意:交换时,会把普通表的数据全部交换过来,包括不属于这个分区的数据也会一起交换过来.所以在交换分区的时候,普通表的数据需要先整理好.

6、创建分区表,分区列必需包括主键列

CREATE TABLE TEST.T_R6(SID INT, ID INT ,
NAME VARCHAR(20),
CONSTRAINT T_R6_PRI PRIMARY KEY(ID))
PARTITION BY RANGE(ID)
(PARTITION P1 VALUES LESS THAN(100),
PARTITION P2 VALUES LESS THAN(200));

CREATE TABLE TEST.T_R6(SID INT, ID INT ,
NAME VARCHAR(20),
CONSTRAINT T_R6_PRI PRIMARY KEY(SID))
PARTITION BY RANGE(SID)
(PARTITION P1 VALUES LESS THAN(100),
PARTITION P2 VALUES LESS THAN(200));

7、如何把非分区表转换成分区表。
首先,将非分区表的数据导出,dexp parallel,remap_schema
其次,建一个结构一样的分区表。
最后,将数据导入到分区表中(dimp);

或者

create table ....partition .....

insert into 分区表 select * from 原表;

alter table 原表 rename to 原表_bak;

alter table 分区表 rename to 原表;

 

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值