我有一个使用数据存储的App Engine应用程序。数据存储中的一种包含 超过2,000,000个实体。这种查询非常缓慢。
例如,返回大约50个实体的查询需要3 - 5秒。我不知道过滤器的数量是否很重要,但在这种情况下,我在查询中设置了7个过滤器。
在我看来,其他类型的查询也很慢。例如,查询返回大约20个 实体,其中包含超过90 000个实体的实体大约需要1秒。从数据存储中检索实体的时间
我为该查询构建复合索引,但它没有太多帮助。更改块 大小和使用密钥只有查询不帮助。
对数据存储执行查询的时间影响最大的是什么? 有什么方法加快我的查询?
,我找回实体的方式类同用一个例子,我在文件中发现:
Query q = new Query("Person").setFilter(heightRangeFilter);
PreparedQuery pq = datastore.prepare(q);
for (Entity result : pq.asIterable()) {
String firstName = result.getProperty("firstName").toString();
String lastName = result.getProperty("lastName").toString();
Long height = (Long) result.getProperty("height");
}
该实体的总大小为423.33 MB,内置指标:2.87GB,复合索引:1.85GB
我正在使用Logger类来记录诊断信息。我可以在管理控制台中看到两个日志之间的时差。 当我把日志放入迭代实体的循环的第一行和最后一行时,我可以在迭代之间看到奇怪的暂停。我不知道是什么原因。
实施例:
15:06:30.565开始
15:06:30.566停止
15:06:30.566开始
15:06:30.566停止
15:06:30.572开始
15: 06:30.572停止
15:06:30.583开始
15:06:30.583停止
15:06:30.595开始
15:06:30.595停止
15:06:30.595启动
15:06:30.595停止
15:06:30.595开始
15:06:30.596停止
15:06:30.658开始
15:06:30.658停止
15:06:30.659开始
15:06:30.659停止
15:06:30.666开始
15:06:30.666停止
...
编辑: 我修改我的查询使用6个过滤器,并建立新的COM posite指数。它似乎更快,但它在检索大约100个实体时仍然运行超过2秒。 我创建过滤器的方法是从文档类似于例如:
Filter timeMinFilter =
new FilterPredicate("time",
FilterOperator.GREATER_THAN_OR_EQUAL,
startTime);
Filter timeMaxFilter =
new FilterPredicate("time",
FilterOperator.LESS_THAN_OR_EQUAL,
stopTime);
Filter heightRangeFilter = CompositeFilterOperator.and(timeMinFilter, timeMaxFilter);
会有问题,我设置FilterOperator.GREATER_THAN_OR_EQUAL和FilterOperator.LESS_THAN在一根绳子上的财产?
感谢您的帮助。
你如何计时查询需要多长时间?也许在使数据存储调用的代码中有开销? – bighonestjohn 2014-11-04 10:04:59
最好使用'(String)result.getProperty(“firstName”)'。 'toString()'方法是将所有类型表示为String的“尽力而为”方法,而在这种情况下,您只需简单地转换类型。例如,如果你将错误的类型传递给“firstName”属性,那么如果你尝试转换它,你会得到一个异常(即你会发现有问题),但是'toString()'即使在这种类型没有意义。 – 2014-11-04 16:26:40