我在 hadoop 中有两个 parquet 数据源,它们都有运行时过滤器。 我有一个查询,它将每个表中的一些数据连接到一个结果集中。 每个表都有运行时过滤器的重叠,例如
runtime_partition1 = 0
存在于每个表上并且意味着相同的事情。
我使用内部联接在查询中将这两个表连接在一起,因此我不必在两个
WHERE runtime_partition1 = 0
子句中设置 WHERE
即可返回正确的数据集。
我的问题是,虽然我不必在两个表上都设置
WHERE
子句,但在两个表的查询中指定它是否有益? 由于它也是运行时过滤器上的一个子句,因此保留它可能会带来性能提升吗?
在我的特定情况下,我没有观察到将其留在其中会带来性能优势,但底层系统很复杂,并且存在多层缓存,因此很难在这里获得“真正的”基线。 这个问题很大程度上也是出于好奇和提高我的理解。 我的期望是查询规划器基本上知道运行时过滤器和已设置的数据源的分区键,它会看到谓词集和连接类型,因此进行相应的优化。
顾名思义,运行时过滤器是在运行时计算的。因此,如果您提前知道过滤器,则可以选择静态指定它们,从而消除引擎动态生成它们所花费的所有精力(和时间)。然后,正如 Impala 文档中提到的,“...如果生成运行时过滤器的开销超过了查询的性能优势,您可以完全关闭该功能。”