我们最近开始为这个基本查询获得大量的DatastoreTimeoutException:
select id from Later where at < '2013-07-04' limit 500 (Some Pseudo SQL)
在代码中看起来像:
DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
Query query = new Query("Later").setKeysOnly();
Filter f = new FilterPredicate("at",FilterOperator.LESS_THAN, new Date());
query.setFilter(f);
query.addSort("at", SortDirection.DESCENDING);
PreparedQuery pq = datastore.prepare(query);
return pq.asList(FetchOptions.Builder.withLimit(500));
该表有aprox。 150万个实体。这是正常的数据存储行为吗?
更新:如果我们删除过滤器,它会更好地工作。当然,我们需要过滤器,因此从长远来看,这不是解决方案。
答案 0 :(得分:0)
更改为使用asIterator
代替asList
。
来自docs:
使用时迭代查询结果 PreparedQuery.asIterable()和PreparedQuery.asIterator()方法, 数据存储区批量检索结果。默认情况下每批次 包含20个结果,但您可以使用更改此值 FetchOptions.chunkSize()。您可以继续迭代查询 结果,直到返回所有结果或请求超时。