我遇到了几个信息源,比如在这里找到的一个,它将“谓词下推”解释为:如果您可以将查询的某些部分“下推”到数据存储的位置,并因此过滤掉大部分数据,那么您可以大大减少网络流量。然而,在其他文档中(比如这里)我也看到了“投影下推”这个术语,它似乎是同样的东西,但我对我的理解不确定。这两个术语之间有具体差异吗?
谓词指影响返回的行数的where/filter子句。 投影是指选择的列。 例如: 如果你的过滤器只通过了5%的行,那么仅有5%的表将从存储传递到Spark而不是整个表。 如果你的投影仅选择了10列中的3列,那么将传输更少的列从存储到Spark,如果你的存储是列式的(例如Parquet,而不是Avro)并且未选择的列不是过滤器的一部分,那么这些列甚至不必被读取。
在集合和包关系代数中,谓词下推可以消除元组。在包关系代数中,投影下推可以消除属性(“列”),但在基于列的存储情况下,这并不重要,因为在高层未使用的列根本不需要携带。即使是基于行的数据库也可能受益于投影下推(即使SQL也没有指定物理访问计划)。包RA中的投影是一个非常名义的操作,可以仅在元数据级别上进行物理操作(将某些列标记为不可访问)。在集合关系代数中,投影下推通常也消除元组,这就是它的重要性所在。集合RA投影不是一个廉价的操作,因为需要去重。它就像没有聚合字段的GROUP BY。尽管如此,在连接之前进行投影仍然是值得的,因为元组数量可能会大幅减少。包代数工具如SQL还有集合RA投影的方式,例如SELECT DISTINCT。谓词下推和投影下推都不会在所有情况下导致更优化的执行。这取决于它们的选择性以及很多其他因素。尽管如此,特别是谓词下推是一个好的启发式方法,因为连接往往是最昂贵的。如果下推的投影具有保留字段的排序索引或需要扫描表,则可能存在可以融合投影的连接算法,避免了对表/索引结构的双重读取。