Ignite 2.13.0持久化下SELECT DISTINCT性能指数级下降求助
Ignite持久化下SELECT DISTINCT查询性能指数级下降问题
我们使用Ignite 2.13.0版本,正尝试推广使用Ignite持久化,但遇到异常问题:当缓存中对象数量线性增长时,使用索引的SELECT DISTINCT查询性能呈指数级下降。已准备测试用例复现该问题。
无持久化测试结果
- 缓存含655,360个对象 → SELECT DISTINCT耗时:472s
- 5倍数据量(3,276,750个对象)→ SELECT DISTINCT耗时:2,141ms
- 10倍数据量(6,553,500个对象)→ SELECT DISTINCT耗时:4,354ms
- 20倍数据量:因堆外内存不足无法运行(测试目标为持久化场景)
开启持久化测试结果
- 缓存含655,360个对象 → SELECT DISTINCT耗时:561ms
- 5倍数据量(3,276,750个对象)→ SELECT DISTINCT耗时:3,056ms
- 10倍数据量(6,553,500个对象)→ SELECT DISTINCT耗时:6,381ms
- 20倍数据量(13,107,000个对象)→ SELECT DISTINCT耗时:284,617ms
即使是65.5万条数据,基于索引的SELECT DISTINCT耗时0.5s也不算快,但10倍到20倍数据量之间性能呈指数级下降。执行计划显示查询已使用索引:
SELECT DISTINCT __Z0.DATAGROUPID AS __C0_0 FROM "cache".CONTRACTDTOSIMPLE __Z0 /* "cache".CONTRACTDTOSIMPLE_DATAGROUPID_IDX */
已尝试调优所有持久化参数,确认索引已被使用,但10倍与20倍数据量的查询耗时相差约50倍,持久化对性能影响极大。请问遗漏了什么配置或优化点?
另外,尝试使用Calcite引擎,性能表现更差。
补充测试
在Azure D8ds v5实例上进行了更多测试,堆外内存设为4GB,堆内存设为4GB,测试结果如下:
| 数据量 | 开启持久化 | WAL模式 | 启用限流 | 页面置换策略 | 插入耗时 | SQL查询耗时 | 分区SQL耗时 | 分区扫描查询耗时 |
|---|---|---|---|---|---|---|---|---|
| 6.5M | false | N/A | N/A | N/A | 96.5s | 3.4s | 2.6s | 0.7s |
| 6.5M | true | NONE | false | CLOCK | 192s | 5.6s | 3.9s | 1.1s |
| 13M | true | NONE | false | CLOCK | 1063s | 197s | 188s | 94s |
| 13M | true | NONE | true | CLOCK | 1047s | 196s | 102s | 14s |
| 13M | true | NONE | true | SEGMENTED_LRU | 1042s | 211s | 205s | 14s |
| 13M | true | LOG_ONLY | false | CLOCK | 1575s | 225s | 188s | 14s |
| 13M | true | LOG_ONLY | true | CLOCK | 1586s | 185s | 102s | 15s |
| 13M | true | LOG_ONLY | true | SEGMENTED_LRU | 1550s | 259s | 150s | 15s |
内容的提问来源于stack exchange,提问作者Steve Hostettler
相关产品推荐
相关产品推荐

