我有一个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 SELECT:
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和具有160K条目的相同缓存,使用#1语句大约需要120ms。而#2语句只需要5毫秒。
我想知道为什么COUNT明显较慢?与在列表中获取整个缓存对象列表然后返回列表大小相比,这不是更有效吗?
count()
必须读取整个表才能返回一行。
第二个查询可以在读取表时开始返回行。
我猜您测量的是到第一行的时间,而不是到最后一行