У меня есть кеш со строкой в качестве ключа и TileKey (класс ниже) в качестве значения, я заметил, что при выполнении запроса (ниже) производительность почти линейно зависит от размера кэша даже хотя все поля, которые используются в запросе, индексируются.Apache Ignite indexing performance
Вот представитель тест - я использовал один и тот же запрос (ниже) с теми же параметрами для всех тестов: запрос возвращает (то же) 30 записей во всех тестах
- запрос на 5350 кэш записи принял 6-7ms
- запрос на 10700 записей кэша взял 8-10ms
- запрос на кэш 48150 записей принял 30-42ms
- запрос на кэш 96300 записей принял 50-70ms
Я выполнил тест с 8gb одним узлом и 4gb 2 узлов, результаты были в значительной степени то же самое (с точки зрения скорости запроса относительно размера кэша)
Я также попытался с помощью QuerySqlFieldGroup с помощью поле «время» в качестве первого группового поля, оно должно уменьшить набор результатов только до 1000 записей во всех тестах, я не уверен, что это правильное использование для QuerySqlFieldGroup, поскольку, насколько я понимаю, он должен в основном использоваться для запросов присоединения между кешами.
Я делаю что-то неправильно или это ожидаемая производительность запроса, используя индексирование Ignite?
Код:
String strQuery = "time = ? and zoom = ? and x >= ? and x <= ? and y >= ? and y <= ?";
SqlQuery<String, TileKey> query= new SqlQuery<String, TileKey>(TileKey.class, strQuery);
query.setArgs(time, zoom, xMin,xMax,yMin, yMax);
QueryCursor<Entry<String, TileKey>> tileKeyCursor = tileKeyCache.query(query);
Map<String, TileKey> tileKeyMap = new HashMap<String, TileKey>();
for (Entry<String, TileKey> p : keysCursor) {
tileKeyMap.put(p.getKey(), p.getValue());
}
Cache конфигурации:
<bean class="org.apache.ignite.configuration.CacheConfiguration">
<property name="name" value="KeysCache" />
<property name="cacheMode" value="PARTITIONED" />
<property name="atomicityMode" value="ATOMIC" />
<property name="backups" value="0" />
<property name="queryIndexEnabled" value="true"/>
<property name="indexedTypes">
<list>
<value>java.lang.String</value>
<value>org.ess.map.TileKey</value>
</list>
</property>
</bean>
Класс:
@QueryGroupIndex.List(@QueryGroupIndex(name = "idx1"))
public class TileKey implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
private String id;
@QuerySqlField(index = true)
@QuerySqlField.Group(name = "idx1", order = 0)
private int time;
@QuerySqlField(index = true)
@QuerySqlField.Group(name = "idx1", order = 1)
private int zoom;
@QuerySqlField(index = true)
@QuerySqlField.Group(name = "idx1", order = 2)
private int x;
@QuerySqlField(index = true)
@QuerySqlField.Group(name = "idx1", order = 3)
private int y;
@QuerySqlField(index = true)
private boolean inCache;
}
Не могли бы вы опубликовать план запроса с использованием EXPLAIN? Также я бы рекомендовал убедиться, что для каждого размера кеша ваш запрос возвращает одинаковое количество записей. –