3

我正在本地分析我的应用程序(使用开发服务器)以获取有关 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 操作的投影查询的行为感到困惑。请帮忙!

4

1 回答 1

1

[我写了appstats的go端口,所以这是基于我的经验和回忆。]

我的猜测是这是 appstats 中的一个错误,它是一个相对无人维护的程序。投影查询是新的,因此 appstats 可能不知道它们,并将它们视为正常的读取查询。

对于某些背景,计算成本是困难的。对于写入操作,成本与结果一起返回,因为应用程序无法知道发生了什么变化(这是写入成本发生的地方)。然而,对于读取和小型操作,有一个计算成本的公式。每个 appstats 实现(python、java、go)都必须实现这种计算,包括反射或请求对象所需的任何东西来确定发生了什么。实现这一点的 API 并不十分明显,而且有很多小东西,所以很容易弄错,弄错也很烦人。

于 2013-09-27T00:18:01.880 回答