2021-06-23

DM8支持的分区表类型

达梦 dm8 支持的水平分区类型:
	范围分区(range),
	列表分区(list),
	哈希分区(hash),
	间隔分区(range 分区的一种)
这几种。
下面分别介绍

范围分区(range)

范围分区的字段是数字或日期时间类型。
例如创建下面的表:

    create table T_P1
    (
      id int,
      name varchar(30)
    )
    partition by range (id)
    (
      partition p1 values less than (100), 
       partition p2 values less than(200), 
       partition p3 values less than(400)
    );

执行sql查询 数据库有哪些分区表(需要有相关权限)

    select table_name,partitioned from dba_tables where
      partitioned='YES';

然后我们插入3条测试数据

	insert into T_P1 values(100-1,'a');
    insert into T_P1 values(200-1,'a');
    insert into T_P1 values(400-1,'a');
    commit;

查分区表某个分区的记录,一下2句sql是等效的。

    select * from T_P1_p1;
    select * from T_P1 partition(p1);  

在这里插入图片描述

类似的:

    select * from T_P1_p2;
    select * from T_P1 partition(p2);  
    select * from T_P1_p3;
    select * from T_P1 partition(p3);  

我们还可以将每个分区映射到不同表空间中

  create tablespace "TBS1" datafile '/dm8/data/DMDB/TBS101.DBF' size 32 CACHE = NORMAL;
  create tablespace "TBS2" datafile '/dm8/data/DMDB/TBS102.DBF' size 32 CACHE = NORMAL;
  create tablespace "TBS3" datafile '/dm8/data/DMDB/TBS103.DBF' size 32 CACHE = NORMAL;

再创建一个分区表,把分区指定到新创建的表空间。

	CREATE TABLE T_p2
    (
      ID INT,
      PID INT,
      NAME VARCHAR(30)
    )
    PARTITION BY RANGE(ID)
    (
      PARTITION P1 VALUES LESS THAN(100) TABLESPACE TBS1, 
      PARTITION P2 VALUES LESS THAN(200) TABLESPACE TBS2, 
      PARTITION P3 VALUES LESS THAN(400) TABLESPACE TBS3,
      PARTITION PM VALUES LESS THAN      (MAXVALUE)
    );

其中 :
PARTITION PM VALUES LESS THAN (MAXVALUE)
会容纳 id >=400 的数据,不然会报错 :没有找到合适的分区

列表分区

列表分区适合字符串类型
创建表:

    create table t_sales
    (
      sales_id int,
      saleman  varchar(30),
      saledate datetime,
      city     varchar(30)
    )
    partition by LIST (CITY)
    (
      PARTITION P1 VALUES ('北京','天津','石家庄'), 
      PARTITION P2 VALUES ('上海','南京'         ), 
      PARTITION P3 VALUES ('武汉','长沙','南昌'  ), 
      PARTITION P4 VALUES ('广州','深圳','东莞'  ),
      PARTITION pm values (default)
    );  

其中 PARTITION pm values (default) 会存放city不属于 ‘北京’,‘天津’,‘石家庄’,‘上海’,‘南京’,‘武汉’,‘长沙’,‘南昌’,‘广州’,‘深圳’,‘东莞’ 的数据。
插入5行测试数据

    INSERT INTO T_SALES VALUES(1,'AAA','2012-01-01','石家庄');
    INSERT INTO T_SALES VALUES(1,'ADD','2013-01-01','上海'  );
    INSERT INTO T_SALES VALUES(2,'DDD','2021-01-01','武汉'  );
    INSERT INTO T_SALES VALUES(2,'DDD','2021-01-01','广州'  );
    INSERT INTO T_SALES VALUES(2,'DDD','2021-01-01','汕头'  );
    commit;

然后查询验证一下:

    select *,'p1' partition_ from T_SALES partition(p1) union                
    select *,'p2' partition_ from T_SALES partition(p2) union                   
    select *,'p3' partition_ from T_SALES partition(p3) union                  
    select *,'p4' partition_ from T_SALES partition(p4) union                
    select *,'pm' partition_ from T_SALES partition(pm)               

在这里插入图片描述

哈希分区

存数据非常快,取数据比较慢,各个子分区的数据都是被平均分配如果hash 分区不指定分区名,就通过指定的hash 的分区数来创建,子分区名统一使用DMHASHPRT+分区号(从0 开始)作为分区名。

创建表,对id 字段分区:

    create table t_hash
    (
      id int,
      name varchar(30)
    )
    partition by hash(id) PARTITIONS 5;

其中 partition by hash(id) PARTITIONS 5; 的5 代表划分为5个分区。

插入测试数据:

    declare
    begin
      for i in 1..3000 LOOP
      insert into t_hash values(i,'AAA');
      END LOOP;
      COMMIT;
    END;

验证数据:

SELECT *,'p_hash_0' partition_ FROM T_HASH_DMHASHPART0 where rownum<2 union
SELECT *,'p_hash_1' partition_ FROM T_HASH_DMHASHPART1 where rownum<2 union
SELECT *,'p_hash_2' partition_ FROM T_HASH_DMHASHPART2 where rownum<2 union
SELECT *,'p_hash_3' partition_ FROM T_HASH_DMHASHPART3 where rownum<2 union
SELECT *,'p_hash_4' partition_ FROM T_HASH_DMHASHPART4 where rownum<2;

在这里插入图片描述

间隔分区 Numtoyminterval

实际上是范围分区的一个扩展

  create table interval_sales 
  (
    prod_id number(6),
    time_id date
  )
  partition by range (time_id)
  INTERVAL(
            NUMTOYMINTERVAL(1, 'MONTH')
           )--------可以是MONTH,YEAR,DAY
  (
    partition p1 values less than (
                                    to_date('2015-01-01','yyyy-mm-dd')
                                  )
  );

用时间间隔函数做分区,数据插入时,没有对应的分区,数据库会自动给你创建一个新分区。
插入测试数据

  insert into interval_sales values(001,to_date('2015-02-01','yyyy-mm-dd')-100);
  insert into interval_sales values(002,to_date('2015-02-01','yyyy-mm-dd'));
  commit;

查一下 interval_sales 表拥有那些分区

  select table_name,partition_name from user_tab_partitions where table_name='INTERVAL_SALES';

在这里插入图片描述
验证

    select *,'p1' partition_ from INTERVAL_SALES partition(p1) union 
    select *,'SYS_P1354_1356' partition_ from INTERVAL_SALES partition(SYS_P1354_1356) ;     

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值