Presto/Hive SQL关联取用户名:用子查询还是Join?
方案选择结论
在Hive环境下该场景优先使用JOIN实现关联,不推荐你写的相关子查询写法,核心原因如下:
- 你写的是关联型标量子查询,外层
Assigned_Tasks表每扫描出一行,就会触发一次Employee_info表的匹配逻辑,数据量稍大时性能会极差。Hive对这类子查询的优化能力远不如JOIN,很容易出现任务卡滞、资源占用过高的问题。 - 这类子查询容错性差:如果
Employee_info中同一个employee_id存在多条重复记录,子查询会直接抛出运行错误;而JOIN写法可以提前对员工表做去重处理,结果可控性更强。 - 后续扩展成本低:如果之后需要额外获取员工所属团队
employee_team等字段,JOIN写法只需要在SELECT子句中增加对应字段即可,子查询需要重复写嵌套逻辑,维护更麻烦。
正确SQL写法
你之前写的基础语句和子查询示例还有几个语法问题:漏写了主表表名、字段名task_numb和表结构定义的task_number不一致、子查询字段后漏写逗号。
推荐用LEFT JOIN做关联,避免出现任务表中owner_id在员工表无匹配时,整行任务数据被意外过滤的问题,不会漏数:
SELECT t.task_number, t.owner_id, e.employee_name AS owner, t.title, t.description, t.progress FROM Assigned_Tasks t LEFT JOIN ( -- 提前去重,避免员工表同ID多条数据导致结果行数膨胀 SELECT DISTINCT employee_id, employee_name FROM Employee_info ) e ON t.owner_id = e.employee_id WHERE t.ds = '<today>' AND t.progress != 'FINISHED';
如果确认Employee_info表中employee_id是全局唯一主键,可以去掉JOIN子句里的DISTINCT逻辑,直接关联原表即可。
补充说明:只有当外层查询返回结果集极小(比如仅几十、上百行)时,你写的标量子查询不会出现明显性能问题,但从开发规范和通用性角度,统一使用JOIN写法是最优选择,不需要每次根据数据量切换写法。
内容的提问来源于stack exchange,提问作者thatoneguy
相关产品推荐
相关产品推荐

