DM8达梦数据库:达梦数据库分区表

DM8达梦数据库:达梦数据库分区表,第1张

DM8达梦数据库:达梦数据库分区表 达梦数据库-二级分区表

创建一个产品销售记录表 sales,记录产品的销量情况。由于产品只在几个固定
的城市销售,所以可以按照销售城市区号对该表进行 LIST 分区。再按照年份RANGE范围分区

示例没创建对应的表空间,默认存到MAIN表空间(正式环境不可默认)

CREATE TABLE "SYSDBA"."SALES_NEW"
(
"SALES_ID" INT,
"SALEMAN" CHAR(20),
"SALEDATE" DATETIME(6),
"CITY" CHAR(10))
PARTITION BY LIST("CITY")
SUBPARTITION BY RANGE("SALEDATE") SUBPARTITION TEMPLATE
(
SUBPARTITION  "P2021"  VALUES LESS THAN(DATETIME'2022-01-01 00:00:00'),
SUBPARTITION  "P2022"  VALUES LESS THAN(DATETIME'2023-01-01 00:00:00'),
SUBPARTITION  "P2023"  VALUES LESS THAN(DATETIME'2024-01-01 00:00:00'),
SUBPARTITION  "P2024"  VALUES LESS THAN(DATETIME'2025-01-01 00:00:00'),
SUBPARTITION  "P2025"  VALUES LESS THAN(DATETIME'2026-01-01 00:00:00'),
SUBPARTITION  "P2026"  VALUES LESS THAN(DATETIME'2027-01-01 00:00:00'),
SUBPARTITION  "P2027"  VALUES LESS THAN(DATETIME'2028-01-01 00:00:00'),
SUBPARTITION  "P2028"  VALUES LESS THAN(DATETIME'2029-01-01 00:00:00'),
SUBPARTITION  "P2029"  VALUES LESS THAN(DATETIME'2030-01-01 00:00:00'),
SUBPARTITION  "P2030"  VALUES LESS THAN(DATETIME'2031-01-01 00:00:00'),
SUBPARTITION  "P2099"  VALUES EQU OR LESS THAN(MAXVALUE)
)
(
PARTITION  "P0310"  VALUES('0310')   STORAGE(ON "MAIN", CLUSTERBTR) ,
PARTITION  "P0311"  VALUES('0311')   STORAGE(ON "MAIN", CLUSTERBTR) ,
PARTITION  "P0312"  VALUES('0312')   STORAGE(ON "MAIN", CLUSTERBTR) ,
PARTITION  "P0313"  VALUES('0313')   STORAGE(ON "MAIN", CLUSTERBTR) ,
PARTITION  "P0314"  VALUES('0314')   STORAGE(ON "MAIN", CLUSTERBTR) ,
PARTITION  "P0315"  VALUES('0315')   STORAGE(ON "MAIN", CLUSTERBTR) ,
PARTITION  "P0316"  VALUES('0316')   STORAGE(ON "MAIN", CLUSTERBTR) ,
PARTITION  "P0317"  VALUES('0317')   STORAGE(ON "MAIN", CLUSTERBTR) ,
PARTITION  "P0318"  VALUES('0318')   STORAGE(ON "MAIN", CLUSTERBTR) ,
PARTITION  "P0319"  VALUES('0319')   STORAGE(ON "MAIN", CLUSTERBTR) ,
PARTITION  "P0335"  VALUES('0335')   STORAGE(ON "MAIN", CLUSTERBTR) ,
PARTITION  "P9999"  VALUES(DEFAULT)   STORAGE(ON "MAIN", CLUSTERBTR) 
) STORAGE(ON "MAIN", CLUSTERBTR) ;

二级分区表manager管理工具如图:
二级分区表逻辑图:

介绍:
达梦数据库:达梦数据库分区表总结
参考:DM8_SQL语言使用手册.pdf
第 3 章 数据定义语句
3.6.1.4 定义 水平分区表
水平分区包括范围分区、哈希分区和列表分区三种。水平分区表的创建需要通过
指定。
范围(RANGE)分区,按照分区列的数据范围,确定实际数据存放位置的划分方式。
列表(LIST)分区,通过指定表中的某一个列的离散值集,来确定应当存储在一起的数据。范围分区是按照某个列上的数据范围进行分区的,如果某个列上的数据无法通过划分范围的方法进行分区,并且该列上的数据是相对固定的一些值,可以考虑使用 LIST 分区。
一般来说,对于数字型或者日期型的数据,适合采用范围分区的方法;而对于字符型数据,取值比较固定的,则适合于采用 LIST 分区的方法。
哈希(HASH)分区,对分区列值进行 HASH 运算后,确定实际数据存放位置的划分方式,主要用来确保数据在预先确定数目的分区中平均分布,允许只建立一个 HASH 分区。在很多情况下,用户无法预测某个列上的数据变化范围,因而无法实现创建固定数量的范围分区或 LIST 分区。在这种情况下,DM 哈希分区提供了一种在指定数量的分区中均等地划分数据的方法, 基于分区键的散列值(HASH 值)将行映射到分区中。当用户向表中写入数据时,数据库服务器将根据一个哈希函数对数据进行计算,把数据均匀地分布在各个分区中。
在哈希分区中,用户无法预测数据将被写入哪个分区中。
在很多情况下,经过一次分区并不能精确地对数据进行分类,这时需要多级分区表。在进行多级分区的时候,三种分区类型还可以交叉使用。
LIST 分区表使用说明:

  1. LIST 分区支持 DEFAULT 关键字的使用,所有不满足分区条件的数据,都划分为 DEFAULT 的分区,但 DEFAULT 关键字需要用户指定,系统不会自动创建 DEFAULT 分区。
  2. LIST 分区范围值不能为 NULL。
  3. LIST 分区子表范围值个数与数据页大小和相关系统表列长度相关,存在以下
    限制:
    a) 4K 页,单个子表最多支持 120 个范围值。
    b) 8K 页,单个子表最多支持 254 个范围值。
    c) 16K 或 32K 页,单个子表最多支持 270 个范围值。
  1. 范围分区和哈希分区的分区键可以多个,最多不超过 16 列;LIST 分区的分区键必须唯一;
  2. 范围分区表使用说明:
  1. 范围分区支持 MAXVALUE 值的使用,MAXVALUE 代表一个比任何值都大的值。MAXVALUE 值需要用户指定才能使用,作为分区中的最大值。
  2. 范围分区的范围值表达式类型应与分区列类型一致,否则按分区列类型进行类型转换。
  3. 对于范围分区,增加分区必须在最后一个分区范围值的后面添加,要想在表的开始范围或中间增加分区,应使用 SPLIT PARTITION 语句。

表中的每个分区都可以通过“PARTITION”子句指定一个名称。并且每一个分区都有一个范围,通过“VALUES LESS THAN”子句可以指定上界,而它的下界是前一个分区的上界。如分区 p2 的 time 字段取值范围是[‘2018-04-01’, ‘2018-07-01’)。如果通过“VALUES EQU OR LESS THAN”指定上界,即该分区包含上界值

达梦数据库- 一级分区表:

例 1 创建一个范围分区表 callinfo,用来记录用户 2018 年的电话通讯信息,包括
主叫号码、被叫号码、通话时间和时长,并且根据季度进行分区。

CREATE TABLE callinfo(
caller CHAR(15),
callee CHAR(15),
time  DATETIME,
duration  INT
)
PARTITION BY RANGE(time)(
PARTITION p1 VALUES LESS THAN ('2018-04-01'),
PARTITION p2 VALUES LESS THAN ('2018-07-01'),
PARTITION p3 VALUES LESS THAN ('2018-10-01'),
PARTITION p4 VALUES EQU OR LESS THAN ('2018-12-31'));
--'2018-12-31'也可替换为 MAXVALUE

表中的每个分区都可以通过“PARTITION”子句指定一个名称。并且每一个分区都有一个范围,通过“VALUES LESS THAN”子句可以指定上界,而它的下界是前一个分区的上界。如分区 p2 的 time 字段取值范围是[‘2018-04-01’, ‘2018-07-01’)。如果通过“VALUES EQU OR LESS THAN”指定上界,即该分区包含上界值,如分区 p4 的 time字段取值范围是[‘2018-10-01’, ‘2018-12-31’]。另外,可以对每一个分区指定STORAGE 子句,不同分区可存储在不同表空间中。

例 2 创建多列分区。创建一个范围分区表 callinfo,以 time,duration 两列为
分区列。

CREATE TABLE callinfo(
caller CHAR(15),
callee CHAR(15),
time  DATETIME,
duration  INT
)
PARTITION BY RANGE(time, duration)( 
PARTITION p1 VALUES LESS THAN ('2018-04-01',10),
PARTITION p2 VALUES LESS THAN ('2018-07-01',20),
PARTITION p3 VALUES LESS THAN ('2018-10-01',30),
PARTITION p4 VALUES EQU OR LESS THAN ('2018-12-31', 40) );
insert into CALLINFO values('CHERRY','JACK','2018-12-31',40);
insert into CALLINFO values('CHERRY','JACK','2018-12-31',41); --报错:没有找到合适的分区

如果分区表包含多个分区列,采用多列比较方式定位匹配分区。首先,比较第一个分区列值,如果第一列值在范围之内,就以第一列为依据进行分区;如果第一列值处于边界值,那么需要比较第二列的值,根据第二列为依据进行分区;如果第二列的值也处于边界值,需要继续比较后续分区列值,以此类推,直到确定目标分区为止。匹配过程参看下表。
例 3 查询分区子表,直接使用子表名称进行查询。
当在分区表中执行 DML *** 作时,实际上是在各个分区子表上透明地修改数据。当执行SELECt 命令时,可以指定查询某个分区上的数据。
例如,查询 callinfo 表中分区 p1 的数据,可以通过以下方式:
SELECT * FROM callinfo PARTITION (p1);
例 4 创建一个产品销售记录表 sales,记录产品的销量情况。由于产品只在几个固定
的城市销售,所以可以按照销售城市对该表进行 LIST 分区。

CREATE TABLE sales(
sales_id  INT,
saleman CHAR(20),
saledate  DATETIME,
city  CHAR(10)
)
PARTITION BY LIST(city)( 
PARTITION p1 VALUES ('北京', '天津'),
PARTITION p2 VALUES ('上海', '南京', '杭州'),
PARTITION p3 VALUES ('武汉', '长沙'),
PARTITION p4 VALUES ('广州', '深圳'),
PARTITION p5 VALUES (default)
);

例 5 如果销售城市不是相对固定的,而是遍布全国各地,这时很难对表进行 LIST 分
区。如果为该表进行哈希分区,可以很好地解决这个问题。

CREATE TABLE sales01(
sales_id  INT,
saleman CHAR(20),
saledate  DATETIME,
city  CHAR(10)
)
PARTITION BY HASH(city)( 
PARTITION p1,
PARTITION p2,
PARTITION p3,
PARTITION p4
);

如果不指定分区表名,还可以通过指定哈希分区个数来建立哈希分区表。

CREATE TABLE sales02(
sales_id  INT,
saleman CHAR(20),
saledate  DATETIME,
city  CHAR(10)
)
PARTITION BY HASH(city)
PARTITIONS 4 STORE IN (ts1, ts2, ts3, ts4);
达梦数据库- 三级分区表:

例 7 创建一个三级分区,更多级别的分区表的建表语句按照语法类推。

CREATE TABLE STUDENT(
NAME VARCHAR(20),
AGE INT,
SEX VARCHAR(10) CHECK (SEX IN ('MAN','FEMAN')),
GRADE INT CHECK (GRADE IN (7,8,9))
)
PARTITION BY LIST(GRADE)
SUBPARTITION BY LIST(SEX) SUBPARTITION TEMPLATE
(
SUBPARTITION Q1 VALUES('MAN'),
SUBPARTITION Q2 VALUES('FEMAN')
),
SUBPARTITION BY RANGE(AGE) SUBPARTITION TEMPLATE
(
SUBPARTITION R1 VALUES LESS THAN (12),
SUBPARTITION R2 VALUES LESS THAN (15),
SUBPARTITION R3 VALUES LESS THAN (MAXVALUE)
)
(
PARTITION P1 VALUES (7),
PARTITION P2 VALUES (8),
PARTITION P3 VALUES (9)
);

本例子中各分区表的表名详细介绍如下:

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/4684308.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-07
下一篇 2022-11-07

发表评论

登录后才能评论

评论列表(0条)

保存