用脚本生成一批数据写入数据库, count(*)达到某个值后就不在增加了

已经想明白了事情的原因, 原因就是我用time做主键, 但是生成数据时用的秒级, 造成主键覆盖出现了insert变update的问题

不过不知道怎么结束问题 好像没有这个选项.


最近刚刚入门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.

遇到这个很奇怪的问题.  在论坛里也没找到类似的情况.  不知道是不是我漏了什么关键信息.



请先 登录 后评论

最佳答案 2023-12-26 10:03

keepDuplicates=LAST 库中仅保留最新数据,详细的说明请参考tsdb_explained.md · 浙江智臾科技有限公司/Tutorials_CN - Gitee.com

请先 登录 后评论

其它 0 个回答

  • 1 关注
  • 0 收藏,288 浏览
  • 欧阳 提出于 2023-12-25 16:53

相似问题