因为群里一件事的讨论,引发了这个问题,DolphinDB到底该使用TSDB 存储引擎,还是 OLAP ?
事情是这样的,我在使用ussert!做测试时,在群里发了如下结论:
使用了一下upsert! ,发现:
第一次全插入,用时4分多钟,大小712K
第二次全更新。用时6分多钟,大小2.9M
看来更新不是原地改变,而是另起炉灶
牛人建议:
直接append。如果要去重,duplicatePolicy可以设置为LAST
于是我改动了代码:
原来是OLAP方案:
db = database(dfs,RANGE,2020.01M + 12*0..22,engine='OLAP')
dt=db.createPartitionedTable(tb,tableName,`date).append!(tb)
在插入数据时,使用:
upsert!(dt, tb, keyColNames=`code`date) //有则改之,无则插之
改成TSDB方案:
db = database(dfs,RANGE,2020.01M + 12*0..22,engine='TSDB')
dt=db.createPartitionedTable(tb,tableName,`date,,`code`date,LAST).append!(tb)
在插入数据时,改为:
dt.append!(tb);
然后做空间和时间的测试,结论如下 :
OLAP + upsert! 占用空间 800K,用时4分多钟,多次更新会成倍增大空间
TSDB + append! 占用空间 8M,用时3分多钟,多次更新不会增大空间
时间测试:
执行如下 查询50次:
select * from dt where chg>9
OLAP 用时: [738ms]
TSDB 用时: [5s 771ms]
结论:
无论从空间还是时间上看,TSDB无任何优势,至少在目前场景,数据变动不大情况下,优选OLAP+ upsert!
OLAP和TSDB的其它比较,网上一查就有,不细说了。