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

时间:2016-08-25 06:28:26

标签: snappydata

假设我有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列?

2 个答案:

答案 0 :(得分:1)

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

此外,我们正在开发一个功能,如果分区列在谓词中,它将执行分区修剪。

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

答案 1 :(得分:1)

使用Column表时,今天就是完整扫描。几乎Spark催化器引擎如何在数据帧上执行查询。请注意两件事:

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