文档首页/ 云数据库 GeminiDB/ GeminiDB Influx接口/ 最佳实践/ GeminiDB Influx的多级降采样特性应用
更新时间:2025-07-29 GMT+08:00

GeminiDB Influx的多级降采样特性应用

应用场景

在DevOps或IoT等场景中,用户对历史数据明细不再关注,转而关注数据特征,比如最大值,最小值,平均值等。

传统的解决方案是存储所有明细数据,需要时查询数据并计算。如果业务保留历史数据的目的只是为了做一些数据特征计算,那么上面的解决办法存在缺点:由于保留明细数据,时间越长,存储成本越高。

多级降采样介绍

多级降采样与普通降采样的区别在于,多级降采样可以对不同时间段的数据执行不同的降采样策略,比如过去1周到1月内的数据,按时间线每15分钟聚合一次(忽略具体聚合方式),过去1月的历史数据按时间线每1小时聚合一次。

实际业务中,用户对不同时间段的降采样要求是不一样的,用户可能对近期的数据比较敏感,而对长远的数据需求较少,所以需要根据实际业务对数据进行不同的多级降采样策略。采用多级降采样的方式既满足了用户对高价值数据的查询需求,又兼顾了存储效率。

多级降采样场景举例:7天内原始数据直接入库,7-30天数据,15min粒度降采样后入库,30天-12个月的数据,1h粒度降采样后入库。 如下图所示,假设今天是2022-12-31,左侧深蓝色部分是最近7天内的数据,中间灰蓝色部分是7-30天数据,右侧浅蓝色部分是30天-12个月的数据。每过一段时间,数据库会把左侧深蓝色部分的数据以15min为粒度聚合放到中间灰蓝色区域中;每过一段时间,数据库会把中间灰蓝色部分以1h为粒度聚合放到右侧浅蓝色部分区域中。注意这里1h是15min的倍数,所以可以方便地聚合。

图1 多级降采样场

7-30天和30天-12个月的数据在降采样之后,原始数据不会保留。

创建降采样

语法:

Create DownSample [on <rp_name>| on <dbname>.<rp_name>|  ]((dataType(aggregators)...)) With Duration <timeDuration> SampleInterval(time Durations) TimeInterval(time Durations)
表1 参数说明

Duration

SampleInterval

TimeInterval

降采样后数据的保留时间

执行下一级降采样时间

采样Interval

聚合方法定义格式:

dataType(aggfunctions...)

聚合方法举例:

integer(first,sum,count,last,min,max)
integer(min,max),float(sum)

举例说明:

首先,创建一个保留策略rp1,数据保留时长为7天,每天1个shard

create retention policy rp1 on mydb duration 7d replication 1 shard duration 1d 

其次,假设需要在刚新增的rp1之上创建一个降采样任务,采样后的数据的保留时长设为7天,过去1天内的数据保持数据明细,过去1天-2天内的数据按1分钟粒度对数据进行采样,2天以后的数据,按3分钟的粒度对数据进行降采样。

Create DownSample on rp1 (float(sum,last),integer(max,min)) With Duration 7d sampleinterval(1d,2d) timeinterval(1m,3m)
  • sampleinterval和timeinterval的第二个参数时间值必须是第一个参数时间值的整数倍。

    正确示例:

    • sampleinterval(1d,2d)
    • timeinterval(1m,3m)

    错误示例:

    • sampleinterval(2d,3d)
    • timeinterval(5m,6m)
  • sampleinterval和timeinterval的参数个数也要一一对应。

    正确示例:

    • sampleinterval(1d,2d)与timeinterval(1m,3m)

    错误示例:

    • sampleinterval(1d,2d)与timeinterval(3m)
    • sampleinterval(1d)与timeinterval(1m,3m)
  • Duration控制降采样后的数据的保留时长,会同步更新rp1的Duration。可以设置为和rp的duration相同值。仅支持first,last,sum,max,min,mean,count 7种。
  • float(sum,last)代表表内所有float类型的字段都使用sum()和last()聚合函数对数据进行降采样。
  • integer(max,min)与float(sum,last)同理。

显示降采样

语法: show 默认database 所有 downsample tasks:

SHOW DOWNSAMPLES 

show 指定database 所有 downsample tasks:

SHOW DOWNSAMPLES ON <database name>

举例说明:

> show downsamples on ExampleDatabase
+--------+-------------------------+----------+----------------+--------------+
| rpName |     field_operator      | duration | sampleInterval | timeInterval |
+--------+-------------------------+----------+----------------+--------------+
| rp1    | float{max},integer{min} | 24h0m0s  | 1h0m0s,2h0m0s  | 1m0s,5m0s    |
+--------+-------------------------+----------+----------------+--------------+

删除降采样

语法: 删除数据库的所有降采样:

Drop DownSamples 
Drop DownSamples on db0 

删除指定RP的降采样:

Drop DownSample on rp1 
Drop DownSample on db0.rp1