“作为21世纪的数据工程师,你是否遇到过这样的烦恼:删除了几条数据,查询性能却直线下降;想要重写某个分区的数据,却要忍受服务暂停之痛;CDC同步删除数据时总是步履维艰... 别担心,Apache Doris早已为你准备好了一套数据删除的五大神技。从简单的DELETE语句到优雅的原子替换,从高效的批量删除到灵活的临时分区,总有一款适合你的场景。 今天,就让我们一起打开Doris的工具箱,看看这些删除功能如何帮你轻松掌控数据,让数据管理变得优雅而高效。
大数据的世界中,数据删除看似简单,实则暗藏玄机。作为一款高性能的分析型数据库,Apache Doris提供了多种灵活的数据删除方案,让数据管理更加得心应手:
不知道你是否遇到过这样的场景:某个订单被误操作,需要删除对应的数据;或者某些过期数据需要清理,但只想删除特定条件的记录。这时候,DELETE语句就派上用场了。
DELETE语句是Doris提供的最基础也是最灵活的数据删除方式。通过WHERE子句的条件表达式,我们可以精确定位需要删除的数据。
DELETE语句支持单一条件删除:
DELETE FROM orders WHERE order_id = 10086;
也支持多个条件的组合删除:
DELETE FROM orders WHERE create_date < '2024-11-14'
AND status = 'CANCELLED';
在分区表上,我们可以通过PARTITION关键字指定要操作的分区:
DELETE FROM orders PARTITION(p202312)
WHERE order_amount < 100;
对于UNIQUE KEY模型的表,Doris还提供了Using子句的删除方式。这种方式允许我们利用其他表的数据作为删除条件:
DELETE FROM orders USING refund_list
WHERE orders.order_id = refund_list.order_id;
DELETE语句虽然灵活,但也有一些使用注意事项:
为什么会对查询性能产生影响呢?这是因为DELETE在Doris中是通过记录删除条件来实现的。每次DELETE都会生成一个标记删除的数据版本,查询时需要过滤这些已删除的数据。
这种机制让DELETE操作能够快速完成,但随着删除操作的增多,查询时需要处理的条件也会增加,从而影响查询性能。
那么如何应对这种情况呢?这就要说到Doris提供的其他删除方案了。接下来一起探讨批量删除和TRUNCATE操作...
前面说到DELETE语句会影响查询性能的问题。那么面对大规模数据删除需求时,有没有更好的方案?答案就是批量删除。
Doris的批量删除别出心裁,它基于导入机制实现,通过一个隐藏字段__DORIS_DELETE_SIGN__来标记数据是否删除。这种设计让批量删除既保持了高性能,又不会像DELETE语句那样影响查询。
以Stream Load为例,我们可以这样执行批量删除:
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列值即可。这种方式特别适合从上游系统同步删除操作的场景,比如:
相比DELETE和批量删除,TRUNCATE则是一个更加简单粗暴的方案 - 直接清空表或分区的所有数据。它的优势在于:
清空整表数据:
TRUNCATE TABLE orders;
清空指定分区:
TRUNCATE TABLE orders PARTITION(p202312, p202311);
使用TRUNCATE需要注意:
接下来让我们继续探讨表原子替换和临时分区这两个更高级的数据删除方案...
表原子替换提供了一种优雅的数据重写方案。它通过一个原子操作,将两张表的数据瞬间切换。这个过程中查询请求不会中断,用户无感知。
基本语法很简单:
ALTER TABLE table1 REPLACE WITH TABLE table2
[PROPERTIES('swap' = 'true')];
其中swap参数很有意思:
一个经典应用场景是数据重写:
-- 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;
临时分区则是表原子替换理念在分区级别的延伸。它让我们能够:
使用临时分区的典型场景:
-- 创建临时分区
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);
-- 创建新的分桶数的临时分区
ALTER TABLE orders ADD TEMPORARY PARTITION tp_202312
VALUES LESS THAN ('2024-01-01')
DISTRIBUTED BY HASH(order_id) BUCKETS 48;
-- 数据迁移并替换
-- 创建一个大分区的临时分区
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);
在一个广告平台项目中,我们需要定期对点击流数据进行清洗和优化。通过临时分区,我们实现了一个优雅的解决方案:
这样既保证了数据质量,又不影响在线查询。
表原子替换和临时分区的强大之处在于:它们提供了一种无损的数据重写方案,让数据管理变得更加灵活和安全。
数据管理就像园艺,需要适时地修剪、整理,让数据像花园一样井然有序。Doris提供的这五大数据删除技巧,就是我们打理数据花园的利器。
下期,我们将一起探讨Doris其它更有趣有用有价值的内容,敬请期待!