讲师中心 微信公众号

工具推荐

视频效率加速
Laper
Laper

剧本策划到成片协作

剧云
剧云

中文短剧剧本制作平台

立刻MV
立刻MV

低成本歌曲 MV、视频生成

updream

一键生成高质量推广成片

SQL Presto 查询优化实践

云瑶吖_3761

云瑶吖_3761

发布时间:2026-02-14 20:16:02

|

330人浏览过

|

来源于php中文网

原创

Presto中JOIN条件应优先放ON子句(尤其外连接),WHERE条件用于最终过滤;小表过滤宜用显式JOIN而非IN子查询;GROUP BY高基数字段置前可防数据倾斜;CTE默认不物化,需结合数据量与内存谨慎使用。

sql presto 查询优化实践

WHERE 条件写在 JOIN 里还是外面? Presto 的执行计划对 JOIN 和 WHERE 的位置极其敏感。把过滤条件放在 ON 子句里(尤其是外连接)可能让结果变错,而放在 WHERE 里又可能拖慢速度——因为 Presto 会先完成 JOIN 再过滤。
  • 外连接(LEFT JOIN)时,ON 中的条件只影响右表匹配逻辑;WHERE 中的条件会对整个结果行过滤,可能把左表本该保留的 NULL 行干掉
  • 内连接(INNER JOIN)下,ON 和 WHERE 效果等价,但 Presto 更倾向把 WHERE 下推到扫描阶段,实际更快
  • 如果右表有高基数字段(比如 user_id),在 ON 里加额外条件(如 status = 'active')能显著减少中间数据量

示例:

SELECT a.id, b.name  
FROM orders a  
LEFT JOIN users b ON a.user_id = b.id AND b.status = 'active'  -- ✅ 减少右表参与 JOIN 的行数  
WHERE a.dt = '2024-06-01'

用 IN 还是 JOIN 做维度表过滤? 当你要用一张小表(比如几十行的 region_map)去筛大表(比如上亿行的 events),别急着写 WHERE country_code IN (SELECT code FROM region_map)。
  • Presto 对子查询 IN 支持有限,尤其嵌套深或子查询含聚合时,容易触发 Query exceeded distributed memory limit
  • 更稳的方式是显式 JOIN + DISTINCT,让 Presto 能走 broadcast join(小表自动分发到所有 worker)
  • 如果小表超过 1MB 或行数超 10 万,Presto 可能放弃 broadcast,转为 shuffle join——这时得手动加 /<em>+ BROADCAST(t) </em>/ 提示

要点:

  • 小表必须真正“小”:单条记录别太宽,总大小控制在几百 KB 内
  • 确保小表没重复键,否则 JOIN 会放大结果行数
  • 避免 IN (VALUES (...)) 超过 1000 项,Presto 解析会变慢

GROUP BY 字段顺序影响性能吗? 不影响正确性,但影响 shuffle 和内存使用。Presto 的 GROUP BY 实际依赖底层的 hash 分组机制,字段顺序决定 hash key 的构成方式。
  • 把高基数字段(如 user_id)放前面,低基数字段(如 country)放后面,能让数据更均匀地分散到各 worker,避免 skew
  • 反过来,如果先把 country 放第一位,所有中国用户全挤在一个 reducer 上,就容易触发 Query exceeded per-node memory limit
  • 如果用了 GROUPING SETS,字段顺序还会影响最终结果集的排序稳定性(虽然 Presto 不保证默认顺序,但物理 layout 会变)

常见错误现象:

  • 查询跑一半报 Exceeded memory limit,但看 profile 发现某个 worker 的 peak memory 是其他 worker 的 5 倍以上
  • 加了 EXPLAIN (FORMAT JSON) 后发现 HashAggregationNode 的 groupingKeys 顺序和直觉相反

CTE(WITH 子句)真能提升可读性?小心物化陷阱 Presto 默认不物化 CTE,也就是每个引用都会重新执行一遍。你以为写一次 WITH base AS (SELECT ...) SELECT * FROM base JOIN ... UNION ALL SELECT * FROM base JOIN ... 是省事,其实是翻倍扫描。
  • 没有 hint 的 CTE 就是个语法糖,不是临时表
  • 如果 CTE 结果不大(/+ WITH_DATA / 强制物化(Presto 350+ 版本支持)
  • 但物化后会占用 worker 内存,多个并发查同一个 CTE 可能互相挤占资源

使用场景判断:

  • CTE 里含昂贵计算(如 json_parse()、正则匹配)且被多次引用 → 值得物化
  • CTE 只是简单 SELECT ... FROM large_table WHERE dt = 'xxx' → 别物化,让 Presto 自己下推过滤更高效
  • 用 EXPLAIN 看执行计划,如果同一个 TableScanNode 出现两次,说明没复用

复杂点在于:物化与否不能只看代码写法,得结合数据量、集群内存配置、并发压力一起权衡。很多人调完 CTE 发现查询变慢,回头一看是物化吃光了内存,又没开 spill。

热门AI工具

更多
DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

超级麦吉

一款通过数字员工协作完成调研、数据分析与文档制作的AI办公平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

4943

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1011

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

1289

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

7001

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

3663

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

6980

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

9741

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

1330

2024.04.29

Go-Zero API开发使用教程
Go-Zero API开发使用教程

本专题聚焦Go-Zero的API开发,拆解.api描述文件的语法结构、路由与分组定义、参数绑定与校验规则,说明统一响应体、JWT鉴权、跨域与接口文档生成的落地方式,并给出网关聚合与接口测试的实践建议。

0

2026.11.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Webpack4.x---十天技能课堂
Webpack4.x---十天技能课堂

共20课时 | 2.1万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 0.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn