【问题标题】:What is the difference between "predicate pushdown" and "projection pushdown"?“谓词下推”和“投影下推”有什么区别?
【发布时间】:2020-02-02 17:08:15
【问题描述】:

我遇到了几种信息来源,例如找到here 的信息来源,它将“谓词下推”解释为:

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

但是,我还在其他文档(例如 here)中看到了“投影下推”一词,这似乎是同一件事,但我不确定我的理解。

这两个术语有具体区别吗?

【问题讨论】:

    标签: apache-spark bigdata parquet


    【解决方案1】:

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

    投影指的是选定的列。

    例如:

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

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

    【讨论】:

      【解决方案2】:

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

      在袋关系代数中,投影下推消除了属性(“列”),但在基于列的存储的情况下,这并不重要,因为没有使用更高的列一开始就不会被携带。即使是基于行的数据库也可能会或可能不会从投影下推中受益(甚至 SQL 也没有指定物理访问计划)。包 RA 中的投影是一种非常名义上的操作,可以仅在元数据级别物理上完成(将某些列标记为不可访问)。

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

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

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

      如果下推投影有保留字段的排序索引,或者需要扫描表,则可能存在可以融合投影的连接算法,避免重复读取表/索引结构。

      【讨论】:

      • 问题指的是 Spark 和 BigData(以及 Parquet),而不是关系数据库。
      猜你喜欢
      • 2016-05-06
      • 1970-01-01
      • 2019-06-18
      • 2018-08-15
      • 2019-01-21
      • 2021-04-30
      • 1970-01-01
      • 2019-09-17
      • 1970-01-01
      相关资源
      最近更新 更多