大幅提升数据库删除性能丨DolphinDB 软删除功能详解

为满足近来用户对某些场景下删除性能的更高要求,我们在2.00.11版本的 DolphinDB Server 中特别支持了软删除的功能。本文作为该功能的使用教程,将详细介绍软删除的实现原理与应用场景,同时提供性能测试案例以供参考

1. 概述

软删除(Soft Delete)是一种在数据库中处理数据删除的方法,这种删除方式并不是直接从数据库中移除数据,而是通过特定的标记方式在查询的时候将此记录过滤掉,在后台合并数据文件时才真正删除数据。相对于硬删除(Hard Delete),即直接从数据库中永久删除数据,软删除以追加方式进行数据删除,可大幅度提升列式数据库删除的效率。

2. 原理介绍

相比于常见的硬删除,软删除是一种新的设计方案。本节将先对硬删除和软删除的原理进行详细介绍,然后对比两种删除方式的特点。

2.1 硬删除的删除和查询逻辑

删除逻辑

直接从文件中删除数据。

  1. 分区剪枝:根据删除条件进行分区剪枝,确定删除涉及的分区。
  2. 查到内存删除: 取出对应分区所有数据到内存后,根据条件删除数据。
  3. 写回删除后的分区数据到新目录: 将删除后的数据重新写入数据库,系统会使用一个新的 CHUNK 目录(默认是 “物理表名_cid”)来保存写入的数据,旧的文件将被定时回收(默认 30 min)。

查询逻辑

从文件中读取查询结果。

  1. 分区剪枝:根据查询条件进行分区剪枝,确定查询涉及的分区。
  2. 读到内存:根据查询条件在分区的文件中读取查询结果。

2.2 软删除的删除和查询逻辑

删除逻辑

追加写入带删除标记的数据。

  1. 分区剪枝:根据查询语句进行分区剪枝,缩窄查询范围。
  2. 读到内存获取待删除数据:根据查询条件,查询出需要删除的数据。
  3. 追加写入待删除数据:给需要删除的数据打上删除标记(deletion flag),并将排序列(sort column)和分区列(partition column)外字段值置为空值,以 append 方式将数据追加写入 TSDB。

查询逻辑

读取查询结果,过滤带删除标记的数据。

  1. 分区剪枝:根据查询条件进行分区剪枝,确定查询涉及的分区。
  2. 读到内存:根据查询条件在分区内读取查询结果(包含删除前的数据和带删除标记的数据)到内存中。
  3. 过滤数据:删除内存中带删除标记的数据。

2.3 软删除的特点

从上面的原理介绍可以看出,软删除相比硬删除有如下特点:

  1. 删除少量数据快,删除大量数据慢:软删除写入的是待删除数据,硬删除写入的是未删除数据。如果删除的数据量少,软删除需要写入的数据就比硬删除少,性能更好;反之则更差。
  2. 查询性能不如硬删除:查询时,软删除相比硬删除,除了读取未删除的数据,还需要读取删除前的数据和带删除标记的数据,最后还需要在内存中做一次过滤,综合性能比硬删除差。

3. 使用介绍

采用硬删除或者软删除,必须满足以下条件:

  1. database 创建库时指定 TSDB 引擎。
  2. createTable 或者 createPartitionedTable 函数创建表时,指定 softDelete 为 true 且 keepDuplicates=LAST
  3. 使用 delete 删除且 SQL 语句中包含 where 条件。

3.1 软删除使用条件

步骤条件示例语句说明
创建数据库engine 参数值为 TSDBdb = database("dfs://softDelete",VALUE,[2023.01.01],,"TSDB")创建一个 TSDB 引擎,以值分区的数据库。
创建数据表keepDuplicates 参数值为 LAST创建表时 softDelete 参数值为 true,即开启软删除。t = table(1:0,`Time`Symbol`Price,[TIMESTAMP,STRING,DOUBLE])创建维度表:createTable(dbHandle=db,table=t, tableName="memTable",sortColumns=`Symbol`Time,keepDuplicates=LAST, softDelete=true)创建分区表:createPartitionedTable(dbHandle=db,table=t, tableName="parTable",partitionColumns=`Time,sortColumns=`Symbol`Time,keepDuplicates=LAST, softDelete=true)DolphinDB-createTableDolphinDB-createPartitionedTable
delete 语句必须指定 where 过滤条件维度表删除数据:delete from loadTable("dfs://softDelete", "memTable") where Date = 2024.01.02 and Price > 50分区表删除数据:delete from loadTable("dfs://softDelete", "parTable") where Date = 2024.01.02 and Price > 50维度表:查出符合 Price > 50条件的数据,将数据除sortColumns 列外的数据设置为空,在数据上打上删除标记,写回数据表。分区表:先进行分区剪枝,选择 2024.01.02 这个分区的数据,查出符合 Price > 50条件的数据,将数据除sortColumns 列外的数据设置为空,在数据上打上删除标记,写回数据表。

4 性能测试

4.1 环境配置

测试共使用三台配置相同的服务器,具体硬件配置如表所示。

处理器核数内存操作系统硬盘网络
Intel(R) Xeon(R) Silver 4216 CPU @ 2.10GHz64512 GBCentOS Linux release 7.6HDD10000 Mb/s

基于 DolphinDB Server 2.00.11 版本部署了双副本高可用集群。

4.2 模拟数据

首先,创建数据库和数据表,并启用软删除功能。

//创建数据库, 使用 TSDB 引擎
db1 = database(,VALUE,[2023.01.01])
db2 = database(,HASH,[SYMBOL, 25])
db = database("dfs://softDelete.level2_tl",COMPO,[db1,db2],,"TSDB")
//创建数据表
colName = `ChannelNo`ApplSeqNum`MDStreamID`SecurityID`SecurityIDSource`Price`OrderQty`Side`TradeTIme`OrderType`OrderIndex`LocalTime`SeqNo`Market`DataStatus`BizIndex
colType = [INT,LONG,INT,SYMBOL,INT,DOUBLE,INT,SYMBOL,TIMESTAMP,SYMBOL,INT,TIME,LONG,SYMBOL,INT,LONG]
tbSchema = table(1:0, colName, colType)
//softDelete设置为true,启用软删除
db.createPartitionedTable(table=tbSchema,tableName=`entrust,partitionColumns=`TradeTIme`SecurityID,sortColumns=`Market`SecurityID`TradeTIme,keepDuplicates=LAST,softDelete=true)

构造模拟数据并写入分布式表。

n = 500000
Symbol = `000021`000155`000418`000673`000757`000759`000851`000856`000909`000961
TradeTime = array(timestamp)
for(i in 0:Symbol.size()){TradeTime.append!(2015.07.01 09:15:00.160..((2015.07.01 09:15:00.160+n/10)-1))
}
t = table(take(int(),n) as ChannelNo,take(long(),n) as ApplSeqNum,take(int(),n) as MDStreamID,take(Symbol,n) as SecurityID,take(int(),n) as SecurityIDSource,rand(100.0,n) as Price,rand(20,n)*100 as OrderQty,rand(`S`B,n) as Side,TradeTime as TradeTIme,take(["0","1","2"],n) as OrderType,take(int(),n) as OrderIndex,take(time(),n) as LocalTime,take(long(),n) as SeqNo,take(`sz,n) as Market,take(int(),n) as DataStatus,take(long(),n) as BizIndex
)
loadTable("dfs://softDelete.level2_tl","entrust").append!(t)

具体测试代码请下载附录的 .txt 文件。

4.3 性能分析

数据删除百分比软删除/硬删除delete耗时比例软删除(level file合并前)/硬删除(level file合并前)select耗时比例软删除(level file合并后)/硬删除(level file合并后)select耗时比例
100.2361.5021.219
200.3181.8311.22
300.4461.881.254
400.5781.9471.309
500.762.1631.243
601.0932.5411.297
701.2733.0281.22
801.8563.381.172
902.9214.3190.935

通过对比不同数据删除百分比下的删除时间,可以得出结论:删除的数据量越少,软删除的性能越好

这是因为硬删除在删除少量百分比的数据时需要写回剩余大量的原数据,而软删除仅需要写少量百分比的待删除数据。以10%数据删除百分比为例,此时软删除的性能是硬删除的七倍左右。随着数据删除的数量不断上升,硬删除需要写回的数据量就不断减少,软删除需要写回的数据量在不断增加,所以在删除一个分区的大量数据时硬删除优于软删除的性能。

通过对比不触发 level file 合并和触发 level file 合并的查询时间,可以得出不触发 level file 合并查询的性能会略微下降,在触发 level file 合并后, 查询的性能影响不大。因为硬删除会把数据全部重写成一个 level file;而软删除之后最终会生成两个 level file,会增加去重的消耗。但在触发 level file 合并之后,两者性能基本相同。

5 小结

相较于硬删除,虽然软删除支持的范围更小,但软删除可以大幅度提升删除的性能。不过在具体使用中须注意,用户需要定时触发 Level File 的合并来避免查询性能的损耗。

6 附录

6.1 常见问题

问题回答
createPartitionedTable(dbHandle, table, tableName, partitionColumns, [compressMethods], [sortColumns], [keepDuplicates=ALL], [sortKeyMappingFunction], [softDelete=false]). The softDelete parameter is available only when engineType is specified as "TSDB" and keepDuplicates as "LAST".在 softDelete 指定为 true 时,keepDuplicates 需要指定为 LAST
The softDelete parameter is available only when engineType is specified as "TSDB" and keepDuplicates as "LAST".软删除仅在 TSDB 引擎支持,需要在建库时指定engine=“TSDB”

6.2 相关脚本

性能测试的脚本:软删除性能测试.txt

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

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

相关文章

[蓝桥杯2018初赛]耐摔指数 (动态规划)

题目描述: x星球的居民脾气不太好,但好在他们生气的时候唯一的异常举动是:摔手机。 各大厂商也就纷纷推出各种耐摔型手机。 x星球的质监局规定了手机必须经过耐摔测试,并且评定出一个耐摔指数来,之后才允许上市流通。 …

C#区域医院云LIS信息管理系统源码 标本管理、两癌筛查、数据分析、试剂管理

目录 ​编辑 区域医院云LIS系统功能亮点: 云LIS系统功能: 一、 基础管理 二、 前处理(实验室) 三、 标本处理 四、 样本检验 五、 统计报表 六、 质控管理 七、 基本工作流程 区域LIS系统特点&#xff1…

Shell函数

一、Shell函数 1、函数定义 函数定义的语法格式: function function_name() {statements[return int_value] }说明: function是 Shell 中的关键字,专门用来定义函数;function_name是函数名;statements是函数要执行…

台湾香港澳门媒体宣发稿报道有哪些平台资源,跨境出海推广新闻营销公司告诉你

【本篇由言同数字科技有限公司原创】随着全球化的快速发展和互联网的普及,品牌越来越重视海外市场的开拓。作为亚洲地区的重要经济中心,香港、台湾和澳门不仅具有独特的地理位置和文化背景,还拥有丰富的媒体资源。在本文中,我们将…

如何使用程序通过OCR识别解析PDF中的表格

https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.7/ppstructure/table/README_ch.md#41-%E5%BF%AB%E9%80%9F%E5%BC%80%E5%A7%8B Paddle-structure是目前我们能找到的可以做中英文版面分析较好的一个基础模型,其开源版可以识别十类页面元素。这篇文章介绍…

解决IDEA git 提交慢的问题

文章目录 前言解决IDEA git 提交慢的问题 前言 如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差,实在白嫖的话,那欢迎常来啊!!! 解…

网络编程(JAVA)

前言:Java 是 Internet 上的语言,它从语言级上提供了对网络应用程序的支持,程序员能够很容易开发常见的网络应用程序。 Java 提供的网络类库,可以实现无痛的网络连接,联网的底层细节被隐藏在 Java 的本机安装系统里&a…

Git 突破 文件尺寸限制

前言 当Git本地存储里右超过50MB,却又确实需要上传的时候,就需要用到了不是 解决 本代码就是把大文件进行拆解成小文件,然后上传。 等到拉取下来的时候,可以直接再进行合并,合并成原文件 代码如下,仅供…

AI赋能Oracle DBA:以自然语言与Oracle数据库互动

DBA AI助手:以自然语言与Oracle数据库互动 0. 引言1. AI赋能Oracle DBA的优势2. AI如何与Oracle数据库交互3. 自然语言查询的一些示例4. 未来展望 0. 引言 传统的Oracle数据库管理 (DBA) 依赖于人工操作,包括编写复杂的SQL语句、分析性能指标和解决各种…

分布式ID生成方案详解

✨✨ 祝屏幕前的您天天开心 ,每天都有好运相伴。我们一起加油!✨✨ 🎈🎈作者主页: 喔的嘛呀🎈🎈 目录 引言 一. UUID(Universally …

企业文件防泄密软件哪种软件比较好?——推荐@德人合科技 | 天锐绿盾终端数据安全防泄密管理系统!

德人合科技提供的天锐绿盾终端数据安全防泄密管理系统是一款比较好的企业文件防泄密软件。 ——首页———— www.drhchina.com—— 以下是一些关于该软件的优点: 强大的防泄密功能:该软件采用动态加解密技术,能够在文件创建、编辑存盘时自动…

代码随想录算法训练营day24

题目:77. 组合 参考链接:代码随想录 回溯法理论基础 回溯三部曲:回溯函数模板返回值以及参数、回溯函数终止条件、回溯搜索的遍历过程。 模板框架: void backtracking(参数) {if (终止条件) {存放结果;return;}for (选择&…

【Android】反编译APK及重新打包

1.下载 APK 反编译工具 首先,需要下载一个 APK 反编译工具,例如 Apktool。可以在官网(https://apktool.org/docs/install)上下载最新版本的 Apktool,也可以使用包管理器来安装。 2.反编译 APK 文件 将要修改包名的 …

Ubuntu中matplotlib显示中文的方法

其实有很多朋友已经总结得很好了:Ubuntu下让matplotlib显示中文字体_ubuntu matplot 使用汉字-CSDN博客 这里我就是简单补充一下: 按照上面这篇博客,下载:GitHub - tracyone/program_font: fonts for programmer 然后运行&#…

CSS选中第2个table

css如何选择body下的第2个table_已解决_博问_博客园 th, td { text-align:center; } table:nth-of-type(2) td:first-child { text-align:left; }

Redis7

摘录 https://github.com/Romantic-Lei/Learning-in-practice/blob/master/Redis/ 官网地址: 英文:Redis 中文:CRUG网站 redis中文文档 安装包:https://redis.io/download/,选择redis7.0版本即可 Redis在线测试地址(不用下载也…

Qt中常见的JS类和函数(二): 全局对象

Qt专栏: http://t.csdnimg.cn/YLlEd 相关系列文章 Qt中字符串转换为JS的函数执行 Qt中常见的JS类和函数(一): 全局对象 Qt中常见的JS类和函数(二): 全局对象 目录 2.3.构造函数属性 2.3.1.Object 2.3.2.Function 2.3.3.Array 2.3.4.ArrayBuffer 2.3.5.String …

等保测评与商用密码共铸工控安全“双评合规”新篇章

最近听说了一个段子:“网络安全就像美女的内衣,等保和密评就是最贴身的内衣两件套,上下身一件都不能少。否则你的魔鬼身材(核心数据)就有可能被色狼(黑客)一览无余(数据泄漏&#xf…

linux系统消息中间件安装配置负载均衡器

负载均衡器 安装并配置负载均衡器安装并配置负载均衡器HA在其中一台服务器安装HAProxy修改 /etc/haproxy/haproxy.cfg 常见命令插件管理virtual_host管理用户管理其他使用命令:RabbitMQ 错误处理 安装并配置负载均衡器 注意:如果使用阿里云,可…

Ubuntu上Jenkins自动化部署Gitee上SpringBoot项目

文章目录 安装安装JDK安装Maven安装GitNodeJS安装(可选)安装Jenkins 配置Jenkins为Jenkins更换插件源设置jenkins时区安装插件全局工具配置添加Gitee凭证Gitee项目配置 部署后端1.新建任务2.配置源码管理3.构建触发器4.到Gitee中添加WebHook5.构建环境6.…