暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

变更表级分区(AUTO模式)1

酷数据库 2023-10-23
99

本文介绍了修改表的分区的语法,包括分区的分裂、合并和迁移等。本语法仅适用于AUTO模式数据库。

分区分裂

将表的一个分区分裂成一个或多个分区。

Range/Range column分区表分裂
  • 语法


    ALTER TABLE identifier SPLIT PARTITION identifier INTO
     (partition_definition,partition_definition, [, partition_definition] ...);
    
     partition_definition:
        PARTITION partition_name
            [VALUES
                {LESS THAN {(value_list) | MAXVALUE}]
  • 示例

    执行以下SQL,创建表tb1:


    CREATE TABLE tb1(a int) PARTITION BY RANGE(a)
     (PARTITION p1 VALUES LESS THAN(20),
      PARTITION p2 VALUES LESS THAN(100))

    执行以下SQL,将p1分裂成p10,p11,p12:


    ALTER TABLE tb1 SPLIT PARTITION p1 INTO
    (PARTITION p10 VALUES LESS THAN (8),
    PARTITION p11 VALUES LESS THAN(15),
    PARTITION p12 VALUES LESS THAN(20))

对于Range分区表,PolarDB-X还支持将一个Range在其范围内按任意点一分为二。

  • 语法


    ALTER TABLE identifier SPLIT PARTITION identifier AT(number) INTO
     (PARTITION identifier,
      PARTITION identifier);
  • 示例

    对于tb1表,支持将分区p1分裂:


    ALTER TABLE tb1 SPLIT PARTITION p1 AT(9) INTO (partition p11, partition p12)

    该SQL等价于下面这条语句:


    ALTER TABLE tb1 SPLIT PARTITION p1 INTO
    (PARTITION p11 VALUES LESS THAN(9),
    PARTITION p12 VALUES LESS THAN(20));
List/List column分区表分裂
  • 语法


    ALTER TABLE identifier SPLIT PARTITION identifier INTO
     (partition_definition,partition_definition, [, partition_definition] ...);
    
     partition_definition:
        PARTITION partition_name
            [VALUES IN (value_list | default)}]
  • 示例

    执行以下SQL,创建表tb1:


    CREATE TABLE tb1(a int) PARTITION BY LIST(a)
     (PARTITION p1 VALUES IN(1, 2, 3, 4, 5, 6),
      PARTITION p2 VALUES IN(7,8,9),
      PARTITION p3 VALUES IN(default))

    执行以下SQL,将p1分裂成p10,p11,p12。


    ALTER TABLE tb1 SPLIT PARTITION p1 INTO
    (PARTITION p10 VALUES IN (1,3,5),
    PARTITION p11 VALUES IN (2,4),
    PARTITION p12 VALUES IN (6))

    由于分区p3是default分区,表示1~9之外的分区键对应的值全部在p3分区。对于default分区,PolarDB-X也支持将部分value从default分区中分裂出来。执行以下SQL,将10~15从p3中分裂出来:


    ALTER TABLE tb1 SPLIT PARTITION p3 INTO
    (PARTITION p30 VALUES IN (10,11,12),
    PARTITION p31 VALUES IN (13,14,15),
    PARTITION p32 VALUES IN (default))
Hash/key分区表分裂
  • 语法


    ALTER TABLE identifier SPLIT PARTITION identifier
  • 示例

    执行以下SQL,创建表tb1:


    CREATE TABLE tb1(a int) PARTITION BY key(a) partitions 3;

    默认的这三个分区的名字依次是p1,p2,p3,可以通过以下语法,将p1分裂成两个分区,这两个新分区是在原p1的hash空间范围内将其按hash空间范围一分为二:


    ALTER TABLE tb1 SPLIT PARTITION p1;
热点分裂

对于Key分区的表,如果发现有热点数据(数据倾斜),PolarDB-X支持将热点的数据散列到多个分区。

  • 语法


    ALTER TABLE identifier SPLIT INTO [newPartNamePrefix]
    PARTITIONS partition_count BY HOT VALUE(value_list);
  • 示例

    执行以下SQL,创建表tb1:


    CREATE TABLE tb1 (seller_id int, order_id int) 
    PARTITION BY key (seller_id, order_id) PARTITIONS BY 3;

    假如seller_id=88是个大卖家ID,对应的数据非常多,执行以下SQL将seller_id=88的数据散列到5个新的分区:hp1,hp2,hp3,hp4,hp5,这5个分区是按照seller_id=88所对应的order_id的hash空间五等份切分。


    ALTER TABLE tb1 SPLIT INTO hp PARTITIONS 5 BY HOT VALUE(88);
热点提取

对于Key分区的表,PolarDB-X支持将热点值对应的数据提取到一个单独的分区。

  • 语法


    ALTER TABLE identifier EXTRACT TO PARTITION [newPartNamePrefix] BY HOT VALUE(value_list);
  • 示例

    执行以下SQL,创建表tb1:


    CREATE TABLE tb1 (a int, b int)
    PARTITION BY key(a, b) PARTITIONS BY 3;

    执行以下SQL,将拆分键值为(a=88,b=10)的数据,提取到一个单独的新分区:


    ALTER TABLE tb1 EXTRACT TO PARTITION BY HOT VALUE(88,10);

对于List或List column分区,PolarDB-X也支持将特定的value对应的数据提取到一个单独的分区。

  • 语法


    ALTER TABLE identifier EXTRACT TO PARTITION pnew BY [HOT] VALUE(value_list);
  • 示例

    执行以下SQL,创建表tb1:


    CREATE TABLE tb1(a int) PARTITION BY RANGE(a)
     (PARTITION p1 VALUES IN(1, 2, 3, 4, 5, 6),
      PARTITION p2 VALUES IN(7,8,9),
      PARTITION p3 VALUES IN(default))

    执行以下SQL,将value=2提取到一个单独分区:


    ALTER TABLE tb1 EXTRACT TO PARTITION pnew BY HOT VALUE(2);
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论