如果 Partition 列不在 Where 谓词中,查询优化是不是会失败?

Posted

技术标签:

【中文标题】如果 Partition 列不在 Where 谓词中,查询优化是不是会失败?【英文标题】:Does query optimization fail if a Partition column is not in the Where predicate?如果 Partition 列不在 Where 谓词中,查询优化是否会失败? 【发布时间】:2016-08-25 06:28:25 【问题描述】:

假设我有 20 个 SnappyData 节点。

而且,我有一张这样的桌子:

example_timeseries_table

id int not null,
value varchar(128) not null,
time timestamp not null
foo varchar(128) not null,
PARTITION BY COLUMN time

然后,我进行查询:

select sum(value) from example_timeseries_table where foo = 'xyz'

SnappyData 是否调用所有 20 个节点,收集结果然后返回响应?如果是这样,我将如何改进如何进行此类查询?是否应该对表进行不同的设计以使“foo”成为 PARTITION 列?

【问题讨论】:

【参考方案1】:

今天使用列表时就是这种情况。 Spark 催化剂引擎如何通过数据帧执行查询。注意两点:

    为此类选择性查询使用行表:行表支持分区修剪(查询修剪到管理“foo”的节点)以及索引。 正在为工作中的列表编制索引

【讨论】:

【参考方案2】:

SnappyData 尝试将其数据尽可能均匀地分布在所有数据节点上。分配单位是表桶。所以回答你的问题,是的,SnappyData 将调用所有 20 个节点来获取结果。这将实现并行处理,并且在数据量大的情况下会很好。但是,您应该通过找到接近集群中可用处理器总数的素数来配置表的存储桶数。 (有一个现有的 JIRA 票可以跟踪自动发生这种情况的能力)

此外,我们正在开发一项功能,如果分区列在谓词中,则该功能将进行分区修剪。

为简单的表扫描使用分区列可能不是很有用。但是,如果您计划稍后添加连接查询,这将大大提高查询性能,因为如果连接条件在分区列上,我们会尽量避免 Spark shuffle。

【讨论】:

以上是关于如果 Partition 列不在 Where 谓词中,查询优化是不是会失败?的主要内容,如果未能解决你的问题,请参考以下文章

Oracle 能否使用 PARTITION BY 分析函数对查询使用谓词推送?

oracle数据库的连接

`std::partition()` 的时间复杂度

如何防止谓词下推?

谓词下推

使用内部集合创建 where 谓词的动态查询