“谓词下推”和“投影下推”有什么区别?

时间:2019-10-04 10:58:26

标签: apache-spark bigdata parquet

我遇到了多种信息来源,例如发现here的信息来源,其将“谓词下推”解释为:

  

...如果您可以将查询的一部分“下推”到存储数据的位置,从而过滤掉大部分数据,则可以大大减少网络流量。

但是,我在其他文档(例如here)中也看到过“投影下推”一词,这似乎是同一回事,但我不确定。

两个词之间有特定区别吗?

2 个答案:

答案 0 :(得分:1)

谓词是指where / filter子句,它影响返回的行数。

投影指的是选定的列。

例如:

如果过滤器仅通过5%的行,则只有5%的表将从存储传递到Spark,而不是整个表。

如果您的投影只选择了10列中的3列,则更少的列将从存储传递到Spark,并且如果您的存储是柱状的(例如Parquet,不是Avro)并且未选择的列也不是过滤器的一部分,那么甚至不必阅读这些列。

答案 1 :(得分:0)

在集合和袋关系代数中,谓词下推消除了元组。

在袋关系代数中,投影下推消除了属性(“列”),但是在基于列的存储的情况下,这没什么大不了的,因为没有被使用到更高的列。甚至基于行的数据库也可能不会受益于投影下推(甚至SQL都没有指定物理访问计划)。袋子RA中的投影是非常名义上的操作,可以在元数据级别上物理完成(将某些列标记为不可访问)。

在集合关系代数中,投影下推通常也消除了元组,因此这才有意义。由于需要重复数据删除,因此设置RA投影并不是一项廉价的操作。就像GROUP BY,没有聚合的字段。不过,由于元组数量可能会大量减少,因此在连接之前进行投影通常还是值得的。

袋代数工具,例如。 SQL还具有设置RA投影的方法,例如SELECT DISTINCT

在所有情况下,谓词下推和投影下推都不会导致更好的执行。取决于它们的选择性和许多其他因素。仍然,特别是谓词下推是一种很好的启发式方法,因为连接往往最昂贵。

如果下推式投影具有用于保留字段的排序索引,或者需要扫描表,则可能存在可以将投影与之融合的联接算法,从而避免了表/索引结构的双重读取。 / p>