揭秘华为云GaussDB(for Influx)最佳实践:hint查询
摘要:GaussDB(for Influx)通过提供hint功能,在单时间线的查询场景下,性能有大幅度的提升,能有效满足客户某些特定场景的查询需求。
本文分享自华为云社区《华为云GaussDB(for Influx)揭秘第十期:最佳实践之hint查询》,作者:高斯Influx官方博客。
“怎么感觉查询越来越慢了?”随着业务数据量的不断增大,很多客户都反馈同样的查询语句变得越来越慢。接到客户的反馈后,我们分析了客户的查询执行各个阶段的耗时,发现随着数据量的增加,耗在倒排索引阶段的时间越来越长,那么倒排索引到底是干什么用的呢?能不能跳过倒排索引呢?
倒排索引,顾名思义,是一种索引结构,该索引避免了多维查询时进行大量的数据扫描。其本身就是用于提高查询性能的,显然不能简单地跳过倒排索引。但是随着数据量的不断增大,确实引起了查询的时延变大。那么倒排索引的原理是什么?适合于哪种业务场景?有没有可能跳过倒排索引,来进一步降低查询时延呢?本文基于GaussDB(for Influx)的实现,给您一一解答上述问题。
1. 为什么要使用倒排索引?
用以下数据作为示例进行说明,其中
Tag:region,service,host;
Field:cpu,mem;
数据源(SeriesKey):region+service+host;
一般涉及的查询有两种:
1)要查询某个数据源在某个时间点的cpu使用情况,例如:
select max(cpu) from mst where region=’北京’ and service=’influx’ and host=’host001’ and time>now()-30s
所有的tag都指定了相应的值。
2)给定部分维度,查询某些信息:例如要查询北京(region)的Influx(service)服务的cpu使用情况:
select max(cpu) from mst where region=’北京’ and service=’influx’ and time>now()-30s
只指定了部分tag值。
对于第一种查询方案,可以直接根据tag值来确定数据源,但是对于第二种场景,查询没有直接给出具体的数据源,仅指定了两个维度(region和service)以及查询的指标cpu,这种查询就需要根据部分维度组合(region=北京,service=influx)找到所有对应的数据源,例如在数据中北京的Influx服务有3台主机(host001, host002, host003),就需要查找到这3台主机数据源,这就需要倒排索引,否则就需要进行大量的数据扫描。
有了倒排索引,Influx的查询能力得到了很大的提升,但是随着数据量的不断增长,消耗在倒排索引的时间也越来越长;倒排索引的作用就是通过部分维度来找到对应所有的数据源,那么如果我们可以通过其他方式更快地找到数据源,就可以跳过倒排索引了。数据源是由tag set的value组成的,即由region,service,host三个tag的值组成,例如region=“北京”,service=“influx”,host=“host001”三个tag值就组成一个数据源。那么当业务要查询的查询里带了所有tag的值时,我们就可以根据查询语句来确定数据源,例如:
select max(cpu) from mst where region=’北京’ and service=’influx’ and host=’host001’ and time>now()-30s
该语句查询过去30s内北京region,Influx服务,host001主机的CPU的最大值。上面的查询带了需要确定数据源的所有tag的值,因此我们在这种查询中就可以跳过倒排索引的阶段,类似的查询我们也叫做单时间线查询。
2. GaussDB(for Influx)的实现方案
上一章节讲到,如果业务的查询是单时间线查询,我们就可以根据查询语句来确认数据源,而不用再去倒排索引中找。基于这个思路,GaussDB(for Influx)实现了hint特性,hint特性允许客户指定查询跳过倒排索引模块,直接去查找数据,从而进一步提高查询性能。
GaussDB(for Influx)通过定义特殊的hint语法来识别查询语句是否走倒排索引,系统解析业务查询语句时,如果识别到查询带有hint语法,就会跳过倒排索引查找的步骤,直接根据查询语句中tagset信息,找到数据源,去存储层查找对应的数据,其逻辑对比如下图:
3. Hint查询的性能
针对单时间线查询的场景下,我们测试了使用hint功能和不适用hint功能之间的性能。
测试条件为:300万时间线,单时间线查询;执行查询1000次取平均时延。下图为hint查询和非hint查询的测试结果对比:
从图中可以看出,在相同的查询语句和测试环境下,hint查询时延明显优于非hint查询。
4. Hint查询的使用
使用hint查询的方法也很简单,业务只需要少量的改动即可,在查询时添加hint查询标识/*+ full_series */。例如,常规查询语句为:
select max(cpu) from mst where region=’北京’ and service=’influx’ and host=’host001’ and time>now()-30s
改为用hint的方式,查询语句为:
select /*+ full_series */ max(cpu) from mst where region=’北京’ and service=’influx’ and host=’host001’ and time>now()-30s
在使用hint方式查询时,一定要确定是单时间线的查询,否则可能会出现查不出来数据的问题。
5. 总结
GaussDB(for Influx)通过提供hint功能,在单时间线的查询场景下,性能有大幅度的提升,能有效满足客户某些特定场景的查询需求。
除了以上优势外,GaussDB(for Influx)还在集群化、冷热分级存储、高可用方面也做了深度优化,能更好地满足时序应用的各种场景。
6. 结束
本文作者:华为 云数据库创新Lab & 华为云时空数据库团队
更多技术文章,关注GaussDB(for Influx)官方博客:
https://bbs.huaweicloud.com/community/usersnew/id_1586596796288328
Lab官网:https://www.huaweicloud.com/lab/clouddb/home.html
产品首页:https://www.huaweicloud.com/product/gaussdbforinflux.html
华为伙伴暨开发者大会2022火热来袭,重磅内容不容错过!
【精彩活动】
勇往直前·做全能开发者→12场技术直播前瞻,8大技术宝典高能输出,还有代码密室、知识竞赛等多轮神秘任务等你来挑战。即刻闯关,开启终极大奖!点击踏上全能开发者晋级之路吧!
【技术专题】
未来已来,2022技术探秘→华为各领域的前沿技术、重磅开源项目、创新的应用实践,站在智能世界的入口,探索未来如何照进现实,干货满满点击了解
揭秘华为云GaussDB(for Influx)最佳实践:hint查询的更多相关文章
- 揭秘华为云GaussDB(for Influx):数据直方图
摘要:本文带您了解直方图在不同产品中的实现,以及GaussDB(for Influx)中直方图的使用方法. 本文分享自华为云社区<华为云GaussDB(for Influx)揭秘第九期:最佳实践 ...
- MaxCompute 构建企业云数据仓库CDW的最佳实践建议
在本文中阿里云资深产品专家云郎分享了基于阿里云 MaxCompute 构建企业云数据仓库CDW的最佳实践建议. 本文内容根据演讲视频以及PPT整理而成. 大家下午好,我是云郎,之前在甲骨文做企业架构师 ...
- 升级的华为云“GaussDB”还能战否?
摘要:芯片.操作系统.数据库是现代信息技术领域的三大核心基础,做数据库,不仅需要技术和投入,对华为这种做通讯起家的企业,更需要的是一种并非玩票性质的态度. GaussDB,不仅蕴含着华为对数学和科学的 ...
- 华为云GaussDB(DWS)内存知识点,你知道吗?
前言 在日常数据库的使用中,难免会遇到一些内存问题.此次博文主要向大家分享一些华为云数仓GaussDB(DWS)内存的基本框架以及基本视图的使用,以便遇到内存问题后可以有一个基本的判断. 注意,本篇博 ...
- 腾讯云TDSQL PostgreSQL版 -最佳实践 |优化 SQL 语句
查看是否为分布键查询 postgres=# explain select * from tbase_1 where f1=1; QUERY PLAN ------------------------- ...
- 华为云PB级数据库GaussDB(for Redis)揭秘第七期:高斯Redis与强一致
摘要:在KV数据库领域,"强一致性"不仅是一个技术名词,它更是业务与运维的重要需求. 清明刚过,五一假期就要来了.大好春光,不如去婺源看油菜花吧!小云迅速打开APP刷出余票2张,赶 ...
- TOP100summit:【分享实录-华为】微服务场景下的性能提升最佳实践
本篇文章内容来自2016年TOP100summit华为架构部资深架构师王启军的案例分享.编辑:Cynthia 王启军:华为架构部资深架构师.负责华为的云化.微服务架构推进落地,前后参与了华为手机祥云4 ...
- 一文带你读懂!华为云在ACMUG技术沙龙上都透露了些啥?
摘要:近日,华为云数据库业务总裁苏光牛在ACMUG中国MySQL用户组主办的 "华为云专场" 技术沙龙中分享了华为云数据库重磅新品GaussDB的核心能力与竞争优势.那么, Gau ...
- klg-jpa:spring-data-jpa 最佳实践
klg-jpa:spring-data-jpa 最佳实践 项目介绍 码云地址:https://gitee.com/klguang/klg-jpa JPA是sun为POJO持久化制定的标准规范,用来操作 ...
随机推荐
- video标签学习使用
video标签学习使用 学习前的理解 video是HTML5中的新标签,可以用来播放视频.对于不同的浏览器支持的视频格式不一样,但是具体浏览器支持的类型并不清楚. 支持的类型 视频的格式分为编码格式和 ...
- Unity中让Update中的方法执行一次
Unity中让Update中的方法执行一次 Unity中,很多时候,代码需要放在Update中时刻监测状态,一旦状态符合,又只需要代码执行一次:其实可以通过设置控制量的方式,让代码只执行一次:方法:设 ...
- AS之AlertDialog使用
关于AlertDialog的使用,主要是去做一个弹窗. import android.content.DialogInterface; import android.os.Bundle; import ...
- Python窗口学习之搜索框美化
初学tkinter,感觉这个插件虽然是做界面的,但是没有html,也没有android那么人性化 既没有画圆角长方形的办法也没有添加透明按钮的办法(可能是我没找到) 所以自己用canvas画了两个扇形 ...
- 为什么局部内部类访问外边的局部变量必须为final
6.局部内部类访问外边的局部变量时,此变量必须为final类型 马克-to-win:由于技术方面的限制,java的设计者们做出如下语法规定:局部内部类访问外边的局部变量时,此变量必须为final类型, ...
- Override,Overload,Overwrite到底有什么区别?
Override,Overload,Overwrite的区别[新手可忽略不影响继续学习] 方法的覆盖(Override)是指子类重写从父类继承来的一个同名方法(参数.返回值也同),马克-to-win: ...
- Mysql_事务_存储过程_触发器
一.什么是事务? 事务(Transaction),一般是指要做的或所做的事情.在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit).事务通常由高级数据库操纵语言或编程语言( ...
- Spring5-IOC容器实现方式
spring提供了两个接口实现IOC容器 (1)BeanFactory:IOC容器基本实现,是Spring内部使用的接口,不提倡开发人员使用 特点:加载配置文件时侯不会创建对象,在获取对象时才会创建对 ...
- 【直播回顾】OpenHarmony知识赋能第四期直播——标准系统HDF开发
3月10日晚上19点,OpenHarmony开发者成长计划社群内,我们举办了知识赋能第四期直播课<OpenHarmony标准系统HDF框架介绍>,吸引了数千名开发者线上观看学习,并 ...
- 2021.07.18 P2290 树的计数(prufer序列、组合数学)
2021.07.18 P2290 树的计数(prufer序列.组合数学) [P2290 HNOI2004]树的计数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 重点: 1.pru ...