什么是谓词下推
谓词下推是一种优化技术,它可以在查询时减少 IO 操作和 CPU 开销,从而提高查询性能。这种优化技术适用于关系型数据库、Hadoop 和其他大数据处理系统。
在 SQL 查询中,谓词是一个用于限制结果集的条件,例如 WHERE 子句中的条件。谓词下推是将谓词推送到最低可能层级的数据源上,以减少查询的数据量。
例如,在 Hadoop MapReduce 作业中,谓词下推可以将谓词应用于 Map 阶段的数据记录,而不是在 Reduce 阶段进行数据过滤。这样做可以降低网络传输数据量和计算负载,提高作业执行速度。
同样,在关系型数据库中,谓词下推可以将谓词应用于数据表上,以减少检索数据的行数和列数,提高查询效率。
Hive 发生谓词下推的场景
- inner join on 后条件都下推,full join on 后条件都不会下推。
- left join on 右表条件会下推,on 左表条件不会下推。(左表是主表,无论如何都会扫描左表的)
- right join on 左表条件会下推,on 右表条件不会下推。
注意
这种优化在某些场景可能导致期望的数据与实际的数据有差异,需要明确。
SELECT
e.id ,
e.name ,
e.department ,
esm.`month` ,
esm.sale
from employee e
left join employee_sale_month esm
on e.id = esm .e_id
and e.department = 'IT'
-- where e.department = '第3销售部'
;
on 后面跟着左表的过滤条件,不会进行谓词下推。会扫描主表 e 的所有数据。返回的结果类似于
id name department month sale
1 jack IT 202301 5000
1 jack IT 202302 4000
2 Tom SALE NULL NULL
3 Rose MARKET NULL NULL
id | name | department | month | sale |
---|---|---|---|---|
1 | jack | IT | 202301 | 5000 |
1 | jack | IT | 202302 | 4000 |
2 | tom | SALE | NULL | NULL |
3 | rose | MARKET | NULL | NULL |