Ignite Cache中SQL查询执行过慢的调优方案咨询
Ignite SQL查询慢调优方案
核心优化点
- 开启查询懒加载
从警告日志可以看到当前lazy=false,默认模式下Ignite会将全量查询结果加载到内存后再返回,即使设置了LIMIT也会先完成全表扫描。开启懒加载后会分批加载数据,无需扫描全表即可返回前N条结果,直接在查询参数中配置即可:sqlFieldsQuery.setLazy(true); - 显式在SQL中添加LIMIT限制
你当前的代码SQL语句没有写LIMIT 200,Ignite会扫描全量数据后再截断前200条,直接将SQL修改为select _key from table limit 200,执行引擎会在扫描到200条符合条件的数据后直接终止扫描,无需遍历全表。 - 配置合适的索引
_key作为主键默认会创建索引,但如果缓存配置时未正确关联SQL schema、或者有额外查询条件,会触发全表扫描。可通过以下语句确认索引是否生效:
若执行计划显示走全表扫描,需要重新为对应字段创建索引。EXPLAIN SELECT _KEY FROM table LIMIT 200 - 调整数据拉取页大小
调整查询的pageSize参数,减少网络交互次数,根据你的查询场景可设置为和LIMIT值一致:sqlFieldsQuery.setPageSize(200); - 开启本地查询(适用于分片数据场景)
如果无需跨节点聚合数据,可开启本地查询直接拉取当前节点的分片数据,避免跨节点网络开销:sqlFieldsQuery.setLocal(true); - 调整内存配置
若数据集远大于分配给Ignite的堆外内存,且开启了持久化,会频繁触发磁盘IO导致查询变慢。可适当调大DataRegion的堆外内存配额,将热数据尽量存放在内存中,避免磁盘换入换出。 - 调整SQL并行度
根据节点CPU核心数调整SQL查询并行度,加快全表扫描速度:// 节点配置阶段设置,建议设置为CPU核心数的1-2倍 igniteCfg.setSqlQueryParallelism(4);
优化后完整代码示例
try (QueryCursor<List<?>> cur = cache2.query( new SqlFieldsQuery("select _key from table limit 200") .setLazy(true) .setPageSize(200) // 按需开启本地查询 // .setLocal(true) )) { for (List<?> r : cur) { Long key = (Long)r.get(0); } }
内容的提问来源于stack exchange,提问作者Rohan19
相关产品推荐
相关产品推荐

