doris:手动分区

server/2025/1/12 7:18:50/

分区列​

  • 分区列可以指定一列或多列,分区列必须为 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)

  1. 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)

  1. 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=......


http://www.ppmy.cn/server/157694.html

相关文章

Java SE 与 Java EE 简介

诸神缄默不语-个人CSDN博文目录 在学习和使用Java语言时,我们常常会遇到两个常见的术语:Java SE 和 Java EE。它们分别代表了Java的不同应用层次和开发领域。本文将深入介绍Java SE和Java EE的区别、特点以及适用场景,帮助大家更好地理解这两…

js代理模式

允许在不改变原始对象的情况下,通过代理对象来访问原始对象。代理对象可以在访问原始对象之前或之后,添加一些额外的逻辑或功能。 科学上网过程 一般情况下,在访问国外的网站,会显示无法访问 因为在dns解析过程,这些ip被禁止解析,所以显示无法访问 引…

7 分布式定时任务调度框架

先简单介绍下分布式定时任务调度框架的使用场景和功能和架构,然后再介绍世面上常见的产品 我们在大型的复杂的系统下,会有大量的跑批,定时任务的功能,如果在独立的子项目中单独去处理这些任务,随着业务的复杂度的提高…

B+树在MySQL中的应用价值

为什么MySQL选择B树存储数据 在数据库管理系统中,存储和查询数据的效率直接影响系统的性能。MySQL 作为最常用的关系型数据库之一,其存储引擎(例如 InnoDB)选择了 B 树作为索引的数据结构。这种选择并非偶然,而是经过…

Java基础:equals()方法与==的区别

1、超类Object的equals()底层原理: 在Object超类中已经提供了equals()方法,源码如下: public boolean equals(Object obj) { return (this obj); } 所有的对象都拥有标识(内存地址)和状态(数据&a…

Java Web开发进阶——Spring Security基础与应用

Spring Security是Spring框架的核心模块之一,用于保护Web应用程序和微服务的安全。它提供强大的认证和授权功能,并与Spring生态系统无缝集成。本节将详细介绍Spring Security的基础知识及其在实际项目中的应用。 1. Spring Security概述与功能 1.1 什么…

微信小程序实现拖拽盒子效果

要实现一个当前盒子高度由里面的盒子进行支配高度拖拽的效果 // wxml<view class"exmation-item" wx:elif"{{type4}}"> <view class"exmation-item-drag-box" id"drag-box"> <!-- 内容 --><view class"exm…

Scala语言的软件开发工具

Scala语言的软件开发工具 Scala是一种静态类型的编程语言&#xff0c;它结合了面向对象和函数式编程的特性。自2003年由马丁奥德斯基&#xff08;Martin Odersky&#xff09;发明以来&#xff0c;Scala因其简洁的语法和强大的功能&#xff0c;逐渐成为了现代软件开发领域的重要…