最近刚刚入门ddb有看一周多的API和相关资料. 最近开始上手写练手项目
借着这个贴想请教一下,
如果想优化表设计预防这个问题, 应该如何修改好呢. 目前设置的 sortColumns=`sn`timestamp 可以一定程度的防止这个问题, 当sn不一致的时候不会出现update.
是不是可以有更好的方案, 能否请坛子里的大佬稍稍指点一下.
for _ in range(num_segments):
timestamp = timestamp+1
heart_rate = random.randint(0, 255)
sleep_state = random.randint(0, 2)
breathing_rate = random.randint(0, 63)
snore_operation = random.randint(0, 1)
snore_times = random.randint(0, 100)
ai_switch = random.randint(0, 1)
body_movement = random.randint(0, 10)
每一行的timestamp都是上一行+1, 下面的数据都是随机数的.
然后通过java的API写入ddb中.
Entity res = conn.run("tableInsert{loadTable('dfs://XX', 'xxx')}", Arrays.asList(basicTable));
也常使用直接用insert语句进行插入. 也有相同的问题.
数据库结构是
db = database(directory=dbPath, partitionType=VALUE, partitionScheme=2023.11M..2083.12M ,engine='TSDB')
colNames =`time`timestamp`sn`heart_rate`sleep_state`breathing_rate`snore_operation`snore_times`ai_switch`body_movement
colTypes = [TIMESTAMP,INT,SYMBOL,CHAR,CHAR,CHAR,CHAR,CHAR,CHAR,CHAR]
t = table(1:0, colNames, colTypes)
pt = db.createPartitionedTable(table=t, tableName=ptName, partitionColumns=`time, sortColumns=`sn`timestamp, keepDuplicates=LAST)
在调试的时候可以看到这里res正确的返回了10000, 可见应该插入了10000条数据的
在第一次执行时, 是正确插入10000条数据的. select count(*) from xxx也是返回10000.
然后诡异的情况是.
当我重复这个过程, 就是重新生成数据, 在insert进表中. 此时不再是10000条数据都写进数据库, 而是只有部分写进来或者是被update了?
在我执行了超过10次以上过程后, 数据库 count(*) 只有15555行, 再继续执行有可能略微增加几十行.
每次在javaapi都是返回了10000. 也就是应该是提交了10000条数据到数据库的.
按asc排序可看到前面的数据始终没变
按desc排序也可看到后面插入的数据不怎么变.
sum(heart_rate) 的值会上下变化. 感觉数据库里的数据会发生覆盖?
但是每次time应该是递增了才对. timestamp也确保了每一行至少都是上一行+1.
遇到这个很奇怪的问题. 在论坛里也没找到类似的情况. 不知道是不是我漏了什么关键信息.
keepDuplicates=LAST 库中仅保留最新数据,详细的说明请参考tsdb_explained.md · 浙江智臾科技有限公司/Tutorials_CN - Gitee.com