由于 GridDB 的 TIME SERIES 类型容器中 TIMESTAMP 字段的大小/定义可能导致记录冲突

Possible record collisions due to the size / definition of the TIMESTAMP field in the TIME SERIES type containers of GridDB

我正在使用 GridDB,我发现在插入过程中丢失了记录,我将其归因于缺少时间戳字段的定义。

我试图在输入字段中给出更多定义,但保存它使它成为 trim。日志未显示任何数据丢失或错误写入。

一个查询数据库:

[{
"columns":[
  {"name":"original_timestamp","type":"TIMESTAMP"},
  {"name":"FIELD_A","type":"STRING"}
  ...
  {"name":"FIELD_Z","type":"STRING"}
  {"name":"code_timestamp","type":"STRING"}],
  "results":[
  "2019-07-19T11:28:42.328Z",
  "SOME String Value for A",
  ...
  "SOME String Value for Z",
  "2019-07-19 11:28:59.239922"}
]

注册摄入量低于预期。 我们正在研究基于两个索引的模型。还有其他想法和/或有用的经验吗?

提前致谢!

GridDB 以毫秒分辨率存储 TIMESTAMP 值,插入具有更高分辨率(例如微秒或纳秒分辨率)的记录将导致时间戳值被截断。 可以通过三种方式来解决时间戳冲突:

  1. 使用 long 作为第一个索引的集合。在那么长的时间里,根据需要以微秒或纳秒为单位存储一个 Unix 纪元。您显然会丢失一些时间序列函数,并且必须手动将比较运算符转换为所需分辨率的 Unix 纪元。

  2. 使用集合并禁用行键(在Java中没有@RowKey标签或在其他语言中将ContainerInfo中的最后一个布尔值设置为False)。这将允许多个记录具有相同的 "row key value"。您可以在此列上启用二级索引以确保查询仍然很快。 TIMESTAMP 和 TO_TIMESTAMP_MS 函数仍然有效,但我相当确定 none 其他特殊时间戳函数会起作用。当我不得不在 GridDB 中处理时间戳冲突时,这是我选择的解决方案。

  3. 在插入之前检测冲突,如果有冲突,将冲突记录写入单独的容器。使用 multi-get/query 查询所有容器。