我通过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);
答案 0 :(得分:1)
听起来id
字段未编入索引。如果是这样,这些查询意味着缓存扫描。您可以通过向外扩展来提高性能,但索引是更好的解决方案,尤其适用于min
和max
查询。
UPDATE。事实证明,在这种情况下不使用索引。以下是优化的凭证:https://issues.apache.org/jira/browse/IGNITE-4524