问题
使用或不使用FetchOptions.Builder.withLimit(100)运行数据存储查询需要相同的执行时间!为什么?限制方法不是为了减少检索结果的时间吗!?
测试设置
我正在用谷歌的应用引擎在本地测试一些数据存储查询的执行时间。我使用的是谷歌云SDK标准环境和应用引擎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进行查询时,我会在大约1740ms内得到预期的50.000个结果。这里没什么奇怪的。
如果我运行上面显示的代码并使用withLimit(100),我会得到预期的100结果。但是,查询运行的时间大致相同1740毫秒!
我使用不同数量的数据存储条目和不同的限制进行了测试。每次带有或不带有withLimit(100)的查询都花费相同的时间。
问题
为什么查询仍在获取所有实体?我确信即使限制设置为100,查询也不应该得到所有实体,对吗?我错过了什么?是否有相应的数据存储配置?经过4天的测试和网络搜索,我仍然找不到问题。
FWIW,您不应该期望使用开发服务器或数据存储模拟器在本地执行的数据存储性能测试产生有意义的结果——它们只是模拟器,与真正的数据存储不具有相同的性能(甚至不具有100%等效的功能)。
例如,请参阅Datastore fetch VS fetch(keys_only=True)然后get_multi(包括注释)