【摘要】 分区表在大型数据库特别是分布式数据库中占有重要地位,分区是一种“分而治之”的技术,为大量数据提供了可伸缩的性能,提高了对巨型数据库的读写和查询速度。本文主要研究了分布式数据库Oralce 中的List分区表和Range分区表的创建与应用,探讨了其切割和分区表的修改技术。从而可以类推分区表在其它数据库关系系统如大数据中Hive中的应用。
【关键字】 大型数据库Oracle list分区表 range 分区表 分区表的切割
一、引言
分区表应用在大型的分布数据库中,分区是一种“分而治之”的技术,通过将大表引分成可以管理的小块,从而避免了对每个表作为一个大的、单独的对象进行管理,为大量数据提供了可伸缩的性能,提高了巨型数据库的读写和查询速度。
分区表是将一个大的表分割成较小的片段(分区),在实际应用中,分区表的操作是在独立的分区上,但是对用户而言是透明的 [1][2] 。Oracle提供了分区技术以支持VLDB(Very Large DataBase)。分区表通过对分区列的判断,把分区列不同的记录,放到不同的分区中。分区完全对应用透明。Oracle的分区表可以包括多个分区,每个分区都是一个独立的段(SEGMENT),可以存放到不同的表空间中。查询时可以通过查询表来访问各个分区中的数据,也可以通过在查询时直接指定分区的方法来进行查询。
分区表的主要优点为:
(1)由于将数据分散到各个分区中,减少了数据损坏的可能性;(2)可以对单独的分区进行备份和恢复;(3)可以将分区映射到不同的物理磁盘上,来分散IO;(4)提高可管理性、可用性和性能。
什么时候需要分区表,官网给出了2个建议:
(1)Tables greater than 2GB should always be considered for partitioning.
(2)Tables containing historical data, in which new data is added into the newest partition. A typical example is a historical table where only the current months data is updatable and the other 11 months are read only.
二、分区表的创建和应用
Oracle 10g以上版本提供了以下几种分区类型:
(1)范围分区(range);(2)哈希分区(hash);(3)列表分区(list);(4)范围-哈希复合分区(range-hash);(5)范围-列表复合分区(range-list)。
这里以应用广泛的list分区和range分区为例说明分区表的应用。
2.1 list 分区表
List分区(列表分区): 通过列表方法(指定字符串值方法)进行分区。 List分区表需要考虑分区的依据,分区的名字,分区值(或者值的区域)每个分区所在的表空间。在分区时必须确定分区列可能存在的值,一旦插入的列值不在分区范围内,则插入/更新就会失败,因此通常建议使用list分区时,要创建一个default分区存储那些不在指定范围内的记录,类似range分区中的maxvalue分区。
create table part_book1
( bid number(4),
bookname VARCHAR2(20),
bookpress VARCHAR2(30),
booktime date)
partition by list(bookpress)
(partition part1 values(‘清华大学出版社) tablespace system,
partition part2 values(‘教育出版社) tablespace users); list分区表的插入同普通表,如下:
SQL> insert into part_book1 values(1,oralce,清华大学出版社,to_date(‘20110102,yyyymmdd));
SQL> insert into part_book1 values(2,音乐基础欣赏,教育出版社,to_date(‘20120102,yyyymmdd));
list分区表可以分区查询,如下:
SQL> select * from part_book1 partition(part1);
创建或修改分区时,可以指定default,把非分区规则的数据,全部放到这个default分区,如除了清华大学出版社, ‘教育出版社之外的出版社,放到分区表part_book1的part3分区中。
SQL> alter table part_book1 add partition part3 values(default) tablespace system;
与分区表相关的数据字典:dba_part_tables,dba_tab_ partitions等等。
2.2 range 分区表
Range 分区表是应用范围比较广的表分区方式[3][4],范围分区就是对数据表中的某个值的范围进行分区,根据某个值的范围,决定将该数据存储在哪个分区上。它是以列的值的范围来做为分区的划分条件,将记录存放到列值所在的range分区中。
比如按照时间划分,某大型企业的数据2015 年1 季度的数据放到a 分区,2015年2 季度的数据放到b分区,因此在创建的时候,需要指定基于的列,以及分区的范围值。若某些记录暂无法预测范围,可创建maxvalue 分区,所有不在指定范围内的记录会存储maxvalue 区。
建立range分区表分区表需要考虑分区的依据,分区的名字,分区值(或者值的区域)每个分区所在的表空间。values less than:后跟分区范围值(如果依赖列有多个,范围对应值也应是多个,中间以逗号分隔);
create table part_book
( bid number(4),
bookname VARCHAR2(20),
bookpress VARCHAR2(30),
booktime date)
partition by range(booktime)
(partition part1 values less than(to_ date(‘20100101,yyyymmdd)) tablespace system,
partition part2 values less than (to_ date(‘20120101,yyyymmdd)) tablespace users,
partition part3 values less than (MAXVALUE) tablespace users
);
insert into part_book values(1,oracle,清华大学出版社,to_date(‘20110102,yyyymmdd));
insert into part_book values(2,oracle,清华大学出版社,to_date(‘20090101,yyyymmdd));
Range 分区表用过一段时间之后,若需要增加新的分区,可以对range分区表进行切割[5]。Range 分区切割的位置为在分区表中间或者开始处或者带有maxvalue值的尾处增加分区。其语法格式如下:
ALTER TABLE 表名 SPLIT PARTITION 分区的名字 AT(值) INTO (PARTITION 新分区的名字1 ,PARTITION 新分区的名字2)
分区表的切割举例:将part3分区切割为两个新的分区,名字为part3、part4,分区的的依据值为20140101.
alter table part_book4
s p l i t p a r t i t i o n p a r t 3 a t ( t o _ date(‘20140101,yyyymmdd))
into(partition part3,partition part4);
Range 分区表的插入和查询操作同 list分区表,在这里不再赘述。 另外对于组合分区:如果某表按照某列分区之后,仍然较大,或者是一些其它的需求,还可以通过分区内再建子分区的方式将分区再分区,即组合分区的方式。
三、总结
分区表提高了大型、巨型数据库的读写和查询速度,为大量数据的存储、读取提供了可伸缩性能,本文主要研究了分布式数据库Oracle 中的List分区表和Range分区表的创建与应用,探讨了其切割和分区表的修改技术。
参 考 文 献
[1] 王立君.并行多媒体数据库中基于内容的高效检索的数据分配方法的研究. [J]科学技术与工程,2013.13(9),2544-2548
[2] 郭晋秦, 韩 焱. 大型数据库聚类中伪装危险数据识别方法研究. 计算机仿真 2015.433-436 32(11)
[3] 徐洪丽,王志军.认知策略与知识结构化的研究与应用-以大型数据库学习为例. 高教学刊. 2016.3 73-74.
[4] 李亚龙, 朱岩. 表分区在分界开关监控系统数据库的应用.2016(25)2: P235-237
[5] 史斌.大型数据库管理系统 Oracle 体系结构. 电脑编程技巧与维护. 2010.18:p72-74