2016-09-07 4 views
0

Я экспериментировал с Apache Ignite. Я разработка гибкого объекта на основе следующего кодаНужен ли мне индекс для каждого поля при использовании BinaryObject?

public static void main(String[] args) throws IgniteException { 
Ignite start = Ignition.start("examples/config/example-ignite.xml"); 
CacheConfiguration<Integer, BinaryObject> cfg = new CacheConfiguration<>(); 
cfg.setQueryEntities(new ArrayList<QueryEntity>() {{ 
    QueryEntity e = new QueryEntity(); 
    e.setKeyType("java.lang.Integer"); 
    e.setValueType("BinaryTest"); 
    e.setFields(new LinkedHashMap<String, String>(){{ 
     put("name", "java.lang.String"); 
    }}); 
    add(e); 
}}); 
IgniteCache<Integer, BinaryObject> cache = start.getOrCreateCache(cfg).withKeepBinary(); 
BinaryObjectBuilder builder = start.binary().builder("BinaryTest"); 
builder.setField("name", "Test"); 
cache.put(1, builder.build()); 

QueryCursor<List<?>> query = cache.query(new SqlFieldsQuery("select name from BinaryTest")); 
System.out.println(query.getAll()); 

Однако я не хочу иметь индекс на каждом поле (я подозреваю, что это дорого). Я понимаю, что без индекса это может привести к более медленным запросам - я в порядке с этим.

Используя пример кода выше, я не могу сформировать SQL-запрос без предварительного создания индекса для этого поля.

Возможно ли использовать SQL-запросы в BinaryObjects без индексов? (Примечание. Я буду хранить только один «тип» двоичного объекта в кеше).

Благодаря Rich

ответ

1

Индексы создаются только тогда, когда вы явно просите об этом. Подробнее о том, как их настроить, см. В [1].

Обратите внимание, что в настоящее время схема SQL является статической. Поэтому, если вы динамически добавляете поле к вашему типу данных кеша (это поддерживается бинарным форматом [2]), это поле не может участвовать в SQL-запросе. Для этого вам нужно будет воссоздать кеш с другой конфигурацией и перезагрузить данные. Тем не менее, есть билет [3], чтобы избавиться от этого ограничения.

[1] https://apacheignite.readme.io/docs/sql-queries

[2] https://apacheignite.readme.io/docs/binary-marshaller

[3] https://issues.apache.org/jira/browse/IGNITE-735

+0

Спасибо за ответ Валентин. Можно ли добиться такого же эффекта, используя карту вместо BinaryObject? Или какой-либо другой тип, который может участвовать в SQL-запросах (но не обязательно иметь индексы на * все * полей). – Rich

+0

Вы не сможете получить доступ к элементам карты в SQL-запросе. –

+0

Повесьте, я думаю, что мы (или, по крайней мере, я) могли бы пересечь наши провода. Используя BinaryObject, мне нужно будет определить список полей через QueryEntity - я в порядке. Однако индексы создаются только для полей, заданных с помощью QueryIndex. Таким образом, запросы на поля без записи QueryIndex будут * работать *, но будут медленнее (полное сканирование таблицы) из-за отсутствия индекса. Это верно? – Rich

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