我正在本地分析我的应用程序(使用开发服务器)以获取有关 GAE 工作原理的更多信息。我的测试是比较常见的完整实体查询和投影查询。在我的测试中,两个查询都执行相同的查询,但 Projection 是用 2 个属性指定的。测试种类有 100 个属性,每个 Entity 的值都相同,共有 10 个 Entities。带有 Datastore 查看器和 Appstats 生成的数据的图像如下所示。在 Appstats 图像中,请求 4 是 memcache 刷新,请求 3 是测试数据库创建(它已经创建,所以这里没有成本),请求 2 是完整的实体查询,请求 1 是投影查询。
我很惊讶这两个查询都导致了相同数量的读取。我的猜测是 Appstats 报告的小型和读取操作相同。如果是这种情况,我想在报告中将它们分开。那是查询相关的功能:
// Full Entity Query
public ReturnCodes doQuery() {
DatastoreService dataStore = DatastoreServiceFactory.getDatastoreService();
for(int i = 0; i < numIters; ++i) {
Filter filter = new FilterPredicate(DBCreation.PROPERTY_NAME_PREFIX + i,
FilterOperator.NOT_EQUAL, i);
Query query = new Query(DBCreation.ENTITY_NAME).setFilter(filter);
PreparedQuery prepQuery = dataStore.prepare(query);
Iterable<Entity> results = prepQuery.asIterable();
for(Entity result : results) {
log.info(result.toString());
}
}
return ReturnCodes.SUCCESS;
}
// Projection Query
public ReturnCodes doQuery() {
DatastoreService dataStore = DatastoreServiceFactory.getDatastoreService();
for(int i = 0; i < numIters; ++i) {
String projectionPropName = DBCreation.PROPERTY_NAME_PREFIX + i;
Filter filter = new FilterPredicate(DBCreation.PROPERTY_NAME_PREFIX + i,
FilterOperator.NOT_EQUAL, i);
Query query = new Query(DBCreation.ENTITY_NAME).setFilter(filter);
query.addProjection(new PropertyProjection(DBCreation.PROPERTY_NAME_PREFIX + 0, Integer.class));
query.addProjection(new PropertyProjection(DBCreation.PROPERTY_NAME_PREFIX + 1, Integer.class));
PreparedQuery prepQuery = dataStore.prepare(query);
Iterable<Entity> results = prepQuery.asIterable();
for(Entity result : results) {
log.info(result.toString());
}
}
return ReturnCodes.SUCCESS;
}
有任何想法吗?
编辑:为了更好地了解问题,我创建了另一个测试,它执行相同的查询,但只使用键查询。对于这种情况,Appstats 在报告中正确显示了 DATASTORE_SMALL 操作。我仍然对也应该报告 DATASTORE_SMALL 操作的投影查询的行为感到困惑。请帮忙!