目录摘要一、数据压缩概述1.1 为什么需要数据压缩1.2 DolphinDB压缩特点1.3 压缩算法对比二、压缩配置2.1 数据库级压缩2.2 列级压缩2.3 压缩算法选择三、压缩效果测试3.1 测试数据准备3.2 压缩效果对比3.3 查看压缩效果四、存储优化策略4.1 数据类型优化4.2 分区优化4.3 排序列优化五、冷热数据分离5.1 分层存储5.2 数据迁移5.3 降采样存储六、存储监控6.1 存储空间监控6.2 压缩率监控七、最佳实践7.1 压缩策略7.2 存储优化清单八、总结参考资料摘要本文深入讲解DolphinDB数据压缩与存储优化技术。从压缩算法原理到配置方法从存储策略设计到空间优化从性能测试到最佳实践全面介绍如何降低存储成本、提升查询性能。通过丰富的代码示例帮助读者掌握数据压缩和存储优化的核心技能。一、数据压缩概述1.1 为什么需要数据压缩工业物联网数据量巨大存储成本高昂数据压缩价值原始数据100TB压缩后10TB存储成本降低90%查询性能提升网络传输减少1.2 DolphinDB压缩特点特点说明列式压缩按列存储压缩率高时序压缩针对时序数据优化自动压缩自动选择压缩算法透明解压查询时自动解压1.3 压缩算法对比算法压缩比压缩速度解压速度适用场景LZ4中快快通用场景ZSTD高中中高压缩比DELTA高快快渐变数据BITMAP高快快低基数列二、压缩配置2.1 数据库级压缩//创建数据库时指定压缩 dbdatabase(dfs://compressed_db,VALUE,1..100)//创建表时指定压缩 schematable(1:0,device_idtimestamptemperaturehumidity,[INT,TIMESTAMP,DOUBLE,DOUBLE])db.createPartitionedTable(schema,sensor_data,device_id,,//sortColumns true,//enableCompressionZSTD//compressionAlgorithm)2.2 列级压缩//不同列使用不同压缩算法 schematable(1:0,device_idtimestamptemperaturehumiditystatus,[INT,TIMESTAMP,DOUBLE,DOUBLE,SYMBOL])//创建表时配置列压缩 db.createPartitionedTable(schema,sensor_data,device_id,,true,[LZ4,DELTA,ZSTD,ZSTD,BITMAP]//各列压缩算法)2.3 压缩算法选择//根据数据特点选择压缩算法//整数列DELTA渐变数据//device_id:DELTA连续整数//时间列DELTA时间递增//timestamp:DELTA//浮点数列ZSTD随机数据//temperature:ZSTD//符号列BITMAP低基数//status:BITMAP三、压缩效果测试3.1 测试数据准备//创建测试数据defgenerateTestData(rows){returntable(take(1..100,rows)asdevice_id,2024.01.01T00:00:000..(rows-1)*1000astimestamp,rand(20.0..30.0,rows)astemperature,rand(40.0..60.0,rows)ashumidity,take(onlineofflineerror,rows)asstatus)}datagenerateTestData(10000000)//1000万行3.2 压缩效果对比//测试不同压缩算法//1.无压缩 db1database(dfs://no_compress,VALUE,1..100)db1.createPartitionedTable(schema,data1,device_id,,false)loadTable(dfs://no_compress,data1).append!(data)//2.LZ4压缩 db2database(dfs://lz4_compress,VALUE,1..100)db2.createPartitionedTable(schema,data2,device_id,,true,LZ4)loadTable(dfs://lz4_compress,data2).append!(data)//3.ZSTD压缩 db3database(dfs://zstd_compress,VALUE,1..100)db3.createPartitionedTable(schema,data3,device_id,,true,ZSTD)loadTable(dfs://zstd_compress,data3).append!(data)//4.列级压缩 db4database(dfs://col_compress,VALUE,1..100)db4.createPartitionedTable(schema,data4,device_id,,true,[DELTA,DELTA,ZSTD,ZSTD,BITMAP])loadTable(dfs://col_compress,data4).append!(data)3.3 查看压缩效果//查看各表存储大小defgetTableSize(dbPath,tableName){metagetTabletsMeta(dbPath,tableName)returnsum(meta.size)}sizestable([无压缩,LZ4,ZSTD,列级压缩]asname,[getTableSize(dfs://no_compress,data1),getTableSize(dfs://lz4_compress,data2),getTableSize(dfs://zstd_compress,data3),getTableSize(dfs://col_compress,data4)]assize_bytes)//计算压缩比 select name,size_bytes,size_bytes/sizes[0].size_bytesascompression_ratiofromsizes四、存储优化策略4.1 数据类型优化//选择合适的数据类型//不推荐 t1table(1..100asid,device_string(1..100)asname,//STRING25.5astemperature//DOUBLE)//推荐 t2table(1..100asid,symbol(device_string(1..100))asname,//SYMBOL更省空间25.5fastemperature//FLOAT精度够用)//数据类型大小对比//INT:4字节//LONG:8字节//FLOAT:4字节//DOUBLE:8字节//SYMBOL:4字节引用//STRING:变长4.2 分区优化//合理的分区大小//不推荐分区过小 db1database(dfs://small_partition,VALUE,1..10000)//10000个分区//不推荐分区过大 db2database(dfs://large_partition,RANGE,[2024.01.01,2025.01.01])//1个分区//推荐分区大小1-10GB db3database(dfs://optimal_partition,COMPO,[RANGE,2024.01.01..2024.12.31,//按日分区 HASH,[INT,10]])//哈希分桶4.3 排序列优化//设置排序列加速查询 dbdatabase(dfs://sorted_db,VALUE,1..100)schematable(1:0,device_idtimestamptemperaturehumidity,[INT,TIMESTAMP,DOUBLE,DOUBLE])//创建表时指定排序列 db.createPartitionedTable(schema,sensor_data,device_id,timestamp//按时间排序)//排序后查询更快 select*fromloadTable(dfs://sorted_db,sensor_data)where device_id1andtimestamp between2024.01.01and2024.01.02五、冷热数据分离5.1 分层存储数据分层热数据最近7天SSD存储温数据7天-3月HDD存储冷数据3月以上对象存储5.2 数据迁移//数据迁移函数defmigrateToCold(dbPath,tableName,cutoffDate){dbdatabase(dbPath)tloadTable(db,tableName)//查询冷数据 coldDataselect*fromt where date(timestamp)cutoffDate//写入冷存储 cold_dbdatabase(dfs://cold_storage)loadTable(cold_db,tableName).append!(coldData)//删除原数据 datesdistinct(date(coldData.timestamp))for(dindates){dropPartition(db,[d])}returncoldData.rows()}//定期迁移 scheduleJob(migrate_cold,冷数据迁移,def(){migrateToCold(dfs://iot_db,sensor_data,today()-90)},02:00,2024.01.01,2030.12.31,D)5.3 降采样存储//历史数据降采样defdownsampleData(dbPath,tableName,startDate){tloadTable(dbPath,tableName)//降采样1分钟→1小时 downsampledselect device_id,bar(timestamp,1h)ashour,avg(temperature)asavg_temp,max(temperature)asmax_temp,min(temperature)asmin_temp,count(*)ascountfromt where date(timestamp)startDate group by device_id,bar(timestamp,1h)//写入降采样表 loadTable(dbPath,sensor_data_hourly).append!(downsampled)returndownsampled.rows()}//每日降采样 scheduleJob(downsample,数据降采样,def(){downsampleData(dfs://iot_db,sensor_data,today()-1)},01:00,2024.01.01,2030.12.31,D)六、存储监控6.1 存储空间监控//查看数据库大小defgetDatabaseSize(dbPath){tablestables(dbPath)total0for(tintables){totalgetTableSize(dbPath,t.name)}returntotal}//查看各表大小deflistTableSizes(dbPath){tablestables(dbPath)returnselect name,getTableSize(dbPath,name)assize_bytesfromtables order by size_bytes desc}listTableSizes(dfs://iot_db)6.2 压缩率监控//监控压缩效果defmonitorCompression(dbPath,tableName){metagetTabletsMeta(dbPath,tableName)returnselect partition,count(*)aschunk_count,sum(size)ascompressed_size,sum(originalSize)asoriginal_size,sum(originalSize)/sum(size)ascompression_ratiofrommeta group by partition}monitorCompression(dfs://iot_db,sensor_data)七、最佳实践7.1 压缩策略数据类型推荐算法说明时间列DELTA时间递增整数列DELTA连续整数浮点列ZSTD随机数据符号列BITMAP低基数字符串LZ4通用场景7.2 存储优化清单优化项建议数据类型使用SYMBOL替代STRING分区大小1-10GB排序列常用查询列压缩算法根据数据特点选择冷热分离定期迁移历史数据降采样历史数据降精度八、总结本文详细介绍了DolphinDB数据压缩与存储优化压缩算法LZ4、ZSTD、DELTA、BITMAP压缩配置数据库级、列级压缩压缩测试效果对比、性能测试存储优化数据类型、分区、排序冷热分离分层存储、数据迁移、降采样存储监控空间监控、压缩率监控思考题如何选择合适的压缩算法如何设计冷热数据分离策略如何监控存储空间使用情况参考资料DolphinDB数据压缩DolphinDB存储优化