我有一个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和同一个缓存中,使用#1语句的160k个条目大约需要120ms,而#2语句只需要5ms。
我想知道为什么计数要慢得多?与在一个列表中获取整个缓存对象列表,然后返回列表大小相比,这不是更有效吗?
1条答案
按热度按时间nkoocmlb1#
count()
必须读取整个表才能返回一行。第二个查询可以在读取表时开始返回行。
我猜你是在测量到第一排的时间,而不是最后一排的时间。我认为第二行的速度总体上会慢一些,因为读多行的开销很大。