达梦数据库系列—36.分区表

目录

1、分区表的分类

1.1 范围分区表

1.2 List分区表

1.3  哈希分区表

1.4 多级分区表

二级分区

三级分区

2、分区表的维护

2.1 增加分区

2.2 删除分区

2.3 交换分区

2.4 融合分区

3、全局索引和局部索引


1、分区表的分类

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

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

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

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

1.1 范围分区表

例:

    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

    );

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

    );

1.3  哈希分区表

在很多情况下,用户无法预测某个列上的数据变化范围,因而无法实现创建固定数量的范围分区或 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

    );

1.4 多级分区表

二级分区

例:

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

三级分区

例:

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)

);

2、分区表的维护

2.1 增加分区

--范围分区表

  ALTER TABLE callinfo

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

--List分区表

  ALTER TABLE sales

  ADD PARTITION p5 VALUES ('拉萨', '呼和浩特') STORAGE (ON ts5);

--hash分区表

ALTER TABLE SYSDBA.HASH_TEST ADD PARTITION P4;

2.2 删除分区

  ALTER TABLE callinfo DROP PARTITION p1;

注:hash分区不支持删分区

2.3 交换分区

DM 支持用 ALTER TABLE EXCHANGE PARTITION 语句将分区数据跟普通表数据进行交换,交换的两张表需要具有相同的结构。仅范围分区和 LIST 分区支持交换分区。

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

2.4 融合分区

例:

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

哈希分区表不支持。

拆分分区

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

3、全局索引和局部索引

全局索引:全局索引是以整张表的数据为对象而建立的索引

局部索引:局部索引是在分区表的每个分区上创建的索引

全局索引:带GLOBAL 关键字否则创建局部索引。

//首先,创建表t1

create table t1(c1 int, c2 int, c3 int)  partition by range(c1)

(

partition p1 values less than(100),

partition p2 values less than(200),

PARTITION p3 VALUES EQU OR LESS THAN (MAXVALUE)

);

//其次,指定GLOBAL创建全局索引idx1

create index idx1 on t1(c2) GLOBAL;

//再次,缺省GLOBAL创建局部索引idx2

create index idx2 on t1(c3);

创建分区表后,每个分区会自动创建一个聚簇索引

注:如果表中指定了PK,默认创建全局索引,若没有指定PK,创建局部索引(PARTITIONED)

表上创建全局索引,每个分区会创建一个Normal索引

表上创建局部索引,每个分区也会创建一个Normal索引

查询表的某个分区(T1_P2),走局部索引。

达梦技术社区:达梦数据库 - 新一代大型通用关系型数据库 | 达梦在线服务平台

  • 25
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 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
发出的红包

打赏作者

奥德彪的蕉

天不生我奥德彪,非洲无人拉香蕉

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值