DolphinDB分区策略:VALUE分区详解
目录摘要一、VALUE分区概述1.1 什么是VALUE分区1.2 VALUE分区特点1.3 适用场景二、创建VALUE分区2.1 基本语法2.2 创建单列VALUE分区2.3 创建字符串VALUE分区2.4 创建日期VALUE分区三、VALUE分区查询3.1 分区裁剪3.2 查询优化四、VALUE分区管理4.1 添加分区4.2 查看分区4.3 分区统计五、VALUE分区最佳实践5.1 分区列选择5.2 分区数量建议5.3 分区设计示例六、VALUE分区 vs 其他分区6.1 对比表6.2 选择建议七、实战案例7.1 工厂设备数据分区7.2 多租户数据分区八、总结参考资料摘要本文深入讲解DolphinDB VALUE分区策略。从VALUE分区原理到设计方法从单列分区到多列分区从分区管理到最佳实践全面介绍VALUE分区的应用场景和优化技巧。通过丰富的代码示例帮助读者掌握VALUE分区设计和管理的核心技能。一、VALUE分区概述1.1 什么是VALUE分区VALUE分区是DolphinDB中最常用的分区策略之一按照列值的枚举值进行分区VALUE分区原理原始数据按列值分区分区1: 值A分区2: 值B分区3: 值C分区4: 值D1.2 VALUE分区特点特点说明枚举分区按列值的枚举值分区精确匹配查询时精确匹配分区适合离散值适合设备ID、地区等分区数量固定分区数等于枚举值数量1.3 适用场景场景说明设备数据按设备ID分区地区数据按地区/城市分区类型数据按数据类型分区状态数据按状态值分区二、创建VALUE分区2.1 基本语法//VALUE分区语法 dbdatabase(dfs://db_name,VALUE,partition_column)//参数说明//-db_name:数据库名称//-VALUE:分区类型//-partition_column:分区列可以是向量或列名2.2 创建单列VALUE分区//按设备ID分区 device_ids1..100dbdatabase(dfs://device_db,VALUE,device_ids)//查看分区方案 db.schema()//创建分区表 schematable(1:0,device_idtimestamptemperaturehumidity,[INT,TIMESTAMP,DOUBLE,DOUBLE])db.createPartitionedTable(schema,sensor_data,device_id)//插入数据 ttable(take(1..100,1000)asdevice_id,take(now(),1000)astimestamp,rand(20.0..30.0,1000)astemperature,rand(40.0..60.0,1000)ashumidity)loadTable(dfs://device_db,sensor_data).append!(t)2.3 创建字符串VALUE分区//按地区分区 regions北京上海广州深圳杭州成都武汉西安 dbdatabase(dfs://region_db,VALUE,regions)//创建分区表 schematable(1:0,regiontimestampsalesquantity,[SYMBOL,TIMESTAMP,DOUBLE,INT])db.createPartitionedTable(schema,sales_data,region)//插入数据 ttable(take(regions,1000)asregion,take(now(),1000)astimestamp,rand(1000.0..10000.0,1000)assales,rand(10..100,1000)asquantity)loadTable(dfs://region_db,sales_data).append!(t)2.4 创建日期VALUE分区//按日期分区 dates2024.01.01..2024.12.31dbdatabase(dfs://date_db,VALUE,dates)//创建分区表 schematable(1:0,datedevice_idvalue,[DATE,INT,DOUBLE])db.createPartitionedTable(schema,daily_data,date)三、VALUE分区查询3.1 分区裁剪//VALUE分区支持精确的分区裁剪 tloadTable(dfs://device_db,sensor_data)//查询单个设备只扫描一个分区 select count(*)fromt where device_id1//查询多个设备只扫描相关分区 select count(*)fromt where device_idin[1,2,3]//查看执行计划 explain select*fromt where device_id13.2 查询优化//分区列过滤高效 select*fromt where device_id1//非分区列过滤全表扫描 select*fromt where temperature25//组合条件 select*fromt where device_id1andtemperature25四、VALUE分区管理4.1 添加分区//VALUE分区需要预先定义所有值//如果数据包含未定义的分区值会报错//解决方案创建数据库时包含所有可能的值 device_ids1..1000//预留足够的设备ID dbdatabase(dfs://device_db,VALUE,device_ids)4.2 查看分区//查看分区列表 dbdatabase(dfs://device_db)db.partitionSchema()//查看分区数据量 select device_id,count(*)ascntfromloadTable(dfs://device_db,sensor_data)group by device_id4.3 分区统计//查看各分区大小 getTabletsMeta(dfs://device_db,sensor_data)//分区数据分布 select device_id,count(*)asrecord_count,min(timestamp)asmin_time,max(timestamp)asmax_timefromloadTable(dfs://device_db,sensor_data)group by device_id order by record_count desc五、VALUE分区最佳实践5.1 分区列选择选择原则说明高基数列分区值不宜过多10000查询频繁经常作为查询条件分布均匀数据在各分区分布均匀值稳定分区值不会频繁变化5.2 分区数量建议场景建议分区数小集群100-1000中集群1000-10000大集群10000-1000005.3 分区设计示例//设备数据分区设计//方案1按设备ID分区设备数10000 dbdatabase(dfs://device_db,VALUE,1..10000)//方案2按设备类型ID组合分区设备数10000//使用COMPO分区先按类型再按ID范围 dbdatabase(dfs://device_db2,COMPO,[VALUE,typeAtypeBtypeC,RANGE,1..1001])//方案3按时间设备分区海量设备 dbdatabase(dfs://device_db3,COMPO,[RANGE,2024.01.01..2024.12.31,HASH,[INT,100]])六、VALUE分区 vs 其他分区6.1 对比表特性VALUERANGEHASH分区方式枚举值范围哈希查询效率精确匹配范围查询均匀分布分区数量固定可扩展固定适用场景离散值连续值均匀分布6.2 选择建议离散值枚举类型连续值时间/数值均匀分布高基数多维度选择分区策略数据特点VALUE分区RANGE分区HASH分区COMPO组合分区七、实战案例7.1 工厂设备数据分区//创建按车间分区的数据库 workshops车间A车间B车间C车间D车间E dbdatabase(dfs://factory_db,VALUE,workshops)//创建分区表 schematable(1:0,workshopdevice_idtimestamptemperaturehumiditypower,[SYMBOL,INT,TIMESTAMP,DOUBLE,DOUBLE,DOUBLE])db.createPartitionedTable(schema,device_data,workshop)//插入数据 ttable(take(workshops,10000)asworkshop,take(1..100,10000)asdevice_id,take(now()-0..9999*1000,10000)astimestamp,rand(20.0..30.0,10000)astemperature,rand(40.0..60.0,10000)ashumidity,rand(100.0..500.0,10000)aspower)loadTable(dfs://factory_db,device_data).append!(t)//查询某车间数据 select*fromloadTable(dfs://factory_db,device_data)where workshop车间A limit107.2 多租户数据分区//创建按租户分区的数据库 tenantstenant_001tenant_002tenant_003tenant_004tenant_005 dbdatabase(dfs://tenant_db,VALUE,tenants)//创建分区表 schematable(1:0,tenant_iduser_idtimestampactionresource,[SYMBOL,STRING,TIMESTAMP,SYMBOL,STRING])db.createPartitionedTable(schema,audit_log,tenant_id)//查询某租户日志 select*fromloadTable(dfs://tenant_db,audit_log)where tenant_idtenant_001andtimestampnow()-86400000八、总结本文详细介绍了DolphinDB VALUE分区策略分区原理按列值的枚举值分区创建方法单列分区、字符串分区、日期分区查询优化分区裁剪、精确匹配分区管理添加分区、查看分区、统计分区最佳实践分区列选择、分区数量建议对比选择VALUE vs RANGE vs HASH思考题VALUE分区适合什么类型的数据如何确定VALUE分区的分区数量VALUE分区查询时如何实现分区裁剪参考资料DolphinDB分区数据库DolphinDB分区方案