具有锯齿形合并的投影查询

时间:2014-10-20 21:52:40

标签: google-app-engine google-cloud-datastore

我想在AppEngine上使用投影查询和zigzag merge。看来这需要将投影属性包含在zigzag合并查询使用的每个索引中。在我的用例中,这将导致实体更新成本过高。

为了说明,下面是一个使用Java低级数据存储区API并使用索引索引(E,p1,p3)和索引(E,p2,p3)的简单示例;这有效但在两个索引中复制了实体E的p3属性。

// Create a sample entity with three (indexed) properties.
DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
Entity e = new Entity("E");
e.setProperty("p1", 1);
e.setProperty("p2", 1);
e.setProperty("p3", 1);
datastore.put(e);

// Query for the above entity with a projection on property p3.
Query q = new Query("E");
Filter filter1 = new FilterPredicate("p1", FilterOperator.EQUAL, 1);
Filter filter2 = new FilterPredicate("p2", FilterOperator.EQUAL, 1);
q.setFilter(CompositeFilterOperator.and(filter1, filter2));
q.addProjection(new PropertyProjection("p3", Integer.class));
PreparedQuery pq = datastore.prepare(q);
pq.asList(FetchOptions.Builder.withDefaults());

我想删除其中一个复合索引,比如Index(E,p2,p3),只需依赖属性p2的默认索引,从而降低更新成本。但这样做会导致运行时出现DatastoreNeedIndexException。

请注意,如果我保留上述两个索引但仅向其中一个添加第四个属性并在投影中包含第四个属性,则会出现类似的问题。因此,使用默认索引似乎不是问题。

所以我的问题是:有没有办法用zigzag合并进行投影查询而不重复索引中的所有投影属性?如果没有,我想了解潜在的技术原因是什么。

任何指针都非常感激。

1 个答案:

答案 0 :(得分:1)

好的,所以我现在明白为什么需要在所有涉及的索引中复制预测属性:因为索引排序顺序必须在所有相关索引块(本例中为两个)中相同才能使zigzag合并工作。

在该示例中,最后一个排序顺序是在投影属性上完成的。删除此索引后,它会更改排序顺序,并且需要一种新的索引才能生效。

所以,我不认为我现在在AppEngine上可以实现的目标。需要新的专用AppEngine功能来启用不影响索引排序顺序的索引属性。