数据库在大型企业及企业级应用中,面临着越来越多的挑战,尤其是随着数据量的不断增长,大规模数据管理成为摆在企业及其数据库管理人员面前的最大难题。企业中的数据量越来越大、类型越来越多且实时性越来越强,即所谓的大数据的3V特性(Volume、Variety、Velocity)。数据库每天需要处理大量数据,这些数据可以达到几十或几百GB,甚至可以达到TB或PB级别,企业的经营决策又向数据库提出了实时处理的要求。因此如何能够快速、实时的处理大规模的数据成为解决企业数据库难题的关键。

  现阶段,存储介质和数据处理技术发展迅速,涌现了大批新技术,但这些仍不能满足企业数据快速增长的需求。为了加快企业数据读写操作和查询操作的速度,数据库分区技术应运而生。数据库分区是一种物理数据库设计技术,是将一个或多个数据库表分布在两台以及多台物理或者逻辑机器上,通过并行的方式对分布在多台机器上的数据库表进行处理,从而实现对数据的快速处理。数据库分区的主要目的是为了在特定的SQL操作中减少数据读写的总量以缩减响应时间。

IBM DB2关键特性解析:DB2分区特性

▲数据库分区架构的三种类型

  通过数据库分区技术可以提高对大容量数据的访问速度,对数据进行并行读取,并且数据库分区技术在一定程度上具有可扩展性。从架构上来看,数据库分区可划分为三种典型的架构:共享内存(Shared Memory)模式,共享磁盘(Shared Disk)模式以及无共享(Shared Nothing)模式。本文将重点介绍无共享模式的DB2数据库的分区特性,以及DB2与Oracle数据库分区特性的比较。

  DB2数据库分区特性——DPF

  DB2的企业版提供的数据库分区功能,即DPF(Data Partitioning feature),这一功能主要用来为大规模数据处理提供支持。DB2数据库分区采用Share-nothing体系结构,数据库在一个非共享的环境中被分解为独立的分区,每个分区都具有自己的资源,例如内存、CPU和磁盘以及自己的数据、索引、配置文件和事务日志。数据库分区有时称为节点或数据库节点,每个节点具有独立处理单一任务的能力,每个子任务处理一部分数据,分区间数据通过高速网络进行交互。

  DB2 DPF的扩展性较好,通过增加节点资源即可线性扩展节点。简单来说,它相当于将一个大的数据库分成多个小的数据库,而每一个小数据库分区拥有自己的一部分数据,同时达到节点同时并发的高效率处理能力。DPF是一种跨多个彼此合作的实例,以建立单个大型数据库服务器的技术。这些实例既可以位于一个服务器中,也可以跨多个物理机器。

IBM DB2关键特性解析:DB2分区特性

▲DB2 DPF体系架构图

  DB2 DPF是基于并行性的体系架构,这里的并行包括在节点之间的并行,以及在节点之内分区的并行;查询语句之间的并行,以及查询语句内部的并行等。在性能方面,采取分而治之的策略,没有限制的规模。在编译器方面,采用基于开销的优化器和查询重写器,SQL和实用工具完全平行运行。除此之外,DPF还根据负载动态分流,同时支持异步I/O和平行I/O等。

 

  DB2 DPF及其他分区特性的比较

  IBM DB2的分区特性包括表分区(Table Partition)、多维聚类(MDC)和数据库分区特性(DPF)。具体对比如下表:

CREATE TABLE 语句中的子句
 DB2 特性名称
 
DISTRIBUTE BY HASH
 DPF —— 数据库分区特性
 
ORGANIZE BY DIMENSION
 MDC —— 多维聚类
 
PARTITION BY RANGE
 TP —— 表分区
 


  ▲DB2表设计特性——CREATE table 语句对比

DB2 特性名称
 一部分的名称
 用于分区数据的列
 其他术语
 
数据分区特性(Data Partitioning Feature,DPF)
 数据库分区
 分布键(distribution key)
 在之前的版本中,分布键被称作分区键
 
多维聚类(Multidimensional Clustering,MDC)
 单元格,由一些块组成
 维
 块索引
 
表分区(TP)
 数据分区
 表分区键
  


  ▲DB2表设计特性——相关术语

特性
 特性如何组织数据
 优点
 
DPF
 将行均匀地分布在多个数据库分区上
 可伸缩性 —— 随着数据库的增长增加计算资源(也就是数据库分区)
 
MDC
 将在多维上具有近似值的行放在表中相同的物理位置,即所谓的块
 查询性能 —— 组织数据的方式有利于获得更快的检索速度,对于由多个谓词指定范围的查询尤其有效
 
TP
 将所有行放在同一个数据分区的一个指定范围的维中
 数据移动 —— 通过添加和删除整个数据分区,可以增加和删除大量数据
 


▲DB2表设计特性——简要对比

特性
 适合的表特征
 事实表的特征
 
DPF
 大型表 —— 大到无法仅依靠单独一组 CPU 和 I/O 通道来处理
 事实表是最大的数据库表。它们常常包含数亿行数据,有时候甚至包含数千亿行数据
 
MDC
 结果集返回在多个维上具有近似值的行的查询
 事实表(以及通常所说的数据仓库)是为支持这种类型的查询而设计的
 
TP
 这种类型的表:周期性地添加大量数据,然后在数据到期后又删除大量数据
 在事实表中,常常是每天都添加新数据。通常每月或每个季度删除过时的数据
 


  ▲DB2表设计特性——事实表特征

分区特性设计决定
 经验法则
 
DPF —— 用作分布键的列
 首选是具有很多不同值的列
 
MDC —— 用作 MDC 维的列
 一种典型的设计是选择一个表示日期的列,再加上 0 到 3 个其他列,例如 region 和 product_type
 
TP —— 用作表分区键的列和分区的数量
 选择一个基于时间的列。定义与每次转出的数据量相符的分区
 


  ▲DB2表设计特性——经验法则总结

  DPF 是最老的特性,通过它可以将数据库分成多个数据库分区。每个数据库分区有它自己的一组计算资源,包括CPU和存储。MDC是在DB2 Version 8中引入的,通过它可以在物理上将在多维上具有类似值的行聚合在一起放在磁盘上。这种聚合能为常见分析性查询提供高效的I/O,提高检索数据的效率。TP是在DB2 9中引入的,与MDC类似,它也可以将具有近似值的行存储在一起。TP 不同于其他特性的优势在于为表添加或删除大量数据这个方面,即转入和转出。

  数据库分区、表分区和MDC能同时应用在一个设计中。要部署大型应用程序,最好在同一个数据库设计中实现数据库分区、表分区和MDC,以满足应用的多样化需求。可以应用数据库分区获得扩展性,并确保在逻辑分区之间均匀分布数据;表分区可以方便查询分区消除和数据转出;MDC可以用来提高查询性能和方便转入数据。

 

  DB2分区特性与Oracle的比较

  DB2和Oracle所支持的分区特性既有相似之处,也有一定区别。除了Oracle不支持的MDC以外,其他功能类似,只是语法上有所区别。具体对比如下表:

Oracle分区
 DB2分区
 Oracle 10g语法
 DB2 V9语法
 
区间分区

(Range Partitioning)
 表分区

(Table Partitioning)
 PARTITION BY

RANGE
 PARTITION BY

RANGE
 
哈希分区

(Hash Partitioning)
 数据库分区

(Database Partitioning)
 PARTITION BY

HASH
 DISTRIBUTE BY

HASH
 
列表分区

(List Partitioning)
 带生成列表分区

(Table Partitioning

With Generated Column)
 PARTITION BY

LIST
 PARTITION BY

RANGE
 
不支持
 多维集群

(Multidimensional

clustering)
 无
 ORGANIZE BY

DIMENSION
 

  ▲DB2分区特性与Oracle的比较

  以数据库分区为例,DB2的数据库分区特性采用Share-nothing架构,这种架构允许多个数据库分区在一起并行工作来处理工作负载。在Oracle中,使用Share-disk架构。那么这两种架构有何区别呢?Share-nothing是指每个CPU都有私有内存区域和私有磁盘空间,而且两个CPU不能访问相同磁盘空间,CPU之间的通讯通过网络连接。而Share-disk是每个CPU使用自己的私有内存区域,通过内部通讯机制直接访问所有磁盘系统。这是DB2可以增加物理的partition来给数据库扩容的原因,也是DB2与Oracle分区的最大区别。

IBM DB2关键特性解析:DB2分区特性

▲Share-nothing与Share-disk架构的对比

  如下所示,是DB2中创建数据库分区表partition_table的语句,其中选择partition_date字段作为分区键:

  CREATE TABLE partition_table

  (partition_date date NOT NULL,

  partition_data VARCHAR(20) NOT NULL

  )

  IN tbsp_parts

  DISTRIBUTE BY HASH (partition_date);
  Oracle也支持数据库分区特性,语法不同也略有。如下所示,使用PARTITION BY HASH来建立数据库分区:

  CREATE TABLE hash_table

  (

  hash_part date,

  hash_data varchar2(20)

  )

  PARTITION BY HASH(hash_part)

  (partition p1 tablespace tbsp1,

  partition p2 tablespace tbsp2

  );
  该语句表示创建了hash_table表,此表按照hash_part字段进行哈希分区,每个分区以循环的方式放置在表空间tbsp1和tbsp2中。

  总结

  本文介绍了IBM DB2数据库的分区特性:数据库分区(DPF)、多维聚类(MDC)和表分区(Table Partition),及其内部的区别与联系,以及DB2分区特性与Oracle等价功能之间的对比。相信通过本文读者能够对DB2分区特性有更深入的认识。