谓词下推到底是如何工作的?
How does predicate pushdown work exactly?
谁能举例说明谓词下推到底是如何工作的?
说你想执行一个查询
SELECT
SUM(price)
FROM sales
WHERE
purchase_date BETWEEN '2018-01-01' and '2018-01-31';
查询引擎的一个非常简单的实现是迭代所有 parquet/orc 文件,反序列化 price
和 purchase_date
列,在 purchase_date
上应用谓词并对过滤后的行求和。
Parquet(不知道orc)维护了每个文件中列的统计信息,所以如果执行引擎足够聪明,它可以查看统计信息中purchase_date
的min/max并确定是否有任何行要匹配。例如,如果 purchase_date.min=2014-05-05
和 purchase_date.max=2014-05-06
,它可以推断谓词将始终评估为 false。
换句话说,它可以通过结合统计信息和过滤谓词来跳过拼花文件。这会导致性能的大幅提升,因为 IO(文件或内存)通常是瓶颈。增益与选择性(匹配行的百分比)成反比。
术语谓词下推来自这样一个事实,即您是 "hinting" 带有谓词的扫描运算符,然后将用于过滤感兴趣的行。或者,将谓词推送到扫描。
谁能举例说明谓词下推到底是如何工作的?
说你想执行一个查询
SELECT
SUM(price)
FROM sales
WHERE
purchase_date BETWEEN '2018-01-01' and '2018-01-31';
查询引擎的一个非常简单的实现是迭代所有 parquet/orc 文件,反序列化 price
和 purchase_date
列,在 purchase_date
上应用谓词并对过滤后的行求和。
Parquet(不知道orc)维护了每个文件中列的统计信息,所以如果执行引擎足够聪明,它可以查看统计信息中purchase_date
的min/max并确定是否有任何行要匹配。例如,如果 purchase_date.min=2014-05-05
和 purchase_date.max=2014-05-06
,它可以推断谓词将始终评估为 false。
换句话说,它可以通过结合统计信息和过滤谓词来跳过拼花文件。这会导致性能的大幅提升,因为 IO(文件或内存)通常是瓶颈。增益与选择性(匹配行的百分比)成反比。
术语谓词下推来自这样一个事实,即您是 "hinting" 带有谓词的扫描运算符,然后将用于过滤感兴趣的行。或者,将谓词推送到扫描。