暂无图片
暂无图片
2
暂无图片
暂无图片
暂无图片

【学习笔记】超融合时序数据库Uqbar---时序数据查询能力

原创 哇哈哈 2022-12-16
571

时序数据查询能力

时序数据的价值往往是通过对时序数据进行各种聚合分析来体现,对外呈现出某种变化趋势或分布特征。因此时序数据库需要支持丰富的多维聚合能力,以满足时序场景的分析需求。

聚合类算子

当前版本的Uqbar支持以下常用聚合算子:

聚合函数用途
COUNT统计数量
DISTINCT去重
AVG平均值
MEDIAN求中位数
MODE() WITHIN GROUP求最大频次数
STDDEV求标准差
SUM求和
TIME_BUCKET时间对齐
SUM...OVER...累积和
AVG...OVER移动平均

time_bucket()

time_bucket时间范围对齐函数,用于将一个时间按照bucket_width对齐到一个时间点,方便后续对时间聚合。

语法

time_bucket(bucket_width, time,[offset | origin])

Copy

参数说明

参数名类型属性释义
bucket_widthTEXT必选对齐的时间间隔。只能使用'正整数+时间标识'的方式,时间标识包括interval类型支持的所有单位,包括'microsecond,millisecond,second,minute,hour,day,week,month,year,decade,century,millennium' 及这些单位的复数形式,如years、months、days等和简写形式,如y、m、d等。
timeTIMESTAMP必选需要对齐的时间。
offsetINTERVAL可选使用这个值调整对齐窗口位置,如果是正值,时间窗口整体向将来移动,如果是负值,窗口位置向过去移动。相当于将默认的origin移动offset的位置。
originTIMESTAMP可选对齐的base,默认从’2001-1-1 00:00:00’对齐;此参数与offset互斥。

约束

使用time_bucket时,由于offset与origin是互斥的参数,所以time_bucket的第三个参数可能是offset(interval 类型),也可能是origin(timestamp 类型)。为了方便区分是offset还是origin使用时,如果使用offset或者origin需要显式指定第三个参数的类型,如:

select time_bucket('5minute',time,'2001-1-1 00:00:00'::timestamp) as bucket ,count(temperature) from weather group by bucket order by bucket asc;

Copy

或者

select time_bucket('1minute',time,'1minute'::interval) as bucket ,count(temperature) from weather group by bucket order by bucket asc;

Copy

示例

Uqbar=#  select * from t1 order by time;
          time          | id | value 
------------------------+----+-------
 2022-06-02 00:01:00+08 |  1 |     9
 2022-06-02 00:04:00+08 |  1 |    11
 2022-06-02 00:06:00+08 |  1 |    10
 2022-06-02 00:07:00+08 |  1 |    11
 2022-06-02 00:15:00+08 |  1 |    12
(5 rows)

Uqbar=# select time_bucket('2 minute',time) as bucket, sum(value)  from t1 group by bucket order by bucket; 
          bucket         | sum 
------------------------------------+-----
 2022-06-02 00:00:00+08   |   9
 2022-06-02 00:04:00+08   |  11
 2022-06-02 00:06:00+08   |  21
 2022-06-02 00:14:00+08   |  12
(4 rows)

Copy


选择类算子

当前版本的Uqbar支持以下常用选择算子:

函数用途
FIRST取最早的值
LAST取最晚的值
MAX取最大的值
MIN取最小的值
PERCENTILE计算百分位值
SAMPLE返回N个抽样
TOP取最大的N个值

first() / last()

使用cmp_col列做比较,返回时间最早或最晚的value指定的列的值。时序的first/last算子在timeseries_catalog这个schema下,区别于public中的first/last。

语法

select city_name,timeseries_catalog.first(temp_c,time) from weather_metrics group by city_name;
select city_name,timeseries_catalog.last(temp_c,time) from weather_metrics group by city_name;
timeseries_catalog.first(value, cmp_col)
timeseries_catalog.last(value, cmp_col)

Copy

参数说明

参数名类型属性释义
valueANY必选返回值
cmp_colTIMESTAMP or TIMESTAMPTZ必选比较值

约束

当表存在多条记录的cmp_col列最小值/最大值相同时,返回这些记录中第一条/最后一条的value。

当cmp_col列为常量时,时序first/last算子的效果等同于public中的first/last算子, 返回所有记录中的第一条/最后一条的value值。

示例

Uqbar=# select city_name,timeseries_catalog.first(temp_c,time) from weather_metrics group by city_name; 
 city_name | first 
---------------+-------
beijing    | 30
shanghai   | 29 
(2 row)

Copy


转换类算子

当前版本的Uqbar支持以下常用转换算子:

函数用途
ABS求绝对值
ACOS三角函数
ASIN三角函数
ATAN三角函数
ATAN2三角函数
CEIL向上取整
COS三角函数
EXP求指数
FLOOR向下取整
LN对数函数
LOG对数函数
POW乘方运算
ROUND四舍五入运算
SIN三角函数
SQRT求平方根
TAN三角函数
COT三角函数


差异化SQL能力

支持以下InfluxDB 1.x版本不支持的算子,构建差异化竞争力。

  • 按聚合结果列排序
  • Join查询(支持时序表与关系表的join查询)
  • CASE...WHEN
  • ...


高效多维查询

时序数据库需要支持使用任意Tag组合的查询能力,并具有高效的查询效率。Uqbar能够快速根据查询条件中tag的组合定位到关联的TagSet,提高查询性能。


查询性能指标

使用TSBS时序数据库Benchmark测试工具,DevOPS模型下,查询平均可达毫秒级响应。

TSBS查询模型:https://github.com/timescale/tsbs


支持索引

在时序表上支持索引相关功能,以便用户根据实际需求使用索引提升查询性能。时序表上支持的索引类型包括Btree和Gin,不支持创建部分索引,Btree可以支持唯一索引。时序表上索引默认是LOCAL索引,不支持创建GLOBAL索引。在时序表执行数据删除时,对应分区上的索引也会一起删除。

创建索引

语法和分区表创建索引语法基本相同,但不支持创建GLOBAL索引。

CREATE [ UNIQUE ] INDEX [ [schema_name.]index_name ] ON table_name [ USING method ]
    ( {{ column_name | ( expression ) } [ COLLATE collation ] [ opclass ] [ ASC | DESC ] [ NULLS LAST ] }[, ...] )
    [ LOCAL [ ( { PARTITION index_partition_name | SUBPARTITION index_subpartition_name [ TABLESPACE index_partition_tablespace ] } [, ...] ) ] ]
    [ INCLUDE ( column_name [, ...] )]
    [ WITH ( { storage_parameter = value } [, ...] ) ]
    [ TABLESPACE tablespace_name ];

Copy

删除索引

DROP INDEX [ CONCURRENTLY ] [ IF EXISTS ] index_name [, ...] [ CASCADE | RESTRICT ];

Copy

修改索引

  • 重命名表索引的名称

    ALTER INDEX [ IF EXISTS ] index_name RENAME TO new_name;

    Copy

  • 修改表索引的存储参数

    ALTER INDEX [ IF EXISTS ] index_name SET ( {storage_parameter = value} [, ... ] );

    Copy

  • 设置表索引或索引分区不可用

    ALTER INDEX [ IF EXISTS ] index_name [ MODIFY PARTITION index_partition_name ] UNUSABLE;

    Copy

  • 重置索引的一个或多个索引方法特定的存储参数为缺省值。与SET一样,可能需要使用REINDEX来完全更新索引。

    ALTER INDEX [ IF EXISTS ] index_name RESET ( { storage_parameter } [, …] );

    Copy

  • 重建表或者索引分区上的索引。

    ALTER INDEX [ IF EXISTS ] index_name REBUILD [ PARTITION index_partition_name ];

    Copy

  • 重命名索引分区

    ALTER INDEX [ IF EXISTS ] index_name RENAME PARTITION index_partition_name TO new_index_partition_name;

    Copy

  • 修改索引分区的所属表空间

    ALTER INDEX [ IF EXISTS ] index_name MOVE PARTITION index_partition_name TABLESPACE new_tablespace;

    Copy

重建索引

REINDEX  { INDEX|  [INTERNAL] TABLE} name PARTITION partition_name [ FORCE  ];
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论