1、 概述
为提高数据库在大数据量读写操作和查询时的效率,达梦数据库提供了对表和索引进行分区的技术,把表和索引等数据库对象中的数据分割成小的单位,分别存放在一个个单独的段中,用户对表的访问转化为对较小段的访问,以改善大型应用系统的性能。
达梦提供了水平分区的方式,该方式包含了范围(range)、哈希(HASH)和列表(list)三种方法。

2、 分区的概念
分区是指将表、索引等数据库对象划分为较小的可管理片段的技术,每一个片段称为分区子表或分区索引。
一个表被分区后,对表的查询操作可以局限于某个分区进行,而不是整个表,这样可以大大提高查询速度。
达梦采用子表方式创建分区表,分区表作为分区主表,而每一个分区以一个子表实体存在,即每一个分区都是一个完整的表,一般命名为主表名_分区名。
在创建表的语法中,使用partition子句指定分区方式和分区列,以及分区的名字等信息,即可创建分区表

3、 分区的方法
(1) 范围(range)分区:对表中的某些列上值的范围进行分区,根据某个值的范围,决定将该数据存储在哪个分区上。
(2) 哈希(HASH)分区:通过指定分区编号来均匀分布数据的一种分区类型,通过在I/O设备上进行散列分区,使得这些分区大小基本一致。
(3) 列表(list)分区:通过指定表中的某个列的离散值集,来确定应当存储在一起的数据。
(4) 多级分区表:上述三种方式的任意组合。

4、 创建范围分区表
范围分区是按照某个列或几个列的值的范围来创建分区,当用户向表中写入数据时,数据库服务器将按照这些列上的值进行判断,将数据写入相应的分区中。在创建范围分区时,首先要指定分区列,即按照哪些列进行分区。
例如,创建一个表STUDENT,并进行分区:

CREATE TABLE STUDENT(
N_ID INT,
C_NAME CHAR(15),
N_AGE INT,
N_SCORE INT,
C_ADDRESS VARCHAR(30)
)
PARTITION BY RANGE (N_SCORE)(
PARTITION FALED VALUES LESS THAN ('45'),
PARTITION BAD VALUES LESS THAN ('60'),
PARTITION GOOD VALUES LESS THAN ('80'),
PARTITION EXCELLENT VALUES EQU OR LESS THAN (MAXVALUE)
);

该分区表的分区定义是:依据STUDENT表的N_SCORE列进行分区,将低于45的分为FALED分区,45~60的分为BAD分区,以此类推。

向表中插入数据如下:

达梦索引设置为不可见 达梦数据库建立索引_数据

指定查询该表中的某个分区的值,如:

达梦索引设置为不可见 达梦数据库建立索引_数据_02

5、 创建list分区表

范围分区是按照某个列上的数据范围进行分区的,如果某个列上的数据无法通过划分范围的方法进行分区,并且该列上的数据是相对固定的一些值,可以考虑使用list分区。

例如,创建一个SALES表,如下:

CREATE TABLE SALES(
SALER_ID INT NOT NULL,
SALER CHAR(20),
CITY CHAR(10)
)
PARTITION BY LIST(CITY)(
PARTITION SOUTH VALUES ('广州','深圳','厦门'),
PARTITION NORTH VALUES ('北京','天津','大连'),
PARTITION EAST VALUES ('南京','上海'),
PARTITION WEST VALUES ('成都','贵阳','重庆')
);

该分区的定义为:当插入表中的数据是分区其中的某个分区键时,该值就会与分区的定义进行对比,对比成功,便会插入该分区中。

注:分区的分区键必须唯一,否则会报如下错误信息

达梦索引设置为不可见 达梦数据库建立索引_数据_03

6、 创建HASH分区表

在很多情况下,用户无法预测某个列上的数据变化范围,因而无法实现创建固定数量的范围分区或LIST分区。

针对此,DM哈希分区提供了一种在指定数量的分区中均等地划分数据的方法,基于分区键的散列值将行映射到分区中。当用户向表中写入数据时,数据库服务器将根据一个哈希函数对数据进行计算,把数据均匀地分布在各个分区中。

例如,以SALES表为例,该表在list分区里面,仅是局限于几个固定城市,但是在实际中,城市是分布于全国的,并不固定,这个时候就能使用哈希分区来对表进行分区管理。

CREATE TABLE SALES_FOR_HASH(
SALER_ID INT NOT NULL,
SALER CHAR(20),
CITY CHAR(10)
)
PARTITION BY HASH(CITY)(
PARTITION P1,
PARTITION P2,
PARTITION P3,
PARTITION P4
);

查询表中指定分区的值,如下:

达梦索引设置为不可见 达梦数据库建立索引_数据_04

7、 创建多级分区表

在很多情况下,经过一次分区并不能精确地对数据进分类,这时需要多级分区表;DM支持最多八层多级分区

8、 维护水平分区表
(1) 增加分区

ALTER TABLE STUDENT ADD PARTITION P5 VALUES …

(2) 删除分区

ALTER TABLE STUDENT DROP PARTITION P5 ;

(3) 合并分区

ALTER TABLE STUDENT MERGE PARTITIONS P1,P2 INTO PARTISION P1_2;

(4) 拆分分区

ALTER TABLE STUDENT SPLIT PARTITION P1_2 AT (‘90’) INTO (PARTITION P1,PARTITION P2);