时序引擎常见问题

本文汇总了Lindorm时序引擎在数据写入、删除、查询时的常见问题,方便您更加熟悉时序引擎的使用方法,规避因为不当操作可能导致的性能问题,提高使用效率。

问题导览

数据写入

数据查询

数据删除

功能及性能

时序表设计

数据写入

推荐的最优数据写入方式是什么?

  • Java:推荐您通过Java Native SDK写入,该方式可以自动攒批写入和重试。详细说明,请参见通过Java Native SDK写入数据

  • 非Java:推荐使用行协议(Line Protocol)写入。详细说明,请参见行协议写入

时序引擎支持的时间精度是什么?

时序引擎支持毫秒(ms)级别的时间存储,更高精度的数据会被转换为毫秒精度进行存储。因此,如果写入比毫秒精度更高的时间数据,会导致原数据的精度丢失。

使用行协议写入数据时需要注意什么?

使用行协议写入时您需要注意以下三点:

  • Tag Key、Tag Value中的字符串不需要添加半角单引号('')或半角双引号(""),两者均默认为STRING类型。如果添加了半角单引号('')或半角双引号(""),则引号会被判定为字符串的一部分。

  • Field Key(Field名)固定为字符串类型,不需要添加半角单引号('')或半角双引号("")。

  • Field Value(Field值)需注意数据类型:如果是字符串类型,则必须添加半角双引号(""),否则系统会报错;如果是INT类型,则必须在数值后添加后缀i,例如12i101i,否则INT类型会被识别为FLOAT类型。

数据写入成功但无法查询到是什么原因?

请检查是否设置了数据有效期TTL。如果写入数据的时间超过TTL,则该数据写入后会被清理,导致查询结果为空。

想将Tag列的值设置为NULL,写入时需要显式写入NULL吗?

不需要,在写入数据时忽略该Tag即可。假设表sensor共有5列:device_id、region、time、temperature和humidity,想让region列值为NULL,写入时忽略region写入即可,例如:INSERT INTO sensor(device_id, time, temperature, humidity) VALUES ('id123', current_timestamp, 37, 70);

数据查询

查询方式最推荐使用哪种?

推荐您通过JDBC Driver连接时序引擎,并使用prepareStatement绑参方式进行查询。使用prepareStatement绑参方式可以减少服务端资源占用,提高查询性能。使用方式说明,请参见教程:通过JDBC Driver连接并访问Lindorm时序引擎

使用ORDER BY LIMIT可能会有什么性能问题,有更好的查询方式吗?

使用ORDER BY LIMIT查询时,数据库需要在内存中对数据进行排序。如果命中的数据量过大,可能会导致服务端占用大量内存进而引发稳定性问题。因此,为获得更高的查询效率,建议您减小查询的时间范围或增加更多的Tag条件,尽量减少查询命中的数据量。

此外,时序数据默认按照时间线返回时间递增的数据,无需添加order by time ASC就可以得到以时间线为基准、按时间递增排序的数据。如果需要查询每条时间线的最后几条数据,可以使用最新值函数LATEST来代替ORDER BY time DESC 。具体语法说明,请参见最新值查询

是否支持在WHERE条件里对同一个Field使用多个过滤条件?

暂不支持对同一个Field列、不同的Field列使用多个过滤条件。

Field列过滤是读取数据后再进行过滤的操作,效率较低且不支持同时对多个Field进行过滤,因此建议您使用Tag列进行过滤。

使用COUNT查询如何获得更高的效率?

指定一个数值类型的Field列进行COUNT计算的效率最高。

使用Native SDK查询时偶发报错,内容包含关键词Metaspace,应该怎么解决?

使用Native SDK查询时需要编译SQL语句,占用了过多的元空间(Metaspace),推荐您通过JDBC Driver连接时序引擎,并使用prepareStatement绑定参数的方式进行查询。使用方式说明,请参见教程:通过JDBC Driver连接并访问Lindorm时序引擎

创建的连续查询CQ未生效是什么原因?

使用CREATE CONTINUOUS QUERY语句创建的连续查询未生效的可能原因如下:

  • INSERT INTO指定的表还未创建。

  • INSERT INTO指定的表已创建,但该表的Schema与CREATE CONTINUOUS QUERY语句指定的Schema不一致。

说明

如果您的时序引擎为3.4.41及以上版本,建议您结合控制台查询日志进行排查。

查询耗时很长是什么原因?

请检查查询条件,如果未添加Tag过滤条件或者时间范围将会扫描全表,导致查询耗时很长。

数据删除

是否支持删除一段时间范围的数据?

暂不支持删除指定时间范围内的数据。当前仅支持根据指定Tag条件进行删除,不支持根据Field和时间条件删除。

大量的删除操作会有什么风险?

时序引擎在执行删除操作时并不是直接删除数据,而是为需要删除的数据添加删除标记,确保这些数据不再被查询到,直到这些数据超过有效期TTL被彻底清理。因此,如果提交了大量的删除请求,则会产生大量的删除标记,导致查询以及后台数据的合并性能变差,更严重时可能会导致服务不可用。

建议您尽量避免提交大量的删除请求,如果有数据空间清理的需求,可以通过设置TTL来实现。

是否支持删除特定字段?

暂不支持字段级别的删除操作。如果某个字段不再使用,只要不再查询该字段便不会影响性能。

功能及性能

云盘扩容是否会重启服务?

云盘扩容不会导致进程重启,不会影响您的服务。

冷热分界线设置后多久可以生效?

冷数据归档过程是在后台数据合并时进行的,当数据符合归档要求时将整体被归档至冷存储中。但为了避免冷数据频繁参与合并,时序引擎默认要求数据写入7天后才会被归档至冷存储,因此,如果写入的数据已经符合归档要求,通常还需要等待7天该数据才会被归档至冷存储,即7天后冷存策略(冷热分界线)才会生效。

数据归档至冷存储后还能再转移回热存储吗?

暂不支持将转移至冷存储的数据转移回热存储。因此建议您合理设置冷存储时间,经常查询的数据不要归档至冷存储。

是否支持查看表级别的磁盘占用情况?

暂不支持查看表级别的存储空间占用情况。目前仅支持查看数据库级别的磁盘占用情况,如需查看请联系Lindorm技术支持(钉钉号:s0s3eg3)。

时序引擎的压缩率不太理想是什么原因?

  • 时序引擎对INT类型的数据压缩率更高,如果压缩率不够理想,可以检查测试数据是否为INT类型。

  • 数据写入时会同时写入至内存和日志,日志数据会占用一定的存储空间,进而导致整体压缩率不够理想。

  • 为获得较高的压缩率,新写入的数据不会立刻被压缩,需要等待在后台与已有数据合并后才会被压缩,该过程通常需要10小时以上。

时序表设计

时序表设计时需注意什么?

需注意Tag的设计,避免Tag的取值范围不可控。应尽量避免使用时间、进程号等易变数据作为表的Tag,此类数据会导致时间线数量及时间线索引膨胀,不利于查询和存储。