管理分区表和分区索引

本文介绍了达梦数据库中如何管理和使用分区表,包括范围、哈希和列表分区,以及多级分区的方法。同时阐述了分区带来的好处,如数据安全性、恢复速度和I/O均衡。此外,还讨论了在分区表上创建索引的规则,并展示了如何维护分区表,如增加、删除、交换、合并和拆分分区的操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

管理分区表和分区索引

分区是指将表、索引等数据库对象划分为较小的可管理片段的技术,每一个片段称为分区子表或分区索引。

DM 采用子表方式创建分区表,分区表作为分区主表,而每一个分区以一个子表实体存在,即每一个分区都是一个完整的表,一般命名为主表名_分区名。

将这些分区放在不同的表空间中具有以下的好处:

1. 减少所有数据都损坏的可能性,一个表空间损坏不影响其他表空间,提高可用性;

2. 恢复时间大大减少;

3. 可以将同一个表中的数据分布在不同的磁盘上,从而均衡磁盘上的 I/O 操作;

4. 提高了表的可管理性、可利用性和访问效率。

分区方法:

    

达梦数据库 DM 支持对表进行水平分区。对于水平分区,提供以下分区方式:

1. 范围(range)水平分区:对表中的某些列上值的范围进行分区,根据某个值的范围,决定将该数据存储在哪个分区上;

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

3. 列表(list)水平分区:通过指定表中的某个列的离散值集,来确定应当存储在一起的数据。例如,可以对表上的 status 列的值在('A','H','O')放在一个

分区,值在('B','I','P')放在另一个分区,以此类推;

4. 多级分区表:按上述三种分区方法进行任意组合,将表进行多次分区,称为多级分区表。

--创建分区表

----创建范围分区表

例如,以下语句创建一个范围分区表 callinfo,用来记录用户的 2010 年的电话通讯

信息,包括主叫号码、被叫号码、通话时间和时长,并且根据季度进行分区。

CREATE TABLE callinfo(

caller CHAR(15),

callee CHAR(15),

time

DATETIME,

duration

INT

)

PARTITION BY RANGE(time)(

PARTITION p1 VALUES LESS THAN ('2010-04-01'),

PARTITION p2 VALUES LESS THAN ('2010-07-01'),

PARTITION p3 VALUES LESS THAN ('2010-10-01'),

PARTITION p4 VALUES EQU OR LESS THAN ('2010-12-31') --'2010-12-31'也可替换

为 MAXVALUE

) ;

----创建 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 ('广州', '深圳')

);

----创建哈希分区表

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

----创建多级分区表

DROP TABLE SALES;

CREATE TABLE SALES(

SALES_ID INT,

SALEMAN CHAR(20),

SALEDATE DATETIME,

CITY CHAR(10)

)

PARTITION BY LIST(CITY)

SUBPARTITION BY RANGE(SALEDATE) SUBPARTITION TEMPLATE(

SUBPARTITION P11 VALUES LESS THAN ('2012-04-01'),

SUBPARTITION P12 VALUES LESS THAN ('2012-07-01'),

SUBPARTITION P13 VALUES LESS THAN ('2012-10-01'),

SUBPARTITION P14 VALUES EQU OR LESS THAN (MAXVALUE)) (

PARTITION P1 VALUES ('北京', '天津')

(

 SUBPARTITION P11_1 VALUES LESS THAN ('2012-10-01'),

 SUBPARTITION P11_2 VALUES EQU OR LESS THAN (MAXVALUE)

),

PARTITION P2 VALUES ('上海', '南京', '杭州'),

PARTITION P3 VALUES (DEFAULT)

);

-- 在水平分区表建立索引

DM 支持对水平分区表建立普通索引、唯一索引、聚集索引、函数索引、位图索引和空间索引。

创建水平分区表时,若表的 PRIMARY KEY 未包含所有分区列,系统会自动创建全局索引,否则自动创建局部索引。

例如,下面的语句在创建水平分区表 test 时会自动创建一个全局索引。

CREATE TABLE test(c1 INT, c2 INT PRIMARY KEY) PARTITION BY HASH(c1) PARTITIONS 2;

维护水平分区表

--增加分区

ALTER TABLE callinfo ADD PARTITION p5 VALUES LESS THAN ('2011-4-1') STORAGE (ON ts5);

--删除分区

ALTER TABLE callinfo DROP PARTITION p1;

--交换分区

如果使用分区表,如上文提到的 callinfo,只需使用交换分区即可完成以上功能。例如,2011 年第二季度已到了,需删除 2010 年第二季度的通话记录,因此,可通过以下脚

本来实现:

CREATE TABLE callinfo_2011Q2(

caller CHAR(15),

callee CHAR(15),

time

DATETIME,

duration

INT

);

--交换分区

ALTER TABLE callinfo EXCHANGE PARTITION p2 WITH TABLE callinfo_2011Q2;

--删除原分区

ALTER TABLE callinfo DROP PARTITION p2;

--新增分区,记录 2011 年第二季度通话记录

ALTER TABLE callinfo ADD PARTITION p6 VALUES LESS THAN ('2011-7-1') STORAGE (ON ts2);

--合并分区

要想将两个范围分区的内容融合到一个分区,就要使用 ALTER TABLE MERGE PARTITION 语句。

例如,可将 callinfo 的 2010 第 3 季度和第 4 季度合并成一个分区:

ALTER TABLE callinfo MERGE PARTITIONS p3, p4 into partition p3_4;

仅范围分区表和 LIST 分区表支持合并分区.

--拆分分区

例如,将合并后的 p3_4 拆分为原两分区 p3 和 p4,分别记录 2010 年第三和第四季度

的通话记录。

ALTER TABLE callinfo SPLIT PARTITION p3_4 AT ('2010-9-30') INTO (PARTITION p3, PARTITION p4);

达梦数据库 - 新一代大型通用关系型数据库 | 达梦在线服务平台达梦数据库产品体验站,DM8在线试玩,达梦数据库全系列产品免费下载,官方权威的快速上手文档和产品手册,最活跃的达梦技术社区,面向全行业ISV厂商免费的云适配服务。icon-default.png?t=M7J4https://eco.dameng.com

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值