首页 > 数据库 >高基数 GroupBy 在 SLS SQL 中的查询加速

高基数 GroupBy 在 SLS SQL 中的查询加速

时间:2024-09-05 16:49:49浏览次数:10  
标签:聚合 查询 session SQL SLS 基数 GroupBy

作者:顾汉杰(执少)

什么是高基数 GroupBy

简单来说,想要分析的数据,拥有超多的“唯一值计数”(Distinct Count),而我们需要对这些数据进行分组分析(如统计次数、排名、计算均值、分位值等)。

高基数聚合计算在很多运营分析场景中都是刚需,它涉及对值不一样的海量数据进行分组聚合计算,以洞察用户行为、游戏玩家路径、市场趋势或产品表现等运营分析的关键指标。例如,在电商平台上,分析一段时间内不同商品类别在各个地区的销量分布,或者在游戏运营分析场景中,追踪玩家在游戏中的独特操作行为和路径,这些都需要处理基数极高的数据(如 ItemId、RequestId、TraceId 等,动辄上千万甚至亿级别的基数)。

现在的问题是,用户在进行此类分析时,由于数据量和复杂度的不同,SQL 执行耗时往往可能从数秒到数分钟甚至数小时不等,“高基数 GroupBy 执行太慢”,几乎成为用户的普遍认知,也是众多数据库和 OLAP 引擎重点关注的对象。SLS SQL 也持续关注这一点,并对此进行了相应的性能优化,本文即旨在向用户介绍 SLS 中的实现原理、查询加速手段以及适用场景。

GroupBy 的实现原理

GroupBy 是几乎所有 OLAP 引擎必备的基础聚合能力,分布式计算引擎一般将海量数据以 Hash 散列的方式分布到不同节点进行分组(分桶)计算,每个分组内对数据进行聚合,然后再基于堆(往往使用 PriorityQueue)进行排序或 Limit,最终输出给用户需要的数据,比如 TopN 排行结果等。

这个过程中,我们可能还会用到预聚合技术:利用数据的局部性原理,对原始数据进行预聚合(PartialAgg),然后再发往最终聚合节点(FinalAgg),以减少网络间数据传输开销。

所以,总体来说,GroupBy 聚合计算大致会经历以下四个过程:DataSource -> PartialAgg -> FinalAgg -> Output。

其中,DataSource 和 PartialAgg 一般是绑定在一起执行,而 FinalAgg 以及 Output 则由分布式网络中的另外一些节点执行。

体验 SLS 高基数 GroupBy 查询加速

有了上面的基础知识和了解后,我们开门见山,直接带大家来感受一下 SLS 中的上亿级别高基数 GroupBy 的查询加速体验。

为了更客观地评估和分析下面的性能变化,我们必须先讲清楚我们的测试数据和测试用例情况。

测试数据

我们采用了模拟的类似 Nginx 服务访问日志,保存在一个 Project/Logstore 中,SQL独享版 CU 数设置为 5000。测试数据 Schema 如下:

{  RequestId: varchar, /*测试数据会确保每个请求ID确保全局唯一*/  ClientIP: varchar,  Method: varchar,  Latency: int,  Status: int,  ...}

测试用例

我们准备了 3 种测试用例,分别对应 3 种不同的业务分析场景:

  1. 高基单列聚合:对 28 亿条请求日志,按 RequestId 字段进行 GroupBy 统计计数(实际基数为 28 亿)
  2. 高基多列聚合:对 45 亿条请求日志,按 ClientIp、Status、Latency 字段进行 3 列 GroupBy 统计计数(实际基数为 15 亿)
  3. 低基数值聚合:对 1.5 万亿条请求日志,按 Latency 字段统计 Top100 的频次(实际基数为 735 万)

测试说明

  1. 由于我们系统中设计有多级缓存,为了避免缓存对于测试的影响干扰,我们会在每次查询时通过添加 not <不存在的keyword> 过滤条件来避开缓存,以确保每次查询都进行完整的物理执行,公平地对比整体执行性能。
  2. 测试过程使用的是真实线上服务(地域为上海),测试数据真实存储在 SLS Logstore 中,但因分片数以及数据分布特征不尽相同,因此不同用户的数据实测结果可能略有差异,但相同量级应该大同小异。

标签:聚合,查询,session,SQL,SLS,基数,GroupBy
From: https://www.cnblogs.com/alisystemsoftware/p/18398782

相关文章

  • MySQL优化-explain:字段,索引相同的多个数据库为什么他们的type,key,key_len会不一样
    实习倒数第二天,偶然间查了查自己的写的sql语句性能有没有问题。selectCOL1,COL2,COL3frominf_logwhereCODE='AAA'andORDER_ID='123456';上述字段中,code与order_id都被设置为索引IDX_MIAN_ID,IDX_CODE。也就是说,正常情况下这两个索引应该是都会命中公司实现了表的水平......
  • pgsql计算加减乘除:深入探索PostgreSQL中的数学运算
    pgsql计算加减乘除:深入探索PostgreSQL中的数学运算在数据库管理系统中,进行基本的数学运算是非常常见的需求。PostgreSQL(简称pgsql),作为一个功能强大的开源对象-关系数据库系统,提供了丰富的数学函数和操作符来支持加减乘除等基本运算。本文将深入探讨如何在PostgreSQL中执行这些运算......
  • sqlmap工具查询接口是否存在sql注入
     转:https://blog.csdn.net/m0_63641882/article/details/134529081 sqlmap-u'https://orgvue3.cyberwing.cn/api/org/tree/unitTree?id=0&_t=1725517383534'--header'Authorization:BearereyJraWQiOiI2MGMyY2RiNC03N2NlLTQzYzMtOTdiNS0xNmE1YjVlM......
  • linux操作MySQL
    查看mysql是否正确安装sudorpm-qa|grepmysql查看mysql服务单元文件所在位置一般情况下,mysql的服务单元文件所在路径:/usr/lib/systemd/system说明:这个目录下面,如果放置的是mysqld.service文件,那么启动MySQL的时候需要使用的是mysqld;如果放置的是mysql.service文件,......
  • MySQL内存优化指南:深入配置与性能提升
    在数据库管理中,内存的使用和优化是提升数据库性能的关键因素之一。MySQL作为一种流行的关系型数据库管理系统,提供了多种配置选项来优化内存使用,从而提高数据库的响应速度和处理能力。本文将详细介绍如何在MySQL中配置和优化内存使用,包括内存参数的配置、内存使用的监控以及......
  • SQL SERVER巡检脚本
    print'----------------------------'print'开始巡检'print'----------------------------'print'1.查看数据库版本信息'print'----------------------------'print'*********************************'SETNOCOUNTON;u......
  • MySQL数据归档策略:实现定期数据维护与优化
    在数据库管理中,数据归档是一个重要的环节,它不仅有助于维护数据的完整性和安全性,还可以优化数据库的性能。对于MySQL数据库,实现数据的定期归档可以通过多种方法,包括使用事件调度器、编写脚本或利用第三方工具。本文将详细介绍如何在MySQL中设置和执行定期归档任务,以确保数据......
  • 活动在即,不容错过丨亚信安慧AntDB诚邀您参加“PostgreSQL数据库技术峰会”
    ​​9月7日下午,“PostgreSQL数据库技术峰会”西安站将在西安市西安元谷学习中心4号厅举办。湖南亚信安慧科技有限公司(简称“亚信安慧”)受邀参会,将带来《提升企业数据安全,AntDB数据库回收站技术应用》的精彩演讲。在此,亚信安慧AntDB数据库诚邀您莅临参会,与业内专家共同探讨数据库技......
  • 20240904_182638 mysql 填空题 变量
    查看所有的系统变量名称showvariables查看所有系统变量中以auto开头的名称showvariableslike'auto%'查看系统变量autocommit的值select@@autocommit设置系统变量autocommit的值为1setautocommit=1设置自定义变量name的值为'tom'set@name='tom'查看自定义变量nam......
  • CentOS安装MySQL8教程
    官方地址:https://dev.mysql.com/downloads/mysql/选择版本前需先看一下服务器的glibc版本ldd--version上传将下载好的tar包上传到服务器上,这里演示上传到了/usr/local/文件夹下   (也可以自定义位置)解压tar-Jxvfmysql-8.0.39-linux-glibc2.17-x86_64.tar.......