闽侯县建设局网站,常州百度关键词优化,怎样做网站404,网站搭建代码为满足近来用户对某些场景下删除性能的更高要求#xff0c;我们在2.00.11版本的 DolphinDB Server 中特别支持了软删除的功能。本文作为该功能的使用教程#xff0c;将详细介绍软删除的实现原理与应用场景#xff0c;同时提供性能测试案例以供参考。 
1. 概述 
软删除#…为满足近来用户对某些场景下删除性能的更高要求我们在2.00.11版本的 DolphinDB Server 中特别支持了软删除的功能。本文作为该功能的使用教程将详细介绍软删除的实现原理与应用场景同时提供性能测试案例以供参考。 
1. 概述 
软删除Soft Delete是一种在数据库中处理数据删除的方法这种删除方式并不是直接从数据库中移除数据而是通过特定的标记方式在查询的时候将此记录过滤掉在后台合并数据文件时才真正删除数据。相对于硬删除Hard Delete即直接从数据库中永久删除数据软删除以追加方式进行数据删除可大幅度提升列式数据库删除的效率。 
2. 原理介绍 
相比于常见的硬删除软删除是一种新的设计方案。本节将先对硬删除和软删除的原理进行详细介绍然后对比两种删除方式的特点。 
2.1 硬删除的删除和查询逻辑 
删除逻辑 
直接从文件中删除数据。 
分区剪枝根据删除条件进行分区剪枝确定删除涉及的分区。查到内存删除 取出对应分区所有数据到内存后根据条件删除数据。写回删除后的分区数据到新目录 将删除后的数据重新写入数据库系统会使用一个新的 CHUNK 目录默认是 “物理表名_cid”来保存写入的数据旧的文件将被定时回收默认 30 min。 
查询逻辑 
从文件中读取查询结果。 
分区剪枝根据查询条件进行分区剪枝确定查询涉及的分区。读到内存根据查询条件在分区的文件中读取查询结果。 
2.2 软删除的删除和查询逻辑 
删除逻辑 
追加写入带删除标记的数据。 
分区剪枝根据查询语句进行分区剪枝缩窄查询范围。读到内存获取待删除数据根据查询条件查询出需要删除的数据。追加写入待删除数据给需要删除的数据打上删除标记deletion flag并将排序列sort column和分区列partition column外字段值置为空值以 append 方式将数据追加写入 TSDB。 
查询逻辑 
读取查询结果过滤带删除标记的数据。 
分区剪枝根据查询条件进行分区剪枝确定查询涉及的分区。读到内存根据查询条件在分区内读取查询结果包含删除前的数据和带删除标记的数据到内存中。过滤数据删除内存中带删除标记的数据。 
2.3 软删除的特点 
从上面的原理介绍可以看出软删除相比硬删除有如下特点 
删除少量数据快删除大量数据慢软删除写入的是待删除数据硬删除写入的是未删除数据。如果删除的数据量少软删除需要写入的数据就比硬删除少性能更好反之则更差。查询性能不如硬删除查询时软删除相比硬删除除了读取未删除的数据还需要读取删除前的数据和带删除标记的数据最后还需要在内存中做一次过滤综合性能比硬删除差。 
3. 使用介绍 
采用硬删除或者软删除必须满足以下条件 
database 创建库时指定 TSDB 引擎。createTable 或者 createPartitionedTable 函数创建表时指定 softDelete 为 true 且 keepDuplicatesLAST。使用 delete 删除且 SQL 语句中包含 where 条件。 
3.1 软删除使用条件 
步骤条件示例语句说明创建数据库engine 参数值为 TSDBdb  database(dfs://softDelete,VALUE,[2023.01.01],,TSDB)创建一个 TSDB 引擎以值分区的数据库。创建数据表keepDuplicates 参数值为 LAST创建表时 softDelete 参数值为 true即开启软删除。t  table(1:0,TimeSymbolPrice,[TIMESTAMP,STRING,DOUBLE])创建维度表createTable(dbHandledb,tablet, tableNamememTable,sortColumnsSymbolTime,keepDuplicatesLAST, softDeletetrue)创建分区表createPartitionedTable(dbHandledb,tablet, tableNameparTable,partitionColumnsTime,sortColumnsSymbolTime,keepDuplicatesLAST, softDeletetrue)DolphinDB-createTableDolphinDB-createPartitionedTabledelete 语句必须指定 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  ChannelNoApplSeqNumMDStreamIDSecurityIDSecurityIDSourcePriceOrderQtySideTradeTImeOrderTypeOrderIndexLocalTimeSeqNoMarketDataStatusBizIndex
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(tabletbSchema,tableNameentrust,partitionColumnsTradeTImeSecurityID,sortColumnsMarketSecurityIDTradeTIme,keepDuplicatesLAST,softDeletetrue) 
构造模拟数据并写入分布式表。 
n  500000
Symbol  000021000155000418000673000757000759000851000856000909000961
TradeTime  array(timestamp)
for(i in 0:Symbol.size()){TradeTime.append!(2015.07.01 09:15:00.160..((2015.07.01 09:15:00.160n/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(SB,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.219200.3181.8311.22300.4461.881.254400.5781.9471.309500.762.1631.243601.0932.5411.297701.2733.0281.22801.8563.381.172902.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], [keepDuplicatesALL], [sortKeyMappingFunction], [softDeletefalse]). The softDelete parameter is available only when engineType is specified as TSDB and keepDuplicates as LAST.在 softDelete 指定为 true 时keepDuplicates 需要指定为 LASTThe softDelete parameter is available only when engineType is specified as TSDB and keepDuplicates as LAST.软删除仅在 TSDB 引擎支持需要在建库时指定engine“TSDB” 
6.2 相关脚本 
性能测试的脚本软删除性能测试.txt