前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Doris删除之术:五大神技让你的数据管理秀起来

Doris删除之术:五大神技让你的数据管理秀起来

作者头像
一臻数据
发布于 2024-12-24 08:16:49
发布于 2024-12-24 08:16:49
32600
代码可运行
举报
文章被收录于专栏:一臻数据一臻数据
运行总次数:0
代码可运行

作为21世纪的数据工程师,你是否遇到过这样的烦恼:删除了几条数据,查询性能却直线下降;想要重写某个分区的数据,却要忍受服务暂停之痛;CDC同步删除数据时总是步履维艰... 别担心,Apache Doris早已为你准备好了一套数据删除的五大神技。从简单的DELETE语句到优雅的原子替换,从高效的批量删除到灵活的临时分区,总有一款适合你的场景。 今天,就让我们一起打开Doris的工具箱,看看这些删除功能如何帮你轻松掌控数据,让数据管理变得优雅而高效。

Doris数据删除功能概述

大数据的世界中,数据删除看似简单,实则暗藏玄机。作为一款高性能的分析型数据库,Apache Doris提供了多种灵活的数据删除方案,让数据管理更加得心应手:

  1. Delete条件精准删除
  2. 基于隐藏字段进行批量删除
  3. 简单粗暴的TRUNCATE清空
  4. 表原子替换瞬切
  5. 分区级别的原子替换

DELETE语句,精准定位数据删除

不知道你是否遇到过这样的场景:某个订单被误操作,需要删除对应的数据;或者某些过期数据需要清理,但只想删除特定条件的记录。这时候,DELETE语句就派上用场了。

DELETE语句是Doris提供的最基础也是最灵活的数据删除方式。通过WHERE子句的条件表达式,我们可以精确定位需要删除的数据。

DELETE语句支持单一条件删除:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
DELETE FROM orders WHERE order_id = 10086;

也支持多个条件的组合删除:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
DELETE FROM orders WHERE create_date < '2024-11-14' 
AND status = 'CANCELLED';

在分区表上,我们可以通过PARTITION关键字指定要操作的分区:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
DELETE FROM orders PARTITION(p202312) 
WHERE order_amount < 100;

对于UNIQUE KEY模型的表,Doris还提供了Using子句的删除方式。这种方式允许我们利用其他表的数据作为删除条件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
DELETE FROM orders USING refund_list
WHERE orders.order_id = refund_list.order_id;

DELETE语句虽然灵活,但也有一些使用注意事项:

  1. 使用表模型 Aggregate 时,只能指定 Key 列上的条件。
  2. 当选定的 Key 列不存在于某个 Rollup 中时,无法进行 Delete。
  3. 条件之间只能是“与”的关系。若希望达成“或”的关系,需要将条件分写在两个 DELETE 语句中;
  4. 如果为分区表,需要指定分区,如果不指定,Doris 会从条件中推断出分区。两种情况下,Doris 无法从条件中推断出分区:1) 条件中不包含分区列;2) 分区列的 op 为 not in。当分区表未指定分区,或者无法从条件中推断分区的时候,需要设置会话变量 delete_without_partition 为 true,此时 Delete 会应用到所有分区。
  5. delete语句可能会降低执行后一段时间内的查询效率。影响程度取决于语句中指定的删除条件的数量。指定的条件越多,影响越大。

为什么会对查询性能产生影响呢?这是因为DELETE在Doris中是通过记录删除条件来实现的。每次DELETE都会生成一个标记删除的数据版本,查询时需要过滤这些已删除的数据。

这种机制让DELETE操作能够快速完成,但随着删除操作的增多,查询时需要处理的条件也会增加,从而影响查询性能。

那么如何应对这种情况呢?这就要说到Doris提供的其他删除方案了。接下来一起探讨批量删除和TRUNCATE操作...

批量删除:另辟蹊径的Delete实现

前面说到DELETE语句会影响查询性能的问题。那么面对大规模数据删除需求时,有没有更好的方案?答案就是批量删除。

Doris的批量删除别出心裁,它基于导入机制实现,通过一个隐藏字段__DORIS_DELETE_SIGN__来标记数据是否删除。这种设计让批量删除既保持了高性能,又不会像DELETE语句那样影响查询。

以Stream Load为例,我们可以这样执行批量删除:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
curl --location-trusted -u root: \
-H "column_separator:," \
-H "columns: id,name,score" \
-H "merge_type: DELETE" \
-T delete_data.csv \
http://doris_host:8030/api/test_db/test_table/_stream_load

数据文件中只需包含要删除记录的Key列值即可。这种方式特别适合从上游系统同步删除操作的场景,比如:

  • 通过CDC工具同步MySQL的删除操作
  • 批量清理过期数据
  • 删除不合格的历史数据

TRUNCATE:一键清空的利器

相比DELETE和批量删除,TRUNCATE则是一个更加简单粗暴的方案 - 直接清空表或分区的所有数据。它的优势在于:

  1. 操作原子性,要么全部成功,要么全部失败
  2. 不影响查询性能
  3. 执行速度快,不受数据量影响
  4. 释放存储空间

清空整表数据:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
TRUNCATE TABLE orders;

清空指定分区:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
TRUNCATE TABLE orders PARTITION(p202312, p202311);

使用TRUNCATE需要注意:

  1. 操作不可恢复,需要谨慎使用
  2. 执行时表状态必须为NORMAL
  3. 可能会导致正在进行的导入任务失败

接下来让我们继续探讨表原子替换和临时分区这两个更高级的数据删除方案...

表原子替换,无缝切换的艺术

表原子替换提供了一种优雅的数据重写方案。它通过一个原子操作,将两张表的数据瞬间切换。这个过程中查询请求不会中断,用户无感知。

基本语法很简单:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ALTER TABLE table1 REPLACE WITH TABLE table2
[PROPERTIES('swap' = 'true')];

其中swap参数很有意思:

  • 当swap=true时,两张表的数据互换
  • 当swap=false时,table2的数据替换table1,然后table2被删除

一个经典应用场景是数据重写:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-- 1.创建新表
CREATE TABLE orders_new LIKE orders;

-- 2.数据重写导入
INSERT INTO orders_new 
SELECT * FROM orders WHERE status != 'INVALID';

-- 3.原子替换
ALTER TABLE orders REPLACE WITH TABLE orders_new;

临时分区,分区级别的原子替换

临时分区则是表原子替换理念在分区级别的延伸。它让我们能够:

  • 创建一个临时分区用于数据重写
  • 数据准备就绪后原子替换正式分区
  • 过程对查询透明,保证数据一致性

使用临时分区的典型场景:

  1. 分区数据重写
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-- 创建临时分区
ALTER TABLE orders ADD TEMPORARY PARTITION tp_202312
VALUES LESS THAN ('2024-01-01');

-- 数据重写
INSERT INTO orders TEMPORARY PARTITION(tp_202312)
SELECT * FROM orders PARTITION(p202312) WHERE ...;

-- 分区替换
ALTER TABLE orders REPLACE PARTITION (p202312) 
WITH TEMPORARY PARTITION (tp_202312);
  1. 修改分桶数
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-- 创建新的分桶数的临时分区
ALTER TABLE orders ADD TEMPORARY PARTITION tp_202312
VALUES LESS THAN ('2024-01-01')
DISTRIBUTED BY HASH(order_id) BUCKETS 48;

-- 数据迁移并替换
  1. 合并小分区
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-- 创建一个大分区的临时分区
ALTER TABLE orders ADD TEMPORARY PARTITION tp_2023
VALUES LESS THAN ('2024-01-01');

-- 导入多个小分区的数据
INSERT INTO orders TEMPORARY PARTITION(tp_2023)
SELECT * FROM orders PARTITION(p202310,p202311,p202312);

-- 替换分区
ALTER TABLE orders REPLACE PARTITION(p202310,p202311,p202312)
WITH TEMPORARY PARTITION(tp_2023);

实战小结

在一个广告平台项目中,我们需要定期对点击流数据进行清洗和优化。通过临时分区,我们实现了一个优雅的解决方案:

  1. 每天凌晨创建临时分区
  2. 对原始数据进行清洗、去重、打标签等处理
  3. 处理完成后原子替换前一天的分区

这样既保证了数据质量,又不影响在线查询。

表原子替换和临时分区的强大之处在于:它们提供了一种无损的数据重写方案,让数据管理变得更加灵活和安全。

数据管理就像园艺,需要适时地修剪、整理,让数据像花园一样井然有序。Doris提供的这五大数据删除技巧,就是我们打理数据花园的利器。

下期,我们将一起探讨Doris其它更有趣有用有价值的内容,敬请期待!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-11-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 一臻数据 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
应用实践 | 特步集团基于 Apache Doris 的零售数据仓库项目实践
特步集团有限公司是中国领先的体育用品企业之一,主要从事运动鞋、服装及配饰的设计、开发、制造和销售。为了提高特步零售 BI 主题数据分析的准确性和时效性,降低对 SAP HANA 平台的依赖,2020 年 11 月特步集团首次引入了 Apache Doris 进行数据仓库搭建试点。在经历实时日报(移动端)和《特步全网零售战绩》大屏两个小项目的成功后,于 2021 年 3 月开始逐步启动特步儿童 BI、特步电商 BI、双十一大屏、特步新品牌 BI 等多个项目,经过一年的努力,初步完成了基于 Apache Doris 的零售数据仓库搭建和上线运行。
从大数据到人工智能
2022/05/26
9710
应用实践 | 特步集团基于 Apache Doris 的零售数据仓库项目实践
在 Doris 中,如何实现数据的自动分区和手动分区?
在 Apache Doris 中,数据分区是一种重要的优化手段,可以提高查询性能和管理大规模数据。Doris 支持自动分区和手动分区两种方式。
代码小李
2025/01/26
4690
ClickHouse DDL
数据库起到了命名空间的作用,可以有效规避命名冲突的问题,也为后续的数据隔离提供了支撑。任何一张数据表,都必须归属在某个数据库之下。创建数据库的完整语法如下所示:
CoderJed
2022/01/07
1.3K0
Doris数据导出全攻略 - 让数据流转自由如风
在大数据生态体系中,数据导出类似于一座桥梁,连接着不同的数据系统。没有高效便捷的数据导出功能,再强大的数据分析能力也会被局限。Apache Doris对于这座桥梁,设计了三种灵活的数据导出方案,满足不同场景下的数据流转需求。
一臻数据
2024/12/24
2340
Doris数据导出全攻略 - 让数据流转自由如风
Oracle 删除大量表记录操作总结
存放大数据量的表,其表空间占用也比较大,删除数据后并不会自动释放这些记录占用的表空间,所以,即便表里面数据量很少,查询效率依旧很慢,所以,需要释放表空间。
授客
2022/09/29
1.2K0
MySQL 快速删除大量数据(千万级别)的几种实践方案——附源码
 笔者最近工作中遇见一个性能瓶颈问题,MySQL表,每天大概新增776万条记录,存储周期为7天,超过7天的数据需要在新增记录前老化。连续运行9天以后,删除一天的数据大概需要3个半小时(环境:128G, 32核,4T硬盘),而这是不能接受的。当然如果要整个表删除,毋庸置疑用
NaughtyCat
2020/10/09
7.8K0
50条MySQL常用脚本
SQL数据库开发
2024/04/25
1780
50条MySQL常用脚本
ClickHouse SQL基本语法和导入导出实战
数据库起到了命名空间的作用,可以有效规避命名冲突的问题,也为后续的数据隔离提供了支撑。任何一张数据表,都必须归属在某个数据库之下。
王知无-import_bigdata
2022/04/13
2.7K0
ClickHouse SQL基本语法和导入导出实战
「硬刚Doris系列」Doris高级用法
Rollup 可以理解为 Table 的一个物化索引结构。物化 是因为其数据在物理上独立存储,而 索引 的意思是,Rollup可以调整列顺序以增加前缀索引的命中率,也可以减少key列以增加数据的聚合度。
王知无-import_bigdata
2022/06/05
2.1K0
36条MySQL实用小技巧
实际上一直都有在学习,只是公众号的算法机制让很多人刷不到,看得人比较少,这才将这些内容分享到各个群和朋友圈,希望能让更多人看到。
SQL数据库开发
2024/04/25
1510
36条MySQL实用小技巧
硬刚Doris系列」Apache Doris基本使用和数据模型
我们使用 event_day 列作为分区列,建立3个分区: p201706, p201707, p201708
王知无-import_bigdata
2022/06/05
2.7K0
硬刚Doris系列」Apache Doris基本使用和数据模型
大数据ClickHouse(十五):ClickHouse SQL语法之DDL 操作讲解
DDL:Data Definition Language,数据库定义语言。在ClickHouse中,DDL语言中修改表结构仅支持Merge表引擎、Distributed表引擎及MergeTree家族的表引擎,SQL 中的库、表、字段严格区分大小写。
Lansonli
2022/08/31
1.9K0
大数据ClickHouse(十五):ClickHouse SQL语法之DDL 操作讲解
MySQL DDL 数据定义
在 MySQL 中,DATABASE 和 SCHEMA 在语法上是等效的,它们都用于创建数据库。在其他 RDBMS(如 Oracle 和 SQL Server)
恋喵大鲤鱼
2023/10/12
2870
【Hive】DDL 与 DML 操作
删除数据库的模型行为是 RESTRICT,如果数据库不为空,需要添加 CASCADE 进行级联删除。
阿泽 Crz
2020/07/20
1.8K0
大数据-hive基本语法整理
用户11147438
2024/06/04
2660
当数据工程师遇上"Doris魔法视图",性能飞升的背后藏着什么?
凌晨,数据工程师小红正对着一堆复杂的查询语句发愁。复杂的多表JOIN、层层嵌套的聚合计算,让查询性能迟迟得不到提升。这时,他突然想到了Doris 2.1版本中发布的多表异步物化视图功能..."
一臻数据
2024/12/24
860
当数据工程师遇上"Doris魔法视图",性能飞升的背后藏着什么?
【Apache Doris】周FAQ集锦:第 8 期
在这个栏目中,每周将筛选社区反馈的热门问题和话题,重点回答并进行深入探讨。旨在为广大用户和开发者分享有关 Apache Doris 的常见问题。
一臻数据
2024/12/24
1330
【Apache Doris】周FAQ集锦:第 8 期
MySQL数据导出、删除、表重命名、时间转化及级联查询
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
奋飛
2019/08/15
2.5K0
mysql数据库优化总结
innodb_buffer_pool_size = 50% of system memory innodb_max_dirty_pagesPer_latch = 1000 复制代码
samRsa
2025/04/28
1180
mysql数据库优化总结
Oracle SQL调优之表设计
分区表使用与查询频繁而更新数据不频繁的情况,不过要记得加全局索引,而不加分区索引,分区类型:分区分为范围分区、列表分区、HASH分区、组合分区四种,用了分区表,查询时就定位到对应的区,而不用全表,所以查询效率比普通表好,当然有很多细节,还是建议看《收获,不止sql优化》一书
SmileNicky
2019/06/11
5040
相关推荐
应用实践 | 特步集团基于 Apache Doris 的零售数据仓库项目实践
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验