Zigzag合并投影查询
问题描述:
我想在AppEngine上使用投影查询和Zigzag合并。看来,这需要投影属性包含在锯齿形合并查询所使用的每个索引中。在我的用例中,这会导致实体更新成本太高。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());
我想删除的复合指标之一,说指数(E,P2,P3),只是依靠房地产P2默认的指数,从而降低成本更新。但是这样做会在运行时导致DatastoreNeedIndexException。
请注意,如果我保留上述两个索引,但仅向其中的一个添加第四个属性,并在投影中包含此第四个属性,则会出现类似问题。因此,使用默认索引似乎不成问题。
所以我的问题:是否有任何方式做锯齿形合并投影查询没有重复索引所有投影属性?如果不是,我想了解潜在的技术原因。
任何指针非常赞赏。
答
好的,现在我明白为什么投影属性需要在所有涉及的索引中重复:因为索引排序顺序在所有相关索引块(本例中为两个)中必须相同才能工作。
在此示例中,最后的排序顺序是在投影属性上完成的。当这个索引被删除时,它会改变排序顺序,并且需要一种新的索引才能起作用。
所以,我不认为我现在可以在AppEngine上做什么。需要新的专用AppEngine功能才能启用不影响索引排序顺序的索引属性。