举个极端的例子,假设一个表按天分区,数据的频率是,每个设备一天产生1条数据,但是有1000万个设备
这个时候如果用tsdb建库建表,sortColumns设置为设备Id,那么一天的sortKey就有1000万个,每个sortKey对应的数据只有1条。
如果从事务型数据库的思维来看,一个索引对应1条数据是没什么问题的。
但是DolphinDB是时序数据库,虽然在TSDB引擎实现了类似索引的功能,但是sortKey是与数据存储有很深的联系。
可以这么理解,DolphinDB在存储时,按照sortKey对存储文件进行了划分,那么1000万个就代表,一个分区的存储文件中划分了1000万个存储小块,每个小块都有固定的开销,这增加了存储的开销,而且读取整个分区数据的时候,可以简单理解为读取1000万个小文件,非常的低效。
于是就有了,sortKeyMappingFunction,将多个sortKey进行分组,减少sortKey的数量,增加每个sortKey对应的数据量。比如下面的这个例子:
login(`admin,`123456) n=10000000 id = "d" + string(1..10000000) TradeDate = take(2022.01.01,n) val = rand(1000..3000, n) schemaTable = table(id, TradeDate, val) dbPath = "dfs://TSDB_DEMO" if(existsDatabase(dbPath)){dropDatabase(dbPath)} db_demo = database(dbPath, VALUE, 2022.01.01..2022.01.05, engine='TSDB') demo = createPartitionedTable(dbHandle=db_demo, table=schemaTable, tableName="demo", partitionColumns=`TradeDate, sortColumns=`id`TradeDate, keepDuplicates=ALL, sortKeyMappingFunction=[hashBucket{,1000}]).append!(schemaTable)
就是将,id降频,从1000万降频到1000个,每个sortKey就会有1万条数据