【问题标题】:How to make Appstats show both small and read operations?如何让 Appstats 显示小型和读取操作?
【发布时间】:2013-09-24 18:57:22
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-02
      • 1970-01-01
      • 2019-08-17
      • 2010-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多