用子查询计算非重复条目,加速五十倍!

在线体验各类最新模型,更有模型 免费Token 额度领取!
立即体验
简介: 本文说的这个技术是通用的,但为了解释说明,我们选用了 PostgreSQL。感谢 pgAdminIII 提供的解释性插图,这些插图有很大帮助。

本文说的这个技术是通用的,但为了解释说明,我们选用了 PostgreSQL。感谢 pgAdminIII 提供的解释性插图,这些插图有很大帮助。


很有用,但是却很慢

计算非重复的数目是SQL分析的一个灾难,显然,我们要在第一篇博文上讨论。

首先一点:我们如果有一个很大的数据集而且可以容忍它不精确。一个像 HyperLogLog 的概率统计器可能是你的首选(我们在以后的博客中会讲到HyperLogLog ),但是要追求快速精准的结果,子查询的方法会节省你很多时间。

让我们从一个简单的查询语句开始吧:哪一个dashboard用户访问的最频繁。

select

 dashboards.name,

 count(distinct time_on_site_logs.user_id)

from time_on_site_logs

join dashboards on time_on_site_logs.dashboard_id = dashboards.id

groupbyname

orderby count desc

首先,让我们假设在user_id 和 dashboard_id上都有高效的索引,并且日志行数要比user_id 和 dashboard_id多很多。

仅仅一千万行数据,查询语句就花费了48秒的时间。知道为什么吗?让我们看一下明了的图解吧。

image.png

慢的原因是数据库要遍历dashboards表和logs表的所有记录,然后JOIN操作,然后排序,之后才进行实际需要的分组和聚集操作。


先聚集,然后联合数据表

分组和聚集之后,一切数据库操作的代价都变小了,因为数据的数量变小了。在分组和聚集的时候,因为我们不需要dashboards.name,所以我们可以在JOIN操作前先进行聚集操作:

select

 dashboards.name,

 log_counts.ct

from dashboards

join (

 select

   dashboard_id,

   count(distinct user_id) as ct

 from time_on_site_logs

 groupby dashboard_id

) as log_counts

on log_counts.dashboard_id = dashboards.id

orderby log_counts.ct desc

语句运行了24秒,获得了2.4倍的性能提高。在来看一下,图解可以清楚无误的表明原因。

image.png

像我们预期地那样,join操作之前先进行了group-and-aggregate操作。快上加快,我们还可以在time_on_site_logs 表上加上索引。


第一步,让你的数据变小

我们还可以做的更好,我们对日志表做group-and-aggregate操作时,我们处理了一些无关的数据,其实没有必要。我们可以对每个分组上创建一个哈希集合,这样,在每个哈希桶中让每个dashboard_id 挑出那些需要被看到处理的数据。

不用做那么多工作,只用一个哈希集合,我们就可以先去除那些重复的值。然后我们在这个结果上做聚集操作。

select

 dashboards.name,

 log_counts.ct

from dashboards

join (

 select distinct_logs.dashboard_id,

 count(1) as ct

 from (

   selectdistinct dashboard_id, user_id

   from time_on_site_logs

 ) as distinct_logs

 groupby distinct_logs.dashboard_id

) as log_counts

on log_counts.dashboard_id = dashboards.id

orderby log_counts.ct desc

我们让去重和分组聚集一步一步进行,分成两个阶段。首先在(dashboard_id, user_id)对上去重,然后在这基础上做简单快速的分组计算工作,JOIN操作还是放在最后。

image.png

让我们来揭晓最终效果:总共花费了0.7秒,是上一次的28倍,最初的68倍。

一般来说,数据大小和数据位置是很重要的,表中的属性字段的可能取值个数相对很少,所以才有那么明显的效果,与数据总量相比较,(user_id, dashboard_id) 对的不同值很少。越多的不同的值,各行的数据越分散,所以分组和计算它们花费越长的时间,果然天下没有白吃的午餐。

也许你下次计算非重复结果需要花费一天的时间,试着用子查询的方法减轻它的负载。


要问一下,你们是何许人也?

我们做了 Periscope,一个可以使SQL数据分析更快的工具。我们在这里分享一下我们的工具蕴含的算法和技术。你可以到我们的主页上注册,从而作为我们的新客户,我们可以通知你相关事宜。


相关文章
|
存储 Java Android开发
Rockchip系列之UART 新增framework系统jni+service接口访问(2)
Rockchip系列之UART 新增framework系统jni+service接口访问(2)
274 1
|
人工智能 物联网 PyTorch
8卡环境微调Grok-1实战
SWIFT(Scalable lightWeight Infrastructure for Fine-Tuning)是魔搭ModelScope开源社区推出的一套完整的轻量级训练推理工具,基于PyTorch的轻量级、开箱即用的模型微调、推理框架,让AI爱好者用自己的消费级显卡就能玩转大模型和AIGC。
|
6月前
|
存储 弹性计算 Linux
阿里云轻量应用服务器实例规格详解:vCPU、内存、系统盘、峰值带宽、线路类型及固定IP地址全解析
2026年阿里云轻量应用服务器全新升级,支持200M峰值带宽、不限流量,涵盖vCPU、内存、系统盘、公网IP等全配置解析,适用于个人与企业建站、开发测试等多种场景,详情请见官方页面。
|
4月前
|
定位技术 开发工具 C++
选型必看:UWB、蓝牙信标室内精准定位技术拆解和对比
本文直击UWB与蓝牙定位选型痛点,从精度(厘米级vs米级)、成本、开发难度及适用场景四维度对比:UWB适配工厂设备、医院仪器等高精度需求;蓝牙胜在低成本、易部署,适合考勤、访客管理等中小项目;融合方案则兼顾精度与经济性。选对技术,方能高效落地数字化管理
|
6月前
|
存储 弹性计算 安全
阿里云轻量应用服务器为什么卖得好?价格优惠、大带宽、性能稳定,个人及中小企业上云首选!
阿里云轻量应用服务器凭38元/年起超值价格、200Mbps大带宽、开箱即用(预装WordPress等)及ECS同源稳定架构,成为个人与中小企业上云首选,真正实现“便宜、好用、不折腾”。
396 12
|
6月前
|
存储 人工智能 分布式计算
阿里云 OpenLake:AI 时代的全模态、多引擎、一体化解决方案深度解析
阿里云徐晟详解OpenLake:构建全模态、多引擎、一体化智能数据体系,融合大数据与AI,支持湖仓一体、Agentic Data及AI搜索,助力企业降本增效、加速AI落地。(239字)
909 2
阿里云 OpenLake:AI 时代的全模态、多引擎、一体化解决方案深度解析
|
7月前
|
人工智能 自然语言处理 算法
2025年 GEO行业年度鸟瞰全景报告:商业化深耕期的全球竞合与企业适配指南
2025年,中国生成式AI搜索(GEO)市场规模突破480亿元,年增68%。技术成熟与企业需求推动商业化爆发,多模态检索、垂直领域适配成主流。头部效应显著,国内外巨头竞逐本土化与全球化赛道,中小企业迎来轻量化机遇。
|
11月前
|
人工智能 弹性计算 自然语言处理
【限时福利】计算巢平台热门AI服务免费试用,零门槛体验AI创新力量!
计算巢平台推出热门AI服务免费试用活动,集成大模型、图像生成、自然语言处理等多种AI技术,提供免费GPU算力与存储资源,助力开发者零门槛体验前沿技术,加速创新落地。
348 0
|
网络协议 安全 算法
"网络世界的守护者:一探究竟TCP协议如何确保数据传输的绝对安全与可靠"
【8月更文挑战第20天】传输控制协议(TCP)是网络通信中的核心协议之一,它确保数据包能可靠、有序地从源头传输到目的地。TCP采用三次握手的方式建立连接,并通过序列号、确认应答及超时重传来保障数据传输的准确性。此外,TCP还具备流量控制与拥塞控制功能,避免网络拥塞。虽然TCP在可靠性上表现优异,但在快速传输场景中可能存在局限。深入理解TCP对于网络工程师和开发者至关重要。
581 1
|
Ubuntu 搜索推荐 Linux
【专栏】8款适合学生的Linux发行版,看看有没有你喜欢的!
【4月更文挑战第28天】本文介绍了8款适合学生的Linux发行版:Ubuntu(用户友好,稳定且有教育资源)、Linux Mint(优化用户体验)、Fedora(创新前沿)、openSUSE(强大稳定)、Elementary OS(简洁设计)、Manjaro(Arch Linux的易用版)、Zorin OS(类似Windows)和Kubuntu(KDE桌面环境)。选择时需考虑易用性、软件资源、社区支持和稳定性。这些发行版各具特色,适合不同需求的学生,有助于提升技术能力和探索精神。建议学生亲自尝试,找到最适合自己的Linux发行版,以适应不断发展的技术环境。
781 0