暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 分区表1 - Partition Table

数据库DBA 2021-04-13
458

提示:公众号代码会自动换行,建议横屏阅读或左右滑动代码观看


分区表是将大表的数据分成称为分区的许多小的子集,划分依据主要是根据内部表的属性,同时分区表可以创建其独特的分区索引。随着表的不断增大,对数据库进行DML操作后的维护也更加困难。对于数据库中的超大型表,可以通过把它的数据分成若干个小表,从而简化数据库的管理活动,对于每一个简化后的小表,我们称为一个单个的分区。对于分区的访问,我们不需要使用特殊的SQL查询语句或特定的DML语句,而且可以单独的操作单个分区,而不是整张表。


同时可以将不同分区的数据放置到不同的表空间,比如将不同地区的数据,放在不同的表空间,18年的销售数据存放到18年,19年的销售数据存放到19,依次类推,从而实现了分散存储,这将大大的简化大容量表的管理,提高查询性能及IO并发等。


对于外部应用程序来说,虽然存在不同的分区,且数据位于不同的表空间,但逻辑上仍然是一张表。Oracle提供了分区技术以支持 VLDB(Very Large DataBase)。分区表通过对分区列的判断,把分区列不同的记录,放到不同的分区中。


分区完全对应用透明。Oracle的分区表可以包括多个分区,每个分区都是一个独立的段(SEGMENT),可以存放到不同的表空间中。查询时可以通过查询表来访问各个分区中的数据,也可以通过在查询时直接指定分区的方法来进行查询。  


那么在什么情况下需要考虑建立分区表呢?有两种情况:当表持续增长超过2G后应该考虑转换成分区表。另外,如果是历史数据表,那么应该建成分区表,分区存放当前数据和历史数据,并且当前数据是可更新的,而历史数据是only read状态。当然分区表也不能无限制的创建下去,10g中目前支持1024K-1个分区表。


分区表的相同的和不同点条件:

共性:不同分区之间必须有相同的逻辑属性,比如表名,列名,数据类型,约束等,

个性:各个分区可以有不同的物理属性,比如:pctfree,pctused tablespaces等

分区独立性:即使某些分区不可用,其他分区仍然可用。


分区表的优点:

1.提高查询性能:只需要搜索特定分区,而非整张表,提高了查询速度。

2.节约维护时间:单个分区的数据装载,索引重建,备份,维护远远小于整张表的维护时间。

3.节约维护成本:可以单独备份和恢复每个分区。

4.均衡IO:将不同的分区映射到不同的磁盘以平衡IO,提高并发。

5.由于将数据分散到各个分区中,减少了数据损坏的可能性。 

6.提高可管理性、可用性和性能。  

 

在10g中支持5种分区类型:

(1)范围分区(rangepartition)

(2)哈希分区(hashpartition)

(3)列表分区(listpartition)

(4)范围-哈希复合分区(range-hashpartition)

(5)范围-列表复合分区(range-listpartition)





Range Partition: 


Range分区是应用范围比较广的表分区方式,它是以列的值的范围来做为分区的划分条件,将记录存放到列值所在的 range分区中,行映射到基于列值范围的分区。如按照时间划分,2019年1月的数据放到 a分区,2月的数据放到b分区,在创建的时候,需要指定基于的列,以及分区的范围值。在按时间分区时,如果某些记录暂无法预测范围,可以创建 maxvalue分区,所有不在指定范围内的记录都会被存储到maxvalue所在分区中。


创建范围分区时,必须指定一下内容:

1.分区方法:range partition

2.分区列:标识分区边界的分区描述

 

使用range分区的时候,要记住几条规则:

1.每个分期都包含values less than字名,定义了分区的上层边界。任何等于和大于分区键值的二进制值都被添加到下一个高层分区中。

2.所有分区,除了第一个,如果低于values less than所定义的下层边界,都放在前面的分区中。


例子:

CREATE TABLE WNAG_PARTITION(
W_ID NUMBER NOT NULL ENABLE,
W_TIME DATE NOT NULL
)
PARTITION BY RANGE (W_TIME)
(
PARTITION P1 VALUES LESS THAN (TO_DATE('2019-01-1''yyyy-mm-dd'))
TABLESPACE SKY_WANG_DATA ,
PARTITION P2 VALUES LESS THAN (TO_DATE('2019-02-1''yyyy-mm-dd'))
TABLESPACE SKY_WANG_DATA ,
PARTITION P3 VALUES LESS THAN (TO_DATE('2019-03-1''yyyy-mm-dd'))
TABLESPACE SKY_WANG_DATA ,
PARTITION P4 VALUES LESS THAN (MAXVALUE)
TABLESPACE SKY_WANG_DATA );


如何查询分区表是否是范围分区?

SELECT /*+PARALLEL(5)*/
 *
  FROM DBA_PART_TABLES
 WHERE TABLE_NAME = 'WNAG_PARTITION';



Hash Partition:  


对于那些无法有效划分范围的表,可以使用 hash 分区,因为语法比较简单,很容易实现,这样对于提高性能还是会有一定的帮助。hash 分区会将表中的数据平均分配到你指定的几个分区中,列所在分区是依据分区列的 hash 值自动分配,因此你并不能控制也不知道哪条记录会被放到哪个分区中,hash 分区也可以支持多个依赖列。

 

在下面这种情况下,使用hash分区比range分区更好:

1.实现不知道需要将多少数据映射到给定的范围的时候,分区的范围大小很难确定,或者很难平衡的时候,range分区使数据得到不希望的聚集时。

2.性能特性,如并行DML、分区剪枝和分区连接很重要的时候。

 

创建散列分区时,必须指定一下信息。

1.分区方法:hash

2.分区列:分区数量或单独的分区描述

3.分裂、删除和合并分区不能应用于hash分区,但是,hash分区能够合并和添加

 

例子:


CREATE TABLE WANG_TEST   
(   
TRANSACTION_NO NUMBER(12)RIMARY KEY,   
TRANSACTION_ITEM NUMBER(8NOT NULL 
)   
PARTITION BY HASH(TRANSACTION_NO)   
(   
PARTITION P01 TABLESPACE TABLESPACE01,   
PARTITION P02 TABLESPACE TABLESPACE02,   
PARTITION P03 TABLESPACE TABLESPACE03   
);


Hash partition一般使用的场景,是分区的热点块:


第一:解决高并发,热点块问题,为什么可以解决高并发,热点块呢?

由于分区在物理上是独立分开的,也就说不同的分区肯定不同一个数据块,这样当你插入数据的时候,由于插入到不同的分区,也就是出入到了不同的数据块。

第二:解决索引高度问题,离散数据

 

List Partition:  


List 分区也需要指定列的值,其分区值必须明确指定,该分区列只能有一个,不能像range或者hash 分区那样同时指定多个列做为分区依赖列,但它的单个分区对应值可以是多个。  


在分区时必须确定分区列可能存在的值,一旦插入的列值不在分区范围内,则插入/更新就会失败,因此通常建议使用list 分区时,要创建一个 default 分区存储那些不在指定范围内的记录,类似range 分区中的 maxvalue分区。在根据某字段,如邮政编码分区时,可以指定 default,把非分区规则的数据,全部放到这个default 分区。


List分区可以控制如何将行映射到分区中去。可以在每个分区的键上定义离散的值,不同于range分区和hash分区。range分区与分区相关联,为分区列假设了一个值的自然范围,故不可能将该值范围以外的分区组织到一起。hash分区时不允许对数据的划分进行控制,因为系统使用的是散列函数来划分数据的。


List分区的优点在于按照自然的分区方式将无序和不相关的数据集合分组。List分区不支持多列分区,如果将表按列分区,那么分区键就只能有表的一个单独列组成。

 

list分区时必须指定的以下内容:

1.分区方法:list

2.分区列:分区描述,每个描述指定一串文字值(值的列表),它们是分区列(它们限定将被包括在分区中的行)的离散值。


例子:

CREATE TABLE WANG_CODE (
TAX_ID VARCHAR2(15NOT NULL
TAX_CODE VARCHAR2(12
)
PARTITION BY LIST (TAX_CODE)
(PARTITION T_LIST025 VALUES ('025'),
PARTITION T_LIST372 VALUES ('372'),
PARTITION T_LIST510 VALUES ('510'),
PARTITION P_OTHER VALUES (DEFAULT)
);


删除分区

ALTER TABLE WANG_PARTITION DROP PARTITION P1;


截断一个分区表中的一个分区的数据,这种方式会使全局分区索引无效

ALTER TABLE WANG_PARTITION TRUNCATE PARTITION P1;


这种方式全局分区索引不会失效

ALTER TABLE WANG_PARTITION TRUNCATE PARTITION P1 UPDATE INDEXES


组合分区:  


如果某表按照某列分区之后,仍然较大,或者是一些其它的需求,还可以通过分区内再建子分区的方式将分区再分区,即组合分区的方式。组合分区在 10g 中有两种:range-hash,range-list,根分区只能是range分区,子分区可以是 hash 分区或list 分区。在11g中,组合分区功能这块有所增强,又增加了range-range,list-range,

list-list,list-hash,并且 11g里面还支持 Interval分区和虚拟列分区。下一节我们将继续介绍分区表的相关操作。


扫描下方二维码关注公众号,了解相关更新

推荐阅读:

  1. Character

  2. Automatic Segment Space Management

  3. Memory Management

  4. Oracle锁

  5. 备份和恢复



最后修改时间:2021-04-14 09:09:01
文章转载自数据库DBA,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论