【发布时间】: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