像计数、最大值、最小值这样的简单聚合非常慢
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
字段未编入索引。如果是这样,这些查询意味着缓存扫描。您可以通过横向扩展来提高性能,但索引是更好的解决方案,尤其是对于 min
和 max
查询。
UPDATE. 原来在这种情况下没有使用索引。这是优化票:https://issues.apache.org/jira/browse/IGNITE-4524
我通过 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
字段未编入索引。如果是这样,这些查询意味着缓存扫描。您可以通过横向扩展来提高性能,但索引是更好的解决方案,尤其是对于 min
和 max
查询。
UPDATE. 原来在这种情况下没有使用索引。这是优化票:https://issues.apache.org/jira/browse/IGNITE-4524