范叶亮写智能体、模型和数据系统时,习惯先把定义和边界钉死。把「大数据 SQL 性能调优」整理成可落地的中文笔记:问题在哪、默认做法会踩什么坑、该怎么选。原站导航和广告已去掉。

执行引擎

在日常工作中,数据处理和分析在研发、产品和运营等多个领域起着重要的作用。在海量数据处理和分析中,SQL 是一项基础且重要的能力。一个优秀的 SQL Boy 和茶树姑的 SQL 代码除了保持简单、可读和易于维护的 样式风格 外,还需要具备良好的执行性能,准确且高效的计算出结果才能让你在工作中决胜于千里之外。

计算资源量是一个前置制约因素,理论上更多的资源能够带来更快的计算效果。计算数据量也可以认为是一个前置制约因素,理论上更大的数据量会导致计算速度降低,但对于复杂的计算逻辑,通过合理的 SQL 可以更好的控制计算过程中的数据量,从而提升 SQL 性能。计算复杂度是影响 SQL 性能的关键因素,复杂的业务逻辑必然比简单的业务逻辑处理时间要长,相同业务逻辑的不同 SQL 实现也会影响运行效率,这就要求我们对业务逻辑进行全面的理解,对实现 SQL 进行合理优化,从而提升计算速度。

Hive

SQL 是用于一种用于数据定义和数据操纵的特定目的的编程语言 1 。SQL 虽然有 ISO 标准 2 ,但大部分 SQL 代码在不同的数据库系统中并不具有完全的跨平台性。不同的执行引擎也会对 SQL 的语法有相应的改动和扩展,同时对于 SQL 的执行也会进行不同的适配和优化。因此,脱离执行引擎的 SQL 性能优化是不可取的。

Apache Hive 是一个建立在 Hadoop 架构之上的数据仓库。可以将结构化的数据文件映射为一张数据库表,并提供简单的 SQL 查询功能,可以将 SQL 语句转换为 MapReduce 任务进行运行。因此 MapReduce 是 Hive SQL 运行的核心和根基。

Spark

我们以 Word Count 为例简单介绍一下 MapReduce 的原理和过程,Word Count 的 MapReduce 处理过程如下图所示:

Apache Spark 是一个用于大规模数据处理的统一分析引擎,Spark SQL 则作为 Apache Spark 用于处理结构化数据的模块。

Presto

Presto 是一种用于大数据的高性能分布式 SQL 查询引擎。Presto 与 Hive 执行任务过程的差异如下图所示:

虽然 Presto 能够处理 PB 级数据,但并不代表 Presto 会把 PB 级别数据都放在内存中计算。而是根据场景,例如 COUNT 和 AVG 等聚合操作,是边读数据边计算,再清理内存,再读取数据计算,这种情况消耗的内存并不高。但是连表查询,可能产生大量的临时数据,从而速度会变慢。

性能调优

本节关于 SQL 性能调优的建议主要针对 Hive,Spark 和 Presto 这类大数据 OLAP 执行引擎设计,其他执行引擎不一定完全适用。

CREATE TABLE IF NOT EXISTS sku_order ( order_id STRING '订单 ID' , sku_id STRING '商品 ID' , sale_quantity BIGINT '销售数量' ) COMMENT '商品订单表' PARTITIONED BY ( dt STRING COMMENT '日期分区' ) ; CREATE TABLE IF NOT EXISTS sku_info ( sku_id STRING '商品 ID' , sku_name STRING '商品名称' , category_id STRING '品类 ID' , category_name STRING '品类名称' ) COMMENT '商品信息表' 减少数据量 限定查询分区。对于包含分区的数据表(例如:日期分区),通过合理限定分区来减少数据量,避免全表扫描。 限定查询字段。避免使用 SELECT * ,仅选择需要的字段。 SELECT * 会通过查询元数据获取字段信息,同时查询所

减少数据量

SELECT category_name , SUM ( sale_quantity ) AS sale_quantity FROM ( SELECT sku_id , sale_quantity FROM sku_order WHERE dt = '20210523' AND sku_id IS NOT NULL ) AS sku_order_filtered LEFT JOIN sku_info ON sku_order_filtered . sku_id = sku_info . sku_id GROUP BY category_name ; 对于 JOIN 开启 Map Join 或 Broadcast Join 策略,将小表广播到每个 Executor 上来避免产生 Shuffle,从而使得 JOIN 能够快速完成。

set spark.sql.autoBroadcastJoinThreshold = 10485760 ; 对于 JOIN 中存在数据倾斜的 KEY 进行打散处理。

值得单独记下的点

  • 计算复杂度(业务逻辑复杂程度和对应的 SQL 实现和执行)
  • Splitting :讲输入数据分割为若干部分。
  • Mapping :针对 Splitting 分割的每个部分,对应有一个 Map 程序处理。本例中将分割后的文本统计成 <K,V> 格式,其中 K 为单词, V 为该单词在这个 Map 中出现的次数。
  • Shuffling :对 Mapping 的相关输出结果进行合并。本例中将具有相同 K 的统计结果合并到一起。
  • Reducing :对 Shuffling 合并的结果进行汇总。本例中讲相同 K 的 V 值进行加和操作并返回单个统计结果。
  • Merged :对 Reducing 的结果进行融合形成最终输出。
  • RDD :Resilient Distributed Dataset,弹性分布式数据集,是分布式内存中一个抽象概念,提供了一种高度受限的共享内存模型。
  • DAG :Directed Acyclic Graph,有向无环图,反应了 RDD 之间的依赖关系。

落地时建议先做的 5 件事

  1. 先写清任务能不能被自动验证:能验证的交给系统和评测,不能验证的留给人审。
  2. 本地部署先算显存、延迟和失败回滚,不要只看能跑通一次。
  3. 多智能体只在单智能体触到上下文或专业边界时再拆。
  4. Token、微调和压缩都要有对照数字,避免口号式优化。
  5. 结论写成可检查清单:接口、超时、评测集、回滚版本。

和智能体产品怎么接

龙虾PRO做 OpenClaw 落地时,最该拿走的是「单智能体先做好工具和提示,再谈编排」。数字员工、技能市场和网关应共用同一套评测与权限,而不是各写一套角色人设。

本文侧重全链路风控方法论。落地时请用自身业务单据做回放验证,不要把示例阈值直接当生产策略。 相关:风控体检 · 方案资源

常见问题 FAQ

什么是AI智能系统?

「AI智能系统」可概括为:在日常工作中,数据处理和分析在研发、产品和运营等多个领域起着重要的作用。在海量数据处理和分析中,SQL 是一项基础且重要的能力。一个优秀的 SQL Boy 和茶树姑的 SQL 代码除了保持简单、可读和易于维护的 样式风格 外,还需要具备良好的执行性能,准确且高效的计算出结果才能让你在工作中决胜于千里之外。 本文从定义、方法与实践要点展开说明。

为什么要关注AI智能系统?

关注AI智能系统,是因为它直接影响效率、风险与可复制性。文中指出:在日常工作中,数据处理和分析在研发、产品和运营等多个领域起着重要的作用。在海量数据处理和分析中,SQL 是一项基础且重要的能力。一个优秀的 SQL Boy 和茶树姑的 SQL 代码除了保持简单、可读和易于维护的 样式风格 外,还需要具备良好的执行性能,准确且高效的计算出结果才能让你在工作中决胜于千里之外。

如何落地AI智能系统?有哪些关键步骤?

建议按以下路径推进AI智能系统:1) 计算复杂度(业务逻辑复杂程度和对应的 SQL 实现和执行);2) Splitting :讲输入数据分割为若干部分。;3) Mapping :针对 Splitting 分割的每个部分,对应有一个 Map 程序处理。本例中将分割后的文本统计成 <K,V> 格式,其中 K …;4) Shuffling :对 Mapping 的相关输出结果进行合并。本例中将具有相同 K 的统计结果合并到一起。;5) Reducing :对 Shuffling 合并的结果进行汇总。本例中讲相同 K 的 V 值进行加和操作并返回单个统计结果。。细节见正文对应章节。

AI智能系统适合哪些人或团队?

AI智能系统更适合:产品/技术负责人、运营与增长团队、需要落地智能体或自动化的中小团队、关注「AI智能系统」方向的读者。若你只需要单次聊天式问答,可先读概念;若要上生产,请重点看步骤、权限与风控相关段落。

关于「执行引擎」,本文给出了什么结论?

在「执行引擎」部分,要点是:置制约因素,理论上更多的资源能够带来更快的计算效果。计算数据量也可以认为是一个前置制约因素,理论上更大的数据量会导致计算速度降低,但对于复杂的计算逻辑,通过合理的 SQL 可以更好的控制计算过程中的数据量,从而提升 SQL 性能。计算复杂度是影响 SQL 性能的关键因素,复杂的业务逻辑必然比简单的业务逻辑处理时间要长,相同业务逻辑的不同 SQL 实现也会影响运行效率,这就要求我们对业务逻辑进行全面的理解,对实现 SQL 进行合理优化,从

关于「Hive」,本文给出了什么结论?

在「Hive」部分,要点是:'销售数量' ) COMMENT '商品订单表' PARTITIONED BY ( dt STRING COMMENT '日期分区' ) ; CREATE TABLE IF NOT EXISTS sku_info ( sku_id STRING '商品 ID' , sku_name STRING '商品名称' , category_id STRING '品类 ID' , category_name STRING '品类名称' ) COM