doris:手动分区

分区列

  • 分区列可以指定一列或多列,分区列必须为 KEY 列。
  • PARTITION 列默认必须为 NOT NULL 列,如果需要使用 NULL 列,应设置 session variable allow_partition_column_nullable = true。对于 LIST PARTITION,支持真正的 NULL 分区。对于 RANGE PARTITION,NULL 值会被划归最小的 LESS THAN 分区
  • 不论分区列是什么类型,在写分区值时,都需要加双引号。
  • 分区数量理论上没有上限。但默认限制每张表 4096 个分区,如果想突破这个限制,可以修改 FE 配置max_multi_partition_nummax_dynamic_partition_num
  • 当不使用分区建表时,系统会自动生成一个和表名同名的,全值范围的分区。该分区对用户不可见,并且不可删改。
  • 创建分区时不可添加范围重叠的分区。

Range 分区

分区列通常为时间列,以方便的管理新旧数据。Range 分区支持的列类型 DATE, DATETIME, TINYINT, SMALLINT, INT, BIGINT, LARGEINT。

分区信息,支持四种写法:

  1. FIXED RANGE:定义分区的左闭右开区间。

    PARTITION BY RANGE(col1[, col2, ...])
    (
    PARTITION partition_name1 VALUES [("k1-lower1", "k2-lower1", "k3-lower1",...), ("k1-upper1", "k2-upper1", "k3-upper1", ...)),
    PARTITION partition_name2 VALUES [("k1-lower1-2", "k2-lower1-2", ...), ("k1-upper1-2", MAXVALUE, ))
    )

示例如下:

复制代码
PARTITION BY RANGE(`date`)
(
    PARTITION `p201701` VALUES [("2017-01-01"),  ("2017-02-01")),
    PARTITION `p201702` VALUES [("2017-02-01"), ("2017-03-01")),
    PARTITION `p201703` VALUES [("2017-03-01"), ("2017-04-01"))
)
  1. LESS THAN:仅定义分区上界。下界由上一个分区的上界决定。

    PARTITION BY RANGE(col1[, col2, ...])
    (
    PARTITION partition_name1 VALUES LESS THAN MAXVALUE | ("value1", "value2", ...),
    PARTITION partition_name2 VALUES LESS THAN MAXVALUE | ("value1", "value2", ...)
    )

示例如下:

复制代码
PARTITION BY RANGE(`date`)
(
    PARTITION `p201701` VALUES LESS THAN ("2017-02-01"),
    PARTITION `p201702` VALUES LESS THAN ("2017-03-01"),
    PARTITION `p201703` VALUES LESS THAN ("2017-04-01"),
    PARTITION `p2018` VALUES [("2018-01-01"), ("2019-01-01")),
    PARTITION `other` VALUES LESS THAN (MAXVALUE)
)

List 分区

分区列支持 BOOLEAN, TINYINT, SMALLINT, INT, BIGINT, LARGEINT, DATE, DATETIME, CHAR, VARCHAR 数据类型,分区值为枚举值。只有当数据为目标分区枚举值其中之一时,才可以命中分区。

Partition 支持通过 VALUES IN (...) 来指定每个分区包含的枚举值。

举例如下:

复制代码
PARTITION BY LIST(city)
(
    PARTITION `p_cn` VALUES IN ("Beijing", "Shanghai", "Hong Kong"),
    PARTITION `p_usa` VALUES IN ("New York", "San Francisco"),
    PARTITION `p_jp` VALUES IN ("Tokyo")
)

List 分区也支持多列分区,示例如下:

复制代码
PARTITION BY LIST(id, city)
(
    PARTITION p1_city VALUES IN (("1", "Beijing"), ("1", "Shanghai")),
    PARTITION p2_city VALUES IN (("2", "Beijing"), ("2", "Shanghai")),
    PARTITION p3_city VALUES IN (("3", "Beijing"), ("3", "Shanghai"))
)

NULL 分区

从 2.1.3 版本开始,Doris 支持以下的 NULL 值分区用法。

PARTITION 列默认必须为 NOT NULL 列,如果需要使用 NULL 列,应设置 session variable allow_partition_column_nullable = true。对于 LIST PARTITION,我们支持真正的 NULL 分区。对于 RANGE PARTITION,NULL 值会被划归最小的 LESS THAN 分区。分列如下:

  1. LIST 分区

    mysql> create table null_list(
    -> k0 varchar null
    -> )
    -> partition by list (k0)
    -> (
    -> PARTITION pX values in ((NULL))
    -> )
    -> DISTRIBUTED BY HASH(k0) BUCKETS 1
    -> properties("replication_num" = "1");
    Query OK, 0 rows affected (0.11 sec)

    mysql> insert into null_list values (null);
    Query OK, 1 row affected (0.19 sec)

    mysql> select * from null_list;
    +------+
    | k0 |
    +------+
    | NULL |
    +------+
    1 row in set (0.18 sec)

  2. RANGE 分区 ------ 归属最小的 LESS THAN 分区

    mysql> create table null_range(
    -> k0 int null
    -> )
    -> partition by range (k0)
    -> (
    -> PARTITION p10 values less than (10),
    -> PARTITION p100 values less than (100),
    -> PARTITION pMAX values less than (maxvalue)
    -> )
    -> DISTRIBUTED BY HASH(k0) BUCKETS 1
    -> properties("replication_num" = "1");
    Query OK, 0 rows affected (0.12 sec)

    mysql> insert into null_range values (null);
    Query OK, 1 row affected (0.19 sec)

    mysql> select * from null_range partition(p10);
    +------+
    | k0 |
    +------+
    | NULL |
    +------+
    1 row in set (0.18 sec)

  3. RANGE 分区 ------ 没有 LESS THAN 分区时,无法插入

    mysql> create table null_range2(
    -> k0 int null
    -> )
    -> partition by range (k0)
    -> (
    -> PARTITION p200 values [("100"), ("200"))
    -> )
    -> DISTRIBUTED BY HASH(k0) BUCKETS 1
    -> properties("replication_num" = "1");
    Query OK, 0 rows affected (0.13 sec)

    mysql> insert into null_range2 values (null);
    ERROR 5025 (HY000): Insert has filtered data in strict mode, tracking_url=......

相关推荐
lihao lihao几秒前
软硬链接
linux·运维·服务器
TOWE technology3 分钟前
智能安防监控系统如何做好防雷?——视频信号SPD综合应用方案解析
运维·服务器·防雷产品·信号保护·信号防雷·spd
带刺的坐椅6 分钟前
Solon Server 启动模式深度解析:从 0.3MB 内核到 10+ Server 插件
java·http·solon·jetty·undertow
雪度娃娃7 分钟前
存储器层次结构——磁盘硬盘存储
服务器·网络·数据库·计算机组成原理
郝学胜-神的一滴7 分钟前
干货版《算法导论》07:递归视角下的选择排序与归并排序
java·数据结构·c++·python·程序人生·算法·排序算法
掉鱼的猫20 分钟前
Solon Server 启动模式深度解析:从 0.3MB 内核到 10+ Server 插件
java·http
shehuiyuelaiyuehao21 分钟前
多线程入门
java·python·算法
星夜夏空9921 分钟前
FreeRTOS学习(7)——任务列表
java·前端·学习
han_hanker27 分钟前
BeanUtils.copyProperties 和序列化的问题
java·开发语言·spring boot
野生技术架构师30 分钟前
牛客网2026互联网大厂Java面试题汇总,附官方级答案解析
java·开发语言