2016-09-07 77 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查询。

是否可以在没有索引的BinaryObjects上使用SQL查询? (注意:我只会在每个缓存中存储一​​个'类型'的二进制对象)。

感谢 丰富

回答

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

感谢您的回答的Valentin。是否可以通过使用Map而不是BinaryObject来实现相同的效果?或者其他一些可以参与SQL查询的类型(但不一定对所有字段都有索引)。 – Rich

+0

您将无法访问SQL查询中的地图元素。 –

+0

我想我们(或者至少我)可能会把我们的电线穿过。使用BinaryObject我需要通过QueryEntity定义字段列表 - 我很酷。但是索引只会为使用QueryIndex指定的字段创建。因此,对没有QueryIndex条目的字段的查询仍然会*工作*,但由于没有索引存在,所以查询速度会更慢(全表扫描)。它是否正确? – Rich

相关问题