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

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

1 创建分区表子表的表空间

--创建 13个数据表空间,每个表空间有3个数据文件,一个数据文件初始化为128M,每次扩展1024M,最大扩展到 409600M

DECLARE
    TBS_NAME VARCHAR :='TBS_DATA_';		--数据表空间名称
    --TBS_NAME VARCHAR :='TBS_INDEX_';	--索引表空间名称

    TBS_COUNT        INT :=13;	--表空间数量
    TBS_FILE_COUNT   INT :=3;	--表空间数据文件数量
    TBS_FILE_F       INT;
    
    TBS_EXTENT_BEGIN VARCHAR;
    TBS_EXTENT_TEMP  VARCHAR;
    TBS_EXTENT_TEMP2 VARCHAR;
    TBS_EXTENT_END   VARCHAR;
    TBS_EXTENT_ALL   VARCHAR;
BEGIN
    FOR I IN 1..TBS_COUNT 
    LOOP
        TBS_EXTENT_BEGIN :='create tablespace "'||TBS_NAME||I||'" datafile '''||TBS_NAME||I||'_FILE_1.DBF'' size 128 autoextend on next 1024 maxsize 409600';
        TBS_EXTENT_TEMP  :='';
        FOR TBS_FILE_F IN 2..TBS_FILE_COUNT 
        LOOP
            TBS_EXTENT_TEMP2    := ','''||TBS_NAME||I||'_FILE_'||TBS_FILE_F||'.DBF'' size 128 autoextend on next 1024 maxsize 409600';
            TBS_EXTENT_TEMP := TBS_EXTENT_TEMP||TBS_EXTENT_TEMP2;
        END LOOP;
        TBS_EXTENT_END := ' CACHE = NORMAL;';
        TBS_EXTENT_ALL :=TBS_EXTENT_BEGIN||TBS_EXTENT_TEMP||TBS_EXTENT_END;
        PRINT (TBS_EXTENT_ALL);
        EXECUTE IMMEDIATE TBS_EXTENT_ALL;
    END LOOP;
END;
-- 生成的创建表空间 SQL
/*
create tablespace "TBS_DATA_1" datafile 'TBS_DATA_1_FILE_1.DBF' size 128 autoextend on next 1024 maxsize 409600,'TBS_DATA_1_FILE_2.DBF' size 128 autoextend on next 1024 maxsize 409600,'TBS_DATA_1_FILE_3.DBF' size 128 autoextend on next 1024 maxsize 409600 CACHE = NORMAL;
create tablespace "TBS_DATA_2" datafile 'TBS_DATA_2_FILE_1.DBF' size 128 autoextend on next 1024 maxsize 409600,'TBS_DATA_2_FILE_2.DBF' size 128 autoextend on next 1024 maxsize 409600,'TBS_DATA_2_FILE_3.DBF' size 128 autoextend on next 1024 maxsize 409600 CACHE = NORMAL;
create tablespace "TBS_DATA_3" datafile 'TBS_DATA_3_FILE_1.DBF' size 128 autoextend on next 1024 maxsize 409600,'TBS_DATA_3_FILE_2.DBF' size 128 autoextend on next 1024 maxsize 409600,'TBS_DATA_3_FILE_3.DBF' size 128 autoextend on next 1024 maxsize 409600 CACHE = NORMAL;
create tablespace "TBS_DATA_4" datafile 'TBS_DATA_4_FILE_1.DBF' size 128 autoextend on next 1024 maxsize 409600,'TBS_DATA_4_FILE_2.DBF' size 128 autoextend on next 1024 maxsize 409600,'TBS_DATA_4_FILE_3.DBF' size 128 autoextend on next 1024 maxsize 409600 CACHE = NORMAL;
create tablespace "TBS_DATA_5" datafile 'TBS_DATA_5_FILE_1.DBF' size 128 autoextend on next 1024 maxsize 409600,'TBS_DATA_5_FILE_2.DBF' size 128 autoextend on next 1024 maxsize 409600,'TBS_DATA_5_FILE_3.DBF' size 128 autoextend on next 1024 maxsize 409600 CACHE = NORMAL;
create tablespace "TBS_DATA_6" datafile 'TBS_DATA_6_FILE_1.DBF' size 128 autoextend on next 1024 maxsize 409600,'TBS_DATA_6_FILE_2.DBF' size 128 autoextend on next 1024 maxsize 409600,'TBS_DATA_6_FILE_3.DBF' size 128 autoextend on next 1024 maxsize 409600 CACHE = NORMAL;
create tablespace "TBS_DATA_7" datafile 'TBS_DATA_7_FILE_1.DBF' size 128 autoextend on next 1024 maxsize 409600,'TBS_DATA_7_FILE_2.DBF' size 128 autoextend on next 1024 maxsize 409600,'TBS_DATA_7_FILE_3.DBF' size 128 autoextend on next 1024 maxsize 409600 CACHE = NORMAL;
create tablespace "TBS_DATA_8" datafile 'TBS_DATA_8_FILE_1.DBF' size 128 autoextend on next 1024 maxsize 409600,'TBS_DATA_8_FILE_2.DBF' size 128 autoextend on next 1024 maxsize 409600,'TBS_DATA_8_FILE_3.DBF' size 128 autoextend on next 1024 maxsize 409600 CACHE = NORMAL;
create tablespace "TBS_DATA_9" datafile 'TBS_DATA_9_FILE_1.DBF' size 128 autoextend on next 1024 maxsize 409600,'TBS_DATA_9_FILE_2.DBF' size 128 autoextend on next 1024 maxsize 409600,'TBS_DATA_9_FILE_3.DBF' size 128 autoextend on next 1024 maxsize 409600 CACHE = NORMAL;
create tablespace "TBS_DATA_10" datafile 'TBS_DATA_10_FILE_1.DBF' size 128 autoextend on next 1024 maxsize 409600,'TBS_DATA_10_FILE_2.DBF' size 128 autoextend on next 1024 maxsize 409600,'TBS_DATA_10_FILE_3.DBF' size 128 autoextend on next 1024 maxsize 409600 CACHE = NORMAL;
create tablespace "TBS_DATA_11" datafile 'TBS_DATA_11_FILE_1.DBF' size 128 autoextend on next 1024 maxsize 409600,'TBS_DATA_11_FILE_2.DBF' size 128 autoextend on next 1024 maxsize 409600,'TBS_DATA_11_FILE_3.DBF' size 128 autoextend on next 1024 maxsize 409600 CACHE = NORMAL;
create tablespace "TBS_DATA_12" datafile 'TBS_DATA_12_FILE_1.DBF' size 128 autoextend on next 1024 maxsize 409600,'TBS_DATA_12_FILE_2.DBF' size 128 autoextend on next 1024 maxsize 409600,'TBS_DATA_12_FILE_3.DBF' size 128 autoextend on next 1024 maxsize 409600 CACHE = NORMAL;
create tablespace "TBS_DATA_13" datafile 'TBS_DATA_13_FILE_1.DBF' size 128 autoextend on next 1024 maxsize 409600,'TBS_DATA_13_FILE_2.DBF' size 128 autoextend on next 1024 maxsize 409600,'TBS_DATA_13_FILE_3.DBF' size 128 autoextend on next 1024 maxsize 409600 CACHE = NORMAL;

*/

2 创建二级分区表

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 "TBS_DATA_1", CLUSTERBTR) ,
PARTITION  "P0311"  VALUES('0311      ')   STORAGE(ON "TBS_DATA_2", CLUSTERBTR) ,
PARTITION  "P0312"  VALUES('0312      ')   STORAGE(ON "TBS_DATA_3", CLUSTERBTR) ,
PARTITION  "P0313"  VALUES('0313      ')   STORAGE(ON "TBS_DATA_4", CLUSTERBTR) ,
PARTITION  "P0314"  VALUES('0314      ')   STORAGE(ON "TBS_DATA_5", CLUSTERBTR) ,
PARTITION  "P0315"  VALUES('0315      ')   STORAGE(ON "TBS_DATA_6", CLUSTERBTR) ,
PARTITION  "P0316"  VALUES('0316      ')   STORAGE(ON "TBS_DATA_7", CLUSTERBTR) ,
PARTITION  "P0317"  VALUES('0317      ')   STORAGE(ON "TBS_DATA_8", CLUSTERBTR) ,
PARTITION  "P0318"  VALUES('0318      ')   STORAGE(ON "TBS_DATA_9", CLUSTERBTR) ,
PARTITION  "P0319"  VALUES('0319      ')   STORAGE(ON "TBS_DATA_10", CLUSTERBTR) ,
PARTITION  "P0335"  VALUES('0335      ')   STORAGE(ON "TBS_DATA_11", CLUSTERBTR) ,
PARTITION  "P9999"  VALUES(DEFAULT)   STORAGE(ON "TBS_DATA_12", CLUSTERBTR) 
) STORAGE(HASHPARTMAP(1), ON "TBS_DATA_13", CLUSTERBTR) ;
  • 二级分区表manager管理工具如图:
    在这里插入图片描述二级分区表逻辑图:
    在这里插入图片描述

介绍:
达梦数据库:达梦数据库分区表总结
参考:DM8_SQL语言使用手册.pdf
第 3 章 数据定义语句
3.6.1.4 定义 水平分区表
水平分区包括范围分区、哈希分区和列表分区三种。水平分区表的创建需要通过
<PARTITION 子句>指定。
范围(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”指定上界,即该分区包含上界值

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

  • 例 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);

4 达梦数据库- 三级分区表

  • 例 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)
);

本例子中各分区表的表名详细介绍如下:
在这里插入图片描述

5 达梦数据库学习使用列表

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
达梦数据库可以通过以下步骤为表建立分区: 1. 创建分区表空间(Partitioned Tablespace) 使用以下语句创建分区表空间: ``` CREATE TABLESPACE partition_tablespace DATAFILE 'path_to_datafile' SIZE 10G EXTENT MANAGEMENT LOCAL UNIFORM SIZE 64M; ``` 其中,partition_tablespace为分区表空间名称,path_to_datafile为数据文件路径,SIZE指定表空间大小,EXTENT MANAGEMENT指定分区管理方式,LOCAL表示本地管理,UNIFORM SIZE指定分区大小。 2. 创建分区表(Partitioned Table) 使用以下语句创建分区表: ``` CREATE TABLE partition_table ( id NUMBER, name VARCHAR2(50), date_of_birth DATE ) PARTITION BY RANGE (date_of_birth) ( PARTITION p1 VALUES LESS THAN (TO_DATE('01-01-2000', 'DD-MM-YYYY')), PARTITION p2 VALUES LESS THAN (TO_DATE('01-01-2010', 'DD-MM-YYYY')), PARTITION p3 VALUES LESS THAN (MAXVALUE) ) TABLESPACE partition_tablespace; ``` 其中,partition_table为表名,id、name、date_of_birth为表字段,PARTITION BY指定分区方式,RANGE表示按照范围分区,date_of_birth为分区字段,p1、p2、p3为分区名称,VALUES LESS THAN指定分区的值范围,MAXVALUE表示分区的最大值,TABLESPACE指定表所使用的表空间。 3. 插入数据 使用INSERT语句向分区表中插入数据即可。 注意:在创建分区表时,必须指定所使用的分区表空间。同时,分区表的分区键必须是表中的某一列,且该列必须具有可以进行比较的数据类型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值