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