FetchOptions withLimit()不会缩短查询执行时间(Google App Engine)

时间:2017-11-15 03:52:17

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

问题

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

测试设置

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

对于测试,我创建了一个具有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 ms 中获得预期的 50.000结果。这里没什么好吃的。

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

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

问题

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

1 个答案:

答案 0 :(得分:0)

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

参见例如Datastore fetch VS fetch(keys_only=True) then get_multi(包括评论)