管理分区表和分区索引
分区是指将表、索引等数据库对象划分为较小的可管理片段的技术,每一个片段称为分区子表或分区索引。
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);