1

对于这个基本查询,我们最近开始收到很多 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 万个实体。这是正常的数据存储行为吗?

更新:如果我们删除过滤器,效果会更好。当然,我们需要过滤器,所以从长远来看,这不是一个解决方案。

4

1 回答 1

0

更改为 usingasIterator而不是asList.

文档

使用 PreparedQuery.asIterable() 和 PreparedQuery.asIterator() 方法遍历查询结果时,数据存储区会分批检索结果。默认情况下,每个批次包含 20 个结果,但您可以使用 FetchOptions.chunkSize() 更改此值。您可以继续遍历查询结果,直到全部返回或请求超时。

于 2013-07-17T13:24:26.323 回答