达梦数据库新特性之DM7水平分区

时间:2020-05-18 11:18:21       来源:CSDN技术社区

1 概述

在大型的企业应用或企业级的数据库应用中,要处理的数据量通常可以达到TB级。为了提高数据库在大数据量读写操作和查询效率,达梦数据库DM7提供了对表和索引进行分区的技术,以改善大型应用系统的性能。

DM7提供了最常用的范围分区方法,包括范围、哈希和列表,企业可以使用合适的分区方法,如日期(范围)、区域(列表),对大量数据进行分区。由于DM7划分的分区是相互独立,并可以存储于不同的存储介质上,完全可满足企业高可用性、均衡IO、降低维护成本、提高查询性能的要求。

2 功能简介

达梦数据库DM7对表提供以下三种分区方式:

范围分区:范围分区就是对表中的某些列上值的范围进行分区,根据某个值的范围,决定将该数据存储在哪个分区上。

哈希分区:哈希分区是通过指定分区编号来均匀分布数据的一种分区类型,通过在I/O设备上进行散列分区,使得这些分区大小基本一致。

列表分区:列表分区是通过指定表中的某些列的离散值集,来确定应当存储在一起的数据。例如,可以对表上的status列的值在(‘A’,‘H’,‘O’)放在一个分区,值在(‘B’,‘I’,‘P’)放在另一个分区,以此类推。

例如,在员工表EMPLOYEE上建范围分区,其部门号DEPT_ID小于5在分区P1,5到9之间的在分区P2,

10到15之间在分区P3,那么部门id相近的员工信息就会存储在相同的分区中。

CREATETABLEEMPLOYEE(EMP_IDINT,EMP_NAMEVARCHAR(200),DEPT_IDINT)PARTITIONBYRANGE(DEPT_ID)(PARTITIONP1VALUESLESSTHAN(5),PARTITIONP2VALUESLESSTHAN(10),PARTITIONP3VALUESEQUORLESSTHAN(15));DM7采用子表方式创建分区表,如上述的EMPLOYEE表,是分区表的主表,而每一个分区,会以一个子表作为实体而存在。即每一个分区都是一个完整的表,命名为主表名_分区名,如EMPLOYEE表的分区P1对应子表为EMPLOYEE_P1,并且子表跟主表结构完全一致。在DM7水平分区中,主表本身不存储数据,所有数据只存储在子表中,从而实现不同分区的完全独立性。

除了新增分区表,DM7还支持对子分区的修改。对于所有类型的分区表,DM7支持新增和删除分区,这对大规模数据应用系统提供灵活的分区管理功能。对于范围分区,DM7提供相邻分区的合并和拆分的功能,有利于范围分区子表的规模控制。另外,DM7支持分区数据跟普通表数据交换功能(partition exchange),使得分区数据管理更加灵活。

3 DM7水平分区的优势

分区有利于管理非常大的表和索引,引入了分区键的概念,使数据可以根据某些列的范围值、哈希函数值或者特定值列表执行数据的聚集。使用达梦水平分区,可以大大提高数据的可用性以及查询性能。

3.1 提高可用性

由于每个分区具有一定的独立性,对象中一个分区的可用性并不影响其他分区,如果某个分区被损坏,其他分区仍是可用的。

例如,如果上文提到的员工表EMPLOYEE每个分区都存储在不同的磁盘上,而P2分区所在的磁盘介质发生损坏。假设整个员工表有30GB的数据,每个分区平均10GB,那么故障恢复时间就会降为原来的1/3。

另外,对于分区表,每一个分区都对应一个分区子表,DM7支持对分区子表的单独操作,其DML操作跟普通表一致。例如,加入员工表的P2分区损坏了,仍然可以查询P1分区上的数据,从而大大提高系统的可用性。

SELECT*FROMEMPLOYEEPARTITION(P1);

3.2 降低维护代价

由于每个分区都是一个独立的对象,可以单独处理,对大表的维护可转换为对小分区的维护,可以大大降低维护成本。

例如,一个销售系统中ORDERLINE表需要维护最近12个月的订单信息,超过12个月的订单需要迁移到该月的历史订单表中(销售系统每一个月的订单记录分别存储在各自的历史表中)。如果没使用水平分区,需要较多的删除和插入操作,并产生大量的redo和undo日志。如果使用分区表,并且按照月份做范围分区,那么可以使用交换分区来实现分区和普通表数据的交换。

假设需要删除的分区是O_P_L,对应的销售历史订单表是O_H_L,那么只需执行以下命令即可满足销售系统的需求。

--交换分区ALTERTABLEORDERLINEEXCHANGEPARTITIONO_P_LWITHTABLEO_H_L;--删除原分区ALTERTABLEORDERLINEDROPPARTITIONO_P_L;通过交换分区实现分区O_P_L和表O_H_L的数据交换,采用数据字典信息交换的技术,几乎不涉及IO操作,因此效率非常高。

3.3 提高查询性能

通过水平分区,原主表的数据会根据分区键形成新的聚集,达梦优化器可以根据查询条件确定所需访问的分区(分区消除),减少很多不必要的分区访问,大大降低扫描的IO量,从而提高性能。

另外,在一个服务器上安装更多的CPU以及CPU的多核化已经是一个趋势。DM7逐渐跟上了硬件发展的步伐,针对水平分区,利用多CPU的特性,提供并行查询。

当一个查询涉及多个分区扫描时,由于各个分区的扫描是相互独立的,DM7对每个分区启动并行执行的扫描方式。即结合系统的一些运行参数和需要扫描的子表数目,生成适当的扫描子任务放入任务队列进行并发处理。通过对水平分区表的并行查询,可以大大提升查询效率。

4 结论

随着Internet的发展,数据库应用的大小和规模都在增长,这将导致越来越多庞大的数据集合,那么对数据进行分区显得越来越重要。DM7提供了最常用的三种水平分区机制,包括范围分区,哈希分区和列表分区,可以将大量数据划分为相互独立的小分区,满足大部分的应用需求。使用DM7水平分区,结合并行查询和分区消除,可以大大提升查询性能,并且由于分区的独立性,数据库的可用性可得到大幅度提升,并能降低维护代价,适用于大型数据仓库和事务处理应用系统。

关键词: 达梦数据库 dm分区