像count,max,min这样的简单聚合非常慢

时间:2016-12-27 02:47:25

标签: ignite

我通过RDMS和Ignite Integration将我的数据从oracle加载到Ignite缓存中。缓存的大小为4000万。 当我做一些简单的聚合sql时,如下面三个:

select count(id) from Person

select max(id) from Person

select min(id) from Person

它们非常慢,每个都需要大约5分钟。

由于它们是非常简单的操作,可以通过地图缩减机制完成而不需要任何数据移动,所以它应该非常快。

Per @ Valentin的评论:

我认为id列启用了索引。我使用ignite-schema-import.sh生成CacheConfig类,它包含以下代码:

idxs.add(new QueryIndex("id", true, "PK_ID"));

当我运行sql来解释计划时 explain select min(id) from Person

输出

SELECT MIN(ID) AS __C0 FROM "Person".PERSON /* "Person".PK_ID */, SELECT MIN(__C0) AS __C0 FROM PUBLIC.__T0 /* "Person"."merge_scan" */,

另外,我正在使用OFFHEAP_TIERED内存模式,代码为

cacheConfig.setCacheMode(CacheMode.PARTITIONED);
cacheConfig.setBackups(0);
cacheConfig.setMemoryMode(CacheMemoryMode.OFFHEAP_TIERED);
cacheConfig.setOffHeapMaxMemory(0);
cacheConfig.setOffHeapMaxMemory(48*1024*1024*1024);
cacheConfig.setStatisticsEnabled(true);
cacheConfig.setCopyOnRead(false);

1 个答案:

答案 0 :(得分:1)

听起来id字段未编入索引。如果是这样,这些查询意味着缓存扫描。您可以通过向外扩展来提高性能,但索引是更好的解决方案,尤其适用于minmax查询。

UPDATE。事实证明,在这种情况下不使用索引。以下是优化的凭证:https://issues.apache.org/jira/browse/IGNITE-4524