像计数、最大值、最小值这样的简单聚合非常慢

simple aggregation like count, max, min is extremely slow

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

select count(id) from Person,

select max(id) from Person,

select min(id) from Person,

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

由于它们是非常简单的操作,可以通过 map-reduced 机制完成而无需任何数据移动,因此应该非常快。

根据@Valentin 的评论:

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

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);

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


UPDATE. 原来在这种情况下没有使用索引。这是优化票:https://issues.apache.org/jira/browse/IGNITE-4524