Ignite缓存执行带LIMIT的SELECT查询报内存溢出异常
排查思路
- 首先验证SQL执行计划的LIMIT下推逻辑是否正常
旧版本Ignite存在LIMIT子句未下推到分片节点的问题,会导致所有分片节点返回全表主键数据到协调节点统一做截断,即使LIMIT值很小也会触发全量数据加载。执行EXPLAIN SELECT __Z0._KEY FROM "cache".__Z0 LIMIT 200查看执行计划,确认LIMIT操作是否在map阶段就完成分片内的结果截断。 - 核对内存配置的匹配性
你提到的8GB内存如果是Ignite数据存储区的堆外内存配置,需要额外确认JVM堆内存的-Xmx参数是否合理,低于4GB的堆内存很容易在SQL查询时触发OOM。同时检查SqlConfiguration配置:确认是否开启了SQL中间结果使用堆外内存存储,sqlQueryMemoryLimit参数是否设置了过小的单查询内存上限。 - 排查数据分布倾斜问题
报错日志指向特定节点c288da2b-a3fb-4752-8c6e-4b2f88470bef触发OOM,优先检查该节点负责的缓存分区数据量是否远高于其他节点,单分区过大会导致即使是主键查询,也需要加载大量数据到内存完成计算。 - 确认索引生效情况
检查执行计划是否走了主键索引,如果出现全表扫描,即使仅查询主键,也会加载全表所有数据块到内存,直接触发OOM。 - 检查节点并发负载
查看报错节点的历史监控和日志,确认OOM发生时是否有其他大查询、批量写入、数据再平衡任务在同时执行,挤占了SQL查询可用的内存空间。 - 确认版本已知问题
堆栈中H2版本号为1.4.197,对应Ignite 2.7~2.10区间版本,这些版本存在多个SQL内存管理的已知bug,包括中间结果内存未正确释放、内存统计不准等问题,可优先核对对应版本的bug修复列表,必要时升级到更高稳定版。
内容的提问来源于stack exchange,提问作者Rohan19
相关产品推荐
相关产品推荐

