StarRocks分区表历史数据删除与管理

一、背景介绍

  • 在使用 StarRocks 时,可能会遇到需要删除大批量数据的情况。然而,StarRocks 对 DELETE 操作的支持并不理想,主要存在以下问题:
  1. 不建议执行高频的 DELETE 操作:删除的数据会标记为“Deleted”,暂时保留在 Segment 中,不会立即进行物理删除。Compaction(数据版本合并)完成之后会被回收。
  2. 查询效率可能降低:执行 DELETE 语句后,可能会导致接下来一段时间内(Compaction 完成之前)的查询效率降低。
  3. DELETE 语句不支持函数传参:例如:
DELETE FROM xxx  WHERE DATE(time) < DATE_SUB(CURDATE(), INTERVAL 2 DAY); 报错:ERROR 1064 (HY000): Getting analyzing error from line 1, column 48 to line 1, column 57. Detail message: Left expr of binary predicate should be column name.

为了更高效地管理分区表中的历史数据,我们可以使用 truncate table partition 操作。然而,StarRocks不支持在 truncate table partition 中使用 WHERE 条件。因此,我们需要编写一个 Shell 脚本来生成相应的 SQL 语句。

二、使用示例

1、创建分区测试表

CREATE  TABLE example_db.test_tb
(   `partition_date` date NULL COMMENT "分区日期(yyyy-mm-dd)",`id` int NULL COMMENT "主键id",`name` STRING NULL COMMENT "姓名",`age`  STRING NULL COMMENT "年龄",`time` datetime NULL  COMMENT "etl_时间"
) ENGINE = OLAP
DUPLICATE KEY(`partition_date`,`id`)
PARTITION BY RANGE(`partition_date`)
(START ("2024-01-01") END ("2024-06-01") EVERY (INTERVAL 1 MONTH))
DISTRIBUTED BY HASH(`partition_date`) BUCKETS 3
PROPERTIES (
"replication_num" = "3",
"dynamic_partition.enable" = "true",
"dynamic_partition.time_unit" = "MONTH",
"dynamic_partition.prefix" = "p",
"dynamic_partition.end" = "2",
"dynamic_partition.buckets" = "1"
);dynamic_partition.enable:开启动态分区特性
dynamic_partition.time_unit:动态分区的时间粒度,取值为 HOURDAY、WEEK、MONTHYEAR
dynamic_partition.prefix:动态分区的前缀名,默认值为 p
dynamic_partition.end:提前创建的分区数量,取值范围为正整数。根据 dynamic_partition.time_unit 属性的不同,以当天(周/月)为基准,提前创建对应范围的分区
dynamic_partition.start:TTL保留的动态分区的起始偏移,取值范围为负整数。根据 dynamic_partition.time_unit 属性的不同,以当天(周/月)为基准,分区范围在此偏移之前的分区将会被删除。(如果不填写,则默认为 Integer.MIN_VALUE,即 -2147483648,表示不删除历史分区。)
dynamic_partition.buckets:分区创建的分桶数

2、插入测试数据

mysql> INSERT INTO  example_db.test_tb VALUES-> ('2024-01-01','1', '张三', '20','2024-01-01 10:00:00'),-> ('2024-02-01','2', '李四', '20','2024-02-01 10:00:00'),-> ('2024-03-01','3', '王五', '20','2024-03-01 10:00:00');
Query OK, 3 rows affected (0.41 sec)
{'label':'insert_ff644af6-2caa-11ef-80c1-1aa2745601c2', 'status':'VISIBLE', 'txnId':'4964505'}mysql> select * from example_db.test_tb ;
+----------------+------+--------+------+---------------------+
| partition_date | id   | name   | age  | time                |
+----------------+------+--------+------+---------------------+
| 2024-02-01     |    2 | 李四   | 20   | 2024-02-01 10:00:00 |
| 2024-01-01     |    1 | 张三   | 20   | 2024-01-01 10:00:00 |
| 2024-03-01     |    3 | 王五   | 20   | 2024-03-01 10:00:00 |
+----------------+------+--------+------+---------------------+
3 rows in set (0.02 sec)

3、查看分区数据

mysql> show partitions from example_db.test_tb;
+-------------+---------------+----------------+---------------------+--------------------+--------+----------------+----------------------------------------------------------------------------+-----------------+---------+----------------+---------------+---------------------+--------------------------+----------+------------+----------+
| PartitionId | PartitionName | VisibleVersion | VisibleVersionTime  | VisibleVersionHash | State  | PartitionKey   | Range                                                                      | DistributionKey | Buckets | ReplicationNum | StorageMedium | CooldownTime        | LastConsistencyCheckTime | DataSize | IsInMemory | RowCount |
+-------------+---------------+----------------+---------------------+--------------------+--------+----------------+----------------------------------------------------------------------------+-----------------+---------+----------------+---------------+---------------------+--------------------------+----------+------------+----------+
| 16077719    | p202401       | 2              | 2024-06-17 21:10:41 | 0                  | NORMAL | partition_date | [types: [DATE]; keys: [2024-01-01]; ..types: [DATE]; keys: [2024-02-01]; ) | partition_date  | 3       | 3              | HDD           | 9999-12-31 23:59:59 | NULL                     | 0B       | false      | 0        |
| 16077720    | p202402       | 2              | 2024-06-17 21:10:41 | 0                  | NORMAL | partition_date | [types: [DATE]; keys: [2024-02-01]; ..types: [DATE]; keys: [2024-03-01]; ) | partition_date  | 3       | 3              | HDD           | 9999-12-31 23:59:59 | NULL                     | 0B       | false      | 0        |
| 16077721    | p202403       | 2              | 2024-06-17 21:10:41 | 0                  | NORMAL | partition_date | [types: [DATE]; keys: [2024-03-01]; ..types: [DATE]; keys: [2024-04-01]; ) | partition_date  | 3       | 3              | HDD           | 9999-12-31 23:59:59 | NULL                     | 0B       | false      | 0        |
| 16077722    | p202404       | 1              | 2024-06-17 21:10:25 | 0                  | NORMAL | partition_date | [types: [DATE]; keys: [2024-04-01]; ..types: [DATE]; keys: [2024-05-01]; ) | partition_date  | 3       | 3              | HDD           | 9999-12-31 23:59:59 | NULL                     | 0B       | false      | 0        |
| 16077723    | p202405       | 1              | 2024-06-17 21:10:25 | 0                  | NORMAL | partition_date | [types: [DATE]; keys: [2024-05-01]; ..types: [DATE]; keys: [2024-06-01]; ) | partition_date  | 3       | 3              | HDD           | 9999-12-31 23:59:59 | NULL                     | 0B       | false      | 0        |
| 16077786    | p202406       | 1              | 2024-06-17 21:10:25 | 0                  | NORMAL | partition_date | [types: [DATE]; keys: [2024-06-01]; ..types: [DATE]; keys: [2024-07-01]; ) | partition_date  | 1       | 3              | HDD           | 9999-12-31 23:59:59 | NULL                     | 0B       | false      | 0        |
| 16077791    | p202407       | 1              | 2024-06-17 21:10:25 | 0                  | NORMAL | partition_date | [types: [DATE]; keys: [2024-07-01]; ..types: [DATE]; keys: [2024-08-01]; ) | partition_date  | 1       | 3              | HDD           | 9999-12-31 23:59:59 | NULL                     | 0B       | false      | 0        |
| 16077796    | p202408       | 1              | 2024-06-17 21:10:25 | 0                  | NORMAL | partition_date | [types: [DATE]; keys: [2024-08-01]; ..types: [DATE]; keys: [2024-09-01]; ) | partition_date  | 1       | 3              | HDD           | 9999-12-31 23:59:59 | NULL                     | 0B       | false      | 0        |
+-------------+---------------+----------------+---------------------+--------------------+--------+----------------+----------------------------------------------------------------------------+-----------------+---------+----------------+---------------+---------------------+--------------------------+----------+------------+----------+
8 rows in set (0.00 sec)

三、Shell脚本示例

  • 以下是一个示例Shell脚本,用于根据当前时间删除指定时间段前的历史分区数据。该脚本支持按年、月、日分区进行删除。
#!/bin/bash# 配置数据库连接信息
ip="xxx"
port="xxx"
user="xxx"
passwd="xxx"
db="xxx"
tb="xxx"# 检查输入参数
if [ $# -ne 3 ]; thenecho "Usage: $0 {DAY|YEAR|MONTH} {start_date} {end_date}"echo "Example: $0 DAY 2024-06-08 2024-06-14"exit 1
fi# 获取参数
partition_type=$1
start_date=$2
end_date=$3# 转换日期格式
start_date=$(date -d "$start_date" +%Y%m%d)
end_date=$(date -d "$end_date" +%Y%m%d)# 生成分区列表
partitions=""case $partition_type inDAY)current_date=$start_datewhile [ "$current_date" -le "$end_date" ]; dopartitions+="p$current_date,"current_date=$(date -d "$current_date + 1 day" +%Y%m%d)done;;YEAR)start_year=$(date -d "$start_date" +%Y)end_year=$(date -d "$end_date" +%Y)for ((year=$start_year; year<=$end_year; year++)); dopartitions+="p$year,"done;;MONTH)start_month=$(date -d "$start_date" +%Y%m)end_month=$(date -d "$end_date" +%Y%m)current_month=$start_monthwhile [ "$(date -d "${current_month}01" +%Y%m)" -le "$end_month" ]; dopartitions+="p$current_month,"current_month=$(date -d "${current_month}01 + 1 month" +%Y%m)done;;*)echo "Invalid partition type: $partition_type"echo "Usage: $0 {DAY|YEAR|MONTH} {start_date} {end_date}"exit 1;;
esac# 去掉最后一个逗号
partitions=${partitions%,}# 生成truncate table语句
truncate_stmt="truncate table $db.$tb partition ($partitions);"# 输出truncate语句
echo $truncate_stmt# 执行truncate语句并检查结果
if echo $truncate_stmt | mysql -h $ip -u$user -p"$passwd" -P$port $db; thenecho "执行成功!"
elseecho "执行失败!"
fi

1、使用示例

假设我们需要删除以下分区:

  1. 按年分区:从2022-01-01到2024-06-01
  2. 按月分区:从2024-01-01到2024-06-01
  3. 按日分区:从2024-01-01到2024-06-01

我们可以通过以下命令运行脚本:

  • 按年分区
./truncate_partitions.sh YEAR 2022-01-01 2024-06-01生成truncate table语句:
truncate table example_db.test_tb partition (p2022,p2023,p2024);
执行成功!
  • 按月分区
./truncate_partitions.sh MONTH 2024-01-01 2024-06-01生成truncate table语句:
truncate table example_db.test_tb partition (p202401,p202402,p202403,p202404,p202405,p202406);
执行成功!
  • 按日分区
./truncate_partitions.sh DAY 2024-01-01 2024-06-01生成truncate table语句:
truncate table example_db.test_tb partition (p20240101,p20240102,p20240103,p20240104,p20240105,p20240106,p20240107,p20240108,p20240109,p20240110,p20240111,p20240112,p20240113,p20240114,p20240115,p20240116,p20240117,p20240118,p20240119,p20240120,p20240121,p20240122,p20240123,p20240124,p20240125,p20240126,p20240127,p20240128,p20240129,p20240130,p20240131,p20240201,p20240202,p20240203,p20240204,p20240205,p20240206,p20240207,p20240208,p20240209,p20240210,p20240211,p20240212,p20240213,p20240214,p20240215,p20240216,p20240217,p20240218,p20240219,p20240220,p20240221,p20240222,p20240223,p20240224,p20240225,p20240226,p20240227,p20240228,p20240229,p20240301,p20240302,p20240303,p20240304,p20240305,p20240306,p20240307,p20240308,p20240309,p20240310,p20240311,p20240312,p20240313,p20240314,p20240315,p20240316,p20240317,p20240318,p20240319,p20240320,p20240321,p20240322,p20240323,p20240324,p20240325,p20240326,p20240327,p20240328,p20240329,p20240330,p20240331,p20240401,p20240402,p20240403,p20240404,p20240405,p20240406,p20240407,p20240408,p20240409,p20240410,p20240411,p20240412,p20240413,p20240414,p20240415,p20240416,p20240417,p20240418,p20240419,p20240420,p20240421,p20240422,p20240423,p20240424,p20240425,p20240426,p20240427,p20240428,p20240429,p20240430,p20240501,p20240502,p20240503,p20240504,p20240505,p20240506,p20240507,p20240508,p20240509,p20240510,p20240511,p20240512,p20240513,p20240514,p20240515,p20240516,p20240517,p20240518,p20240519,p20240520,p20240521,p20240522,p20240523,p20240524,p20240525,p20240526,p20240527,p20240528,p20240529,p20240530,p20240531,p20240601);
执行成功!

四、总结

  • 通过使用 Shell 脚本,我们可以方便地生成 StarRocks 中 truncate table partition 的 SQL 语句,从而高效地管理分区表中的历史数据。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/29175.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

判断一组数据哪些是素数,并统计一个数组中元素的出现频率

import java.util.HashMap; import java.util.Map; public class Test_A26 {//判断一个数是不是素数public static boolean isPrime(int num){if(num<1){return false;}for(int i2;i<Math.sqrt(num);i){if(num%i0){return false;}}return true;}//统计数组中出现的频率 p…

python安装目录文件说明----Dlls文件夹

在Python的安装目录下&#xff0c;通常会有一个DLLs文件夹&#xff0c;它是Python标准库的一部分。这个文件夹包含了一些动态链接库&#xff08;Dynamic Link Libraries&#xff0c;DLL&#xff09;&#xff0c;这些库提供了Python解释器和标准库的一些关键功能。以下是对这个文…

模拟自动滚动并展开所有评论列表以及回复内容(如:抖音、b站等平台)

由于各大视频平台的回复内容排序不都是按照时间顺序&#xff0c;而且想看最新的评论回复讨论内容还需逐个点击展开&#xff0c;真的很蛋疼&#xff0c;尤其是热评很多的情况&#xff0c;还需要多次点击展开&#xff0c;太麻烦&#xff01; 于是写了一个自动化展开所有评论回复…

Kaggle比赛:成人人口收入分类

拿到数据首先查看数据信息和描述 import pandas as pd import seaborn as sns import matplotlib.pyplot as plt # 加载数据&#xff08;保留原路径&#xff0c;但在实际应用中建议使用相对路径或环境变量&#xff09; data pd.read_csv(r"C:\Users\11794\Desk…

嵌入式技术学习——c51——串口

一、串口介绍。 串口是一个 通讯接口。成本低&#xff0c;容易使用&#xff0c;通信线路简单&#xff0c;可实现两个设备的相互通信 单片机的串口可以实现单片机于单片机&#xff0c;单片机与电脑&#xff0c;单片机与其他模块相互通信。 51单片机内部自带UART&#xff0c;通…

一句话的哲学 (上集)

一&#xff0c;成全别人&#xff0c;委屈自己&#xff0c;轻软和不好意思就是杀死自己的最好的方式。 养一群吸血鬼&#xff0c;成全了别人&#xff0c;委屈了自己&#xff0c;最后呢&#xff0c;还被别人当成了傻瓜。 二 背后议论你的狗什么品种都有人活在世上&#xff0c;总会…

Flutter图像编辑器应用:创造生动美丽的照片体验

介绍 引言 想象一下&#xff0c;在一个阳光明媚的下午&#xff0c;与家人或朋友漫步在风景如画的街道上。拿出手机&#xff0c;迫不及待地捕捉这一刻的美好&#xff0c;按下快门&#xff0c;留下了一张充满回忆的照片。 然而&#xff0c;回到家后发现照片的亮度有些偏暗&…

【完结】无代码网页爬虫软件——八爪鱼采集器入门基础教程

《八爪鱼采集器入门基础教程》大纲如下&#xff1a; 课程所提软件&#xff0c;八爪鱼采集器下载&#xff1a; 1.软件分享[耶]八爪鱼&#xff0c;爬取了几百条网站上的公开数据&#xff0c;不用学代码真的很方便。[得意]2.发现了一个很棒的软件&#xff0c;?不用学python也可…

周跳的探测及修复

前言&#xff1a; 本章节代码均在Gitee中开源&#xff1a; 导航工程: 导航工程及其有关的所有项目 - Gitee.comhttps://gitee.com/Ehundred/navigation-engineering/tree/master/%E5%8D%AB%E6%98%9F%E5%AF%BC%E8%88%AA%E5%8E%9F%E7%90%86/%E5%91%A8%E8%B7%B3%E6%8E%A2%E6%B5%…

工作学习记录

代码块含义大体解析&#xff1a; 1. QSqlDatabase mCurDatabase; QString driverName mCurDatabase.driverName(); 返回连接的驱动名。 如QSQLITE 2.sqlite数据库中查询是否存在表tableName select * from sqlite_master where type table and nametableName 3. QSqlQ…

关于到ORCL数据库实例的连接,哪个语句是正确的?

您的hq.us.example.com主机的tnsnames.ora中有以下条目。 ORCL (DESCRIPTION (ADDRESS_LIST (ADDRESS (PROTOCOL TCP)(HOST hq.us.example.com)(PORT 1521)) ) CONNECT_DATA (SERVICE_NAME ORCL.us.example.com) ) 你发出以下命令: Sqlplus H…

软件测试--性能测试

1.性能 时间&#xff1a;响应时间 资源&#xff1a;资源的消耗情况 2.性能测试 使用自动化工具&#xff0c;模拟不同场景&#xff0c;对软件各项性能指标进行测试和评估的过程 3.为什么做性能测试 1.评估系统能能力 2.寻找性能瓶颈&#xff0c;优化性能 4.什么时候做性…

深入解析Spring Boot的常用注解和组件(下)

在上一篇文章中&#xff0c;我们介绍了Spring Boot的常用注解及其应用场景。本文将继续探讨Spring Boot的常用组件及其在实际开发中的应用。## 2. Spring Boot的常用组件### 2.1 Spring Boot StarterSpring Boot Starter是Spring Boot项目的一部分&#xff0c;它提供了一组方便…

什么是Vue开发技术

概述 Vue.js 是一个用于构建用户界面的渐进式框架&#xff0c;它设计得非常灵活&#xff0c;可以轻松地被集成到任何项目中。 vue是视图的发音&#xff0c;其目的是帮助开发者易于上手&#xff0c;提供强大的功能构建复杂的应用程序 示例 以下是vue基本的语法概述 声明式渲…

探索C嘎嘎的奇妙世界:第一关---命名空间

1:命名空间 C就是延续C语言的一些不足进行改进和优化,也是一门值得我们深入探索和钻研的编程语言。它就像一个充满宝藏的宝库&#xff0c;等待着我们去发掘其中的奥秘和惊喜.那么就让我们来打开C的大门,进行探索吧!!! 首先,C要在C语言优化的第一个问题:命名冲突, 那么C语言是具…

探索未来工作新伙伴:机器人流程自动化(RPA)揭秘

想象一下&#xff0c;如果你的日常工作中那些繁琐、重复的任务&#xff0c;比如数据录入、文件整理、邮件发送等&#xff0c;都能自动完成&#xff0c;你将拥有更多时间专注于真正需要创造力和智慧的工作&#xff0c;是不是听起来就像拥有了一个私人助理&#xff1f;这并不是遥…

VUE3版本新特性

VUE3版本新特性 VUE3和VUE2的区别路由的使用vite安装项目新特性使用 1.VUE3和VUE2的区别 2020年9月18日&#xff0c;Vue.js发布版3.0版本&#xff0c;代号&#xff1a;One Piece 于 2022 年 2 月 7 日星期一成为新的默认版本! Vue3性能更高,初次渲染快55%, 更新渲染快133% 。…

推荐 3 款小巧的文件压缩、投屏和快速启动软件,请收藏,避免找不到

Maya Maya是一款由博主25H开发的体积小巧、简单易用的快速启动工具。它的操作逻辑和界面设计几乎复刻了Rolan早期版本&#xff0c;功能上与Rolan几乎别无二致。Maya支持多文件拖拽添加启动、快捷键呼出、自动多列显示等功能。此外&#xff0c;Maya还具备lnk文件解析功能。 May…

多目标粒子群算法(MOPSO):原理讲解与代码实现 Matlab代码免费获取

声明&#xff1a;文章是从本人公众号中复制而来&#xff0c;因此&#xff0c;想最新最快了解各类智能优化算法及其改进的朋友&#xff0c;可关注我的公众号&#xff1a;强盛机器学习&#xff0c;不定期会有很多免费代码分享~ 目录 粒子群算法 多目标粒子群算法 一、外部档案…

059、Python 函数练习:用函数实现求两个数的最大公约数和最小公倍数

普及&#xff1a;写程序有两个终极原则&#xff1a;高内聚&#xff0c;低耦合。 所谓高内聚指的是一个模块或类内部各个元素&#xff08;方法、属性等&#xff09;彼此关联紧密&#xff0c;共同完成一个特定的任务或目标。具有高内聚的模块或类内的元素之间联系紧密&#xff0…