我们最近开始为这个基本查询得到很多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));
这张桌子有一张桌子。150万个实体。这是正常的数据存储行为吗?
更新:如果我们去掉过滤器,效果会更好。当然,我们需要过滤器,所以从长远来看,这不是一个解决方案。
更改为使用asIterator
而不是asList
。
来自文档:
当使用PreparedQuery.asIterable()和PreparedQuery.asIterator()方法数据存储以批方式检索结果。默认情况下,每个批次包含20个结果,但您可以使用FetchOptions.chunkSize()。您可以继续遍历查询结果,直到全部返回或请求超时。