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

2024-02-27 17:20

本文主要是介绍大幅提升数据库删除性能丨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

这篇关于大幅提升数据库删除性能丨DolphinDB 软删除功能详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/753100

相关文章

一文详解如何在idea中快速搭建一个Spring Boot项目

《一文详解如何在idea中快速搭建一个SpringBoot项目》IntelliJIDEA作为Java开发者的‌首选IDE‌,深度集成SpringBoot支持,可一键生成项目骨架、智能配置依赖,这篇文... 目录前言1、创建项目名称2、勾选需要的依赖3、在setting中检查maven4、编写数据源5、开启热

SQL Server修改数据库名及物理数据文件名操作步骤

《SQLServer修改数据库名及物理数据文件名操作步骤》在SQLServer中重命名数据库是一个常见的操作,但需要确保用户具有足够的权限来执行此操作,:本文主要介绍SQLServer修改数据... 目录一、背景介绍二、操作步骤2.1 设置为单用户模式(断开连接)2.2 修改数据库名称2.3 查找逻辑文件名

Python常用命令提示符使用方法详解

《Python常用命令提示符使用方法详解》在学习python的过程中,我们需要用到命令提示符(CMD)进行环境的配置,:本文主要介绍Python常用命令提示符使用方法的相关资料,文中通过代码介绍的... 目录一、python环境基础命令【Windows】1、检查Python是否安装2、 查看Python的安

SQL Server数据库死锁处理超详细攻略

《SQLServer数据库死锁处理超详细攻略》SQLServer作为主流数据库管理系统,在高并发场景下可能面临死锁问题,影响系统性能和稳定性,这篇文章主要给大家介绍了关于SQLServer数据库死... 目录一、引言二、查询 Sqlserver 中造成死锁的 SPID三、用内置函数查询执行信息1. sp_w

苹果macOS 26 Tahoe主题功能大升级:可定制图标/高亮文本/文件夹颜色

《苹果macOS26Tahoe主题功能大升级:可定制图标/高亮文本/文件夹颜色》在整体系统设计方面,macOS26采用了全新的玻璃质感视觉风格,应用于Dock栏、应用图标以及桌面小部件等多个界面... 科技媒体 MACRumors 昨日(6 月 13 日)发布博文,报道称在 macOS 26 Tahoe 中

HTML5 搜索框Search Box详解

《HTML5搜索框SearchBox详解》HTML5的搜索框是一个强大的工具,能够有效提升用户体验,通过结合自动补全功能和适当的样式,可以创建出既美观又实用的搜索界面,这篇文章给大家介绍HTML5... html5 搜索框(Search Box)详解搜索框是一个用于输入查询内容的控件,通常用于网站或应用程

Java使用HttpClient实现图片下载与本地保存功能

《Java使用HttpClient实现图片下载与本地保存功能》在当今数字化时代,网络资源的获取与处理已成为软件开发中的常见需求,其中,图片作为网络上最常见的资源之一,其下载与保存功能在许多应用场景中都... 目录引言一、Apache HttpClient简介二、技术栈与环境准备三、实现图片下载与保存功能1.

Python中使用uv创建环境及原理举例详解

《Python中使用uv创建环境及原理举例详解》uv是Astral团队开发的高性能Python工具,整合包管理、虚拟环境、Python版本控制等功能,:本文主要介绍Python中使用uv创建环境及... 目录一、uv工具简介核心特点:二、安装uv1. 通过pip安装2. 通过脚本安装验证安装:配置镜像源(可

C++ 函数 strftime 和时间格式示例详解

《C++函数strftime和时间格式示例详解》strftime是C/C++标准库中用于格式化日期和时间的函数,定义在ctime头文件中,它将tm结构体中的时间信息转换为指定格式的字符串,是处理... 目录C++ 函数 strftipythonme 详解一、函数原型二、功能描述三、格式字符串说明四、返回值五

LiteFlow轻量级工作流引擎使用示例详解

《LiteFlow轻量级工作流引擎使用示例详解》:本文主要介绍LiteFlow是一个灵活、简洁且轻量的工作流引擎,适合用于中小型项目和微服务架构中的流程编排,本文给大家介绍LiteFlow轻量级工... 目录1. LiteFlow 主要特点2. 工作流定义方式3. LiteFlow 流程示例4. LiteF