谓词下推
什么是谓词下推
所谓谓词(predicate),英文定义如下:A predicate is a function that returns bool (or something that can be implicitly converted to bool),也就是返回值为布尔类型的函数。在 SQL 语句中,没有函数(方法),只有表达式,where 后面的表达式就是起到了谓词的作用。
谓词下推(predicate pushdown),中心思想就是将过滤表达式尽可能地移至靠近数据源的位置,将外层查询块中的谓词移入所包含的较低层查询块,从而能够更早的对数据进行过滤,以及更好的利用索引。
对于分布式计算来说,谓词下推就是:不影响结果的情况下,尽量将过滤条件提前执行。
在关系型数据库中
例如以下两张表:
t_student
t_score
原始的 SQL 语句:
SELECT *
FROM t_student,t_score
WHERE t_score.student_id=t_student.student_id
AND t_score.score_id=2;
在对比一下优化后的 SQL 语句:
SELECT * FROM t_student t1 right JOIN (
SELECT * from t_score WHERE score_id=2
) t2
ON t1.student_id=t2.student_id;
优化后的 SQL 语句,将 WHERE 条件由 join 外部调整到了 join 的临时表中,使得 t_score 表在 join 前先进行了一次过滤,只剩下 id=2
的记录,在减少了 join 的数据量的同时,也很好的利用了索引。
分布式数据库中
在分布式数据库中,谓词下推的优势更加明显。当对 SQL 做谓词下推优化后,过滤可以更加接近数据源,减少了 map 端的输出,从而减少了无关数据在网络间的传输开销。在使用 Parquet 格式的情况下,甚至存在文件被整块跳过的情况。
分布式计算中为什么要进行谓词下推
在大数据领域,影响程序性能的主要原因并不是数据量大小,而是数据倾斜,谓词下推可以使程序提前过滤掉部分数据,降低 join 等一系列操作的数量级。