0

0

SQL Presto 查询优化实践

舞姬之光

舞姬之光

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

|

270人浏览过

|

来源于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)下,ONWHERE 效果等价,但 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 会变)

常见错误现象:

HiShop网店代理分销系统
HiShop网店代理分销系统

Hishop.5.2.BETA2版主要更新: [修改] 进一步优化了首页打开速度 [修改] 美化了默认模板 [修改] 优化系统架构,程序标签及SQL查询效率,访问系统页面的速度大大提高 [修改] 采用了HTML模板机制,实现了前台模板可视化编辑,降低模板制作与修改的难度. [修改] 全新更换前后台AJAX技术框架,提升了用户操作体验. 店铺管理 [新增] 整合TQ在线客服 [修改] 后台广告位增加

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

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助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

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

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

943

2023.10.12

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

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

334

2023.10.27

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

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

375

2024.02.23

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

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

1656

2024.03.06

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

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

370

2024.03.06

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

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

1231

2024.04.07

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

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

583

2024.04.29

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

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

434

2024.04.29

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

145

2026.02.13

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
SciPy 教程
SciPy 教程

共10课时 | 1.6万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号