技术开发 频道

达梦数据库:DM7水平分区技术解析

  【IT168 专稿】海量数据处理是衡量数据库数据处理能力的重要指标。为了提高数据库对大数据量处理性能,DM7实现了水平分区技术,以满足企业级应用对大数据量处理的性能需求。

  概述

  水平分区是按照设定的边界值把数据行映射到不同的分区中。

  DM7支持三种水平分区方式,范围分区、哈希分区和列表分区,每种分区有各自的适用场景。技术人员可以根据系统数据分布特征和应用需求,选用合适的分区方式,设置每个分区的存储参数,达到均衡IO、降低维护成本和提高查询性能的要求。

  功能介绍

  下面分别对DM7支持的三种水平分区方式进行阐述。

  (1)范围分区

  范围分区按照分区列的范围值,把数据行映射到不同的分区,适用于数据行按照某种范围值分布。例如,产品销售表可以把日期列按月、季度或年划分,把同一时间段的数据集中存储,便于进行统计分析。

  例1:

  create table sales(id int, name varchar(50),sale_time date)

  partition
by range(sale_time)

  (partition p1
values equ or less than(‘2001-12-31’),

  partition p2
values equ or less than(‘2002-12-31’),

  partition p3
values equ or less than(‘2003-12-31’);

  例1中的范围分区表包含2个分区,其中P1分区的范围值<=(‘2001-12-31’);P2分区的范围值>(‘2001-12-31’) 并且<=(‘2002-12-31’);P3分区的范围值>(‘2002-12-31’) 并且<=(‘2003-12-31’)。

  (2) 哈希分区

  哈希分区按照分区列的哈希值来确定数据行映射到哪个分区,适用于数据分布没有规律,需要数据均匀分布的情况。通过在不同的I/O设备上进行散列分区,使得每个分区大小基本一致,达到均衡IO的目的。可以指定每个分区的名字,也可以直接指定数目来创建。

  例2:

     create table t2(c1 int,c2 int) partition by hash(c1)

  (partition p1, partition p2);

  例3:

     create table t3(c1 int,c2 int) partition by hash(c1) partitions 2;

  哈希分区支持例2和例3两种创建方式,均为创建2个子分区。

  (3) 列表分区

  列表分区按照分区列的离散值集,把数据行映射到不同的分区,适用于数据分布不连续,数据行在分区列的部分值集中分布。 例如,产品销售表可以把地区列作为分区列进行划分,在(‘北京’,‘上海’,‘天津’)直辖市作为一个分区,在(‘武汉’,‘西安’,‘成都’)省会城市作为一个分区,来统计产品在不同区域的销售情况。

  例4: 

     create table sales(id int,sale_counts int,city varchar(50)) partition by hash(city)

  (partition p1
values(‘上海’,’北京’,’天津’,’重庆’),

  Partition p2
values(‘武汉’,’西安’,’成都’,’南京’));

  例4创建的列表分区,包含2个子分区,其中city列数据为(‘上海’,’北京’,’天津’,’重庆’)的数据行存储在P1分区,city列数据为(‘武汉’,’西安’,’成都’,’南京’)的数据行存储在P2分区。

  除了对分区表的基本功能支持,DM7对分区表的ALTER操作也进行了扩展。见表1所示:

  表1 分区扩展功能表

 

增加分区

删除分区

合并分区

拆分分区

交换分区

范围分区

支持

支持

支持

支持

支持

列表分区

支持

支持

不支持

不支持

支持

哈希分区

不支持

不支持

不支持

不支持

不支持

  表1中的扩展功能描述为:

  增加分区:新增一个子分区;

  删除分区:删除一个现有分区;

  合并分区:合并相邻的两个分区,两个分区的数据保存到新分区中;

  拆分分区:把现有的一个分区分割为两个新分区,新分区的范围值不能与其他分区重复;

  交换分区:把一个子分区与一张同构的普通表进行数据交换,可快速实现分区数据的迁出。

  并行查询

  分区表的DML操作会包含一个或几个分区子表,分区子表之间相互独立,如果可以并行处理分区子表,对分区表的查询效率会有较大的提升。基于性能优化的考虑,DM7实现了水平分区的并行查询。DM7会根据服务器CPU数目、分区表涉及到的子分区数目以及分区的代价,来确定查询的并行度,无需用户干预即可实现并行查询,满足用户对大数据量数据查询的性能需求。此外,对于DBA等有经验用户,也支持通过参数来控制并行度。

  水平分区的优势

  (1) 提高可用性

  由于每个分区具有一定的独立性,如果某个分区损坏,其他分区仍是可用的。只要DML操作不涉及到损坏的分区,就不影响系统运行,可以在空闲时间对损坏分区进行修复。

  (2) 降低维护代价

  由于每个分区都是一个独立的对象,可以单独处理,对大表的维护可转换为对小分区的维护,可以大大降低维护成本。对单个子分区进行备份、恢复,对于大数据表,大大减少了数据备份恢复的时间,也更有针对性进行数据维护。

  (3) 提高查询性能

  当一个查询涉及多个分区扫描时,由于各个分区的扫描是相互独立的,DM7会启动并行执行的扫描方式。即结合系统的一些运行参数和需要扫描的子表数目,生成适当的扫描子任务放入任务队列进行并发处理。使得水平分区表并行查询性能有较大优势。根据测试结果,比普通表查询性能平均提升26%,比水平分区无并行平均有30%的性能提升。

  例如:在TPC-H标准测试中,以Q6为例,对lineitem表进行单表查询,有4个过滤条件。相同的测试环境下,普通表耗时996毫秒,水平分区表并行查询耗时420毫秒,水平分区表无并行查询耗时905毫秒。从测试结果得出,并行查询比普通表高出57.8%,比水平分区无并行查询高出53.6%。

  结论

  DM7支持范围、哈希、列表三种水平分区方式,可以满足实际应用对大数据表操作的性能需求,把数据分而治之的设计思想,使得水平分区表的管理和维护变得简单。在分区表的DML操作中,结合并行查询技术,可以大大提升操作性能。

0
相关文章