Java Apache Ignite SQL性能计数与选择
我有一个带有持久缓存的Ignite服务器,我用SQL查询它。我观察到不同的表演,我无法解释: 使用SQL计数:Java Apache Ignite SQL性能计数与选择,java,sql,ignite,Java,Sql,Ignite,我有一个带有持久缓存的Ignite服务器,我用SQL查询它。我观察到不同的表演,我无法解释: 使用SQL计数: String sql = "SELECT COUNT(*) AS NUM FROM " + cacheName + " " + sqlParam; SqlFieldsQuery query = new SqlFieldsQuery(sql); query.setArgs(args);
String sql = "SELECT COUNT(*) AS NUM FROM " + cacheName + " " + sqlParam;
SqlFieldsQuery query = new SqlFieldsQuery(sql);
query.setArgs(args);
FieldsQueryCursor<List<?>> cursor = cache.query(query);
resultCount = cursor.getAll().get(0).get(0);
使用SQL选择:
String sql = "SELECT _key, _val FROM " + cacheName + " " + sqlParam;
SqlFieldsQuery query = new SqlFieldsQuery(sql);
query.setArgs(args);
FieldsQueryCursor<List<?>> cursor = cache.query(query);
resultCount = cursor.getAll().size();
使用同一个sqlParam,在同一个缓存中使用1语句,并使用160K个条目,大约需要120ms。而2语句只需要5毫秒
我想知道为什么计数要慢得多?与在列表中获取整个缓存对象列表然后返回列表大小相比,这不是更有效吗?count必须读取整个表才能返回一行
第二个查询可以在读取表时开始返回行
我猜你是在测量到第一排的时间,而不是到最后一排的时间。由于读取多行的开销,我预计第二行的速度总体上会较慢。count必须读取整个表才能返回一行
第二个查询可以在读取表时开始返回行
我猜你是在测量到第一排的时间,而不是到最后一排的时间。我预计第二行的速度总体上会慢一些,因为读取多行的开销。在结果游标上使用getAll会将所有项目加载到列表中,然后使用大小。所以我想它必须走到最后一排。然而,我现在意识到我在sql语句中使用了LIMIT。如果我将其设置为更高的值,则性能差异将变为1。@DonTequila。有趣的极限在机械上实现了我认为在引擎盖下发生的事情。我进一步研究了极限,结果表明,不管极限值是多少,SQL 1的持续时间总是恒定的。在较小的限制值上,SQL 2比SQL 1快,但设置的限制越高,所需时间越长。这种说法很有道理。@DonTequila。该限制在计数查询中没有意义。没有group by的聚合查询总是只返回一行。对不起,是我的错。限额不用于计数查询。我只是仔细检查了一下。在结果游标上使用getAll将所有项目加载到列表中,然后使用size。所以我想它必须走到最后一排。然而,我现在意识到我在sql语句中使用了LIMIT。如果我将其设置为更高的值,则性能差异将变为1。@DonTequila。有趣的极限在机械上实现了我认为在引擎盖下发生的事情。我进一步研究了极限,结果表明,不管极限值是多少,SQL 1的持续时间总是恒定的。在较小的限制值上,SQL 2比SQL 1快,但设置的限制越高,所需时间越长。这种说法很有道理。@DonTequila。该限制在计数查询中没有意义。没有group by的聚合查询总是只返回一行。对不起,是我的错。限额不用于计数查询。我只是仔细检查了一下,你的情况下sqlParam是什么?是否可以重复查询10次以消除预热效果。@PavelVinokurov sqlParam是jobId=?对于SQL 1和jobId=?SQL 2的限制为1000。在您的情况下,sqlParam是什么?是否可以重复查询10次以消除预热效果。@PavelVinokurov sqlParam是jobId=?对于SQL 1和jobId=?SQL 2的限制为1000。