猪优化器是不是在加入前过滤空值?

Posted

技术标签:

【中文标题】猪优化器是不是在加入前过滤空值?【英文标题】:Is the pig optimizer filtering nulls before joining?猪优化器是否在加入前过滤空值? 【发布时间】:2015-08-19 06:51:51 【问题描述】:

我对 pig 的性能文档感到困惑,即在输入中加入空值。 http://pig.apache.org/docs/r0.14.0/perf.html#nulls

正如文档正确指出的那样:“来自 A 和 B 的空值不会被收集在一起”,因此优化器在加入之前过滤它们是非常有意义的:

A1 = filter A by t is not null;
B1 = filter B by x is not null;
C = join A1 by t, B1 by x;

猪优化器会自动执行此操作吗?还是建议用户记住并每次都这样做?如果它不是自动的,它是一个合理的贡献吗?

我要问的原因是我们有很多性能问题,而根本原因正是这个:(

【问题讨论】:

正如你所说,它应该这样做。这是默认启用的性能优化,或者在官方文档中如此说明。如果您确定它没有这样做并且您没有触及优化规则,那么您可能发现了一个错误,并且很高兴将其发布在JIRA。 好的,向jira添加了一个请求:issues.apache.org/jira/browse/PIG-4662 【参考方案1】:

这是其他检查此问题的人的答案...

根据文档:

在连接结果中,您不会有任何 null 与另一个 null 连接,它正在删除它,但只是在最后。

“所以空键将被删除。但它们不会被删除,直到 最后一刻。”

因此,为了优化它,您可以在加入之前将它们过滤掉(如文档所述)。 所以我认为这不是错误,但你是对的,这可以由优化器完成。

【讨论】:

应该 :) 这种类型的未优化连接为我个人浪费了一些宝贵的时间

以上是关于猪优化器是不是在加入前过滤空值?的主要内容,如果未能解决你的问题,请参考以下文章

为啥优化器不使用我的唯一过滤索引?

使用奇怪的查询优化器行为加入 SQL Server 中的视图

使用 WHERE 子句中的过滤器优化 OUTER JOIN 查询。(查询规划器)

有没有办法强制 Oracle 在加入访问后评估过滤器?

Adam优化器

PHP A / B拆分Google优化器for WordPress(过滤器挂钩)