2015-08-13 4 views
4

У меня есть кеш со строкой в ​​качестве ключа и 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; 
} 
+0

Не могли бы вы опубликовать план запроса с использованием EXPLAIN? Также я бы рекомендовал убедиться, что для каждого размера кеша ваш запрос возвращает одинаковое количество записей. –

ответ

3

Я нашел эту проблему, спасибо bobby_brew для меня ведет в правильном направлении.

indexing example of Ignite неверен, это open issue об этом.

Я изменяет индексированные поля аннотаций из

@QuerySqlField(index = true) 
    @QuerySqlField.Group(name = "idx1", order = x) 

Для

@QuerySqlField(index = true, orderedGroups = {@QuerySqlField.Group(name = "idx1", order = x)}) 

и теперь длительность запроса твердых 2ms во всех сценариях

Смежные вопросы