FetchOptions withLimit() 不会减少查询执行时间(Google App Engine)
FetchOptions withLimit() does not reduce query execution time (Google App Engine)
问题
运行 带或不带 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 时,我在大约 [=44] 内得到了预期的 50.000 个结果 =]1740 毫秒。这里没什么奇怪的。
如果我 运行 如上所示的代码并使用 withLimit(100) 我会得到预期的 100 个结果 。但是,查询 运行s 大约相同 1740 ms!
我测试了不同数量的数据存储条目和不同的限制。每次有或没有 withLimit(100) 的查询都花费相同的时间。
问题
为什么查询仍在获取所有实体?我确定查询不应该获取所有实体,即使限制设置为 100,对吧?我错过了什么?是否有一些数据存储配置?经过4天的测试和网络搜索,我仍然找不到问题。
FWIW,您不应该期望使用开发服务器或数据存储模拟器在本地执行的数据存储性能测试会产生有意义的结果 - 它们只是模拟器,它们没有相同的性能(甚至 100 % 等效功能)作为真正的数据存储。
参见示例 Datastore fetch VS fetch(keys_only=True) then get_multi(包括评论)
问题
运行 带或不带 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 时,我在大约 [=44] 内得到了预期的 50.000 个结果 =]1740 毫秒。这里没什么奇怪的。
如果我 运行 如上所示的代码并使用 withLimit(100) 我会得到预期的 100 个结果 。但是,查询 运行s 大约相同 1740 ms!
我测试了不同数量的数据存储条目和不同的限制。每次有或没有 withLimit(100) 的查询都花费相同的时间。
问题
为什么查询仍在获取所有实体?我确定查询不应该获取所有实体,即使限制设置为 100,对吧?我错过了什么?是否有一些数据存储配置?经过4天的测试和网络搜索,我仍然找不到问题。
FWIW,您不应该期望使用开发服务器或数据存储模拟器在本地执行的数据存储性能测试会产生有意义的结果 - 它们只是模拟器,它们没有相同的性能(甚至 100 % 等效功能)作为真正的数据存储。
参见示例 Datastore fetch VS fetch(keys_only=True) then get_multi(包括评论)