【问题标题】:FetchOptions withLimit() does not reduce query execution time (Google App Engine)FetchOptions withLimit() 不会减少查询执行时间(Google App Engine)
【发布时间】:2018-04-28 04:27:45
【问题描述】:

问题

使用或不使用 FetchOptions.Builder.withLimit(100) 运行数据存储查询都需要相同的执行时间!这是为什么?限制方法不是为了减少检索结果的时间吗!?

测试设置

我正在使用 Google 的 App Engine 在本地测试一些数据存储查询的执行时间。我正在使用带有 App Engine SDK 1.9.59 的 Google Cloud SDK 标准环境。

为了测试,我创建了一个包含 5 个索引属性和 5 个未索引属性的示例实体。我用测试实体的 50.000 个条目填充了数据存储区。我使用 withLimit() 方法运行以下方法来检索 100 个此类实体。

public List<Long> getTestIds() {
    List<Long> ids = new ArrayList<>();
    FetchOptions fetchOptions = FetchOptions.Builder.withLimit(100);
    Query q = new Query("test_kind").setKeysOnly();
    for (Entity entity : datastore.prepare(q).asIterable(fetchOptions)) {
        ids.add(entity.getKey().getId());
    }
    return ids;
}

我测量了调用这个方法前后的时间:

long start = System.currentTimeMillis();
int size = getTestIds().size();
long end = System.currentTimeMillis();
log.info("time: " + (end - start) + " results: " + size);

我记录了执行时间和返回结果的数量。

结果

当我不使用 withLimit() FetchOptions 进行查询时,我会在大约 1740 毫秒 内获得预期的 50.000 个结果。这里没有什么令人惊讶的。

如果我运行上面显示的代码并使用 withLimit(100),我会得到预期的 100 个结果。但是,查询运行大约相同的 1740 毫秒

我使用不同数量的数据存储条目和不同的限制进行了测试。每次有或没有 withLimit(100) 的查询都花费相同的时间。

问题

为什么查询仍在获取所有实体?我确信即使限制设置为 100,查询也不应该获取所有实体,对吗?我错过了什么?是否有一些数据存储配置?经过4天的测试和网络搜索,我仍然找不到问题。

【问题讨论】:

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


    【解决方案1】:

    FWIW,您不应该期望使用开发服务器或数据存储模拟器在本地执行的数据存储性能测试获得有意义的结果 - 它们只是模拟器,它们没有相同的性能(甚至 100% 等效)功能)作为真正的数据存储。

    例如见Datastore fetch VS fetch(keys_only=True) then get_multi(包括cmets)

    【讨论】:

    • 感谢您的评论!我使用云中的数据存储运行了一些测试。 withLimit() 函数实际上限制了数据存储查询的执行时间。所以它实际上按预期工作,我将继续在云中进行测试。然而,本地数据存储区的表现如此不同仍然很不方便。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-29
    • 1970-01-01
    • 1970-01-01
    • 2015-11-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多