Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Apache Ignite SQL性能计数与选择_Java_Sql_Ignite - Fatal编程技术网

Java Apache Ignite 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);

我有一个带有持久缓存的Ignite服务器,我用SQL查询它。我观察到不同的表演,我无法解释:

使用SQL计数:

     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。