为什么仅限密钥查询是免费的?

时间:2014-07-15 22:21:57

标签: google-app-engine

根据定价文档herekeys-only查询是免费的。因此,您似乎可以通过执行以下操作来保存读取(伪代码):

qo = ndb.QueryOptions(keys_only = True)
qry = ModelName.query().filter("name" = "Bob")
keys = qry.fetch(20, options = qo) #keys-only fetch

然后我可以获得我的实体,每个实体花费1次读取:

entities = ndb.get_multi(keys)

为什么这被认为比获取实体更好(即进行仅获取密钥获取)?

此外,查询费用来自哪里?执行fetch时或创建query对象时?

1 个答案:

答案 0 :(得分:7)

这不被认为是“更好”,您只需为每个查询节省1个额外的阅读成本。这是以可计费实例时间的额外RPC请求为代价的。

当您执行普通查询(即非密钥查询)时,将返回您要查找的对象。运行查询的RPC请求也将开始获取查询匹配的每个对象,因此您可以更快地获得所有结果。根据查询的结果大小,可以在单个RPC请求中获取它(您可以调整batch_size来调整查询所需的RPC总量。)

查询的工作方式是通过单个RPC请求扫描索引以查找与您的查询匹配的所有键,如果它只是一个键查询,它只返回结果列表。如果是普通查询,它将开始获取您想要的对象并执行其他RPC请求以根据需要获取所有这些对象。

执行查询时收费,因此在您的示例中,调用fetch时。您只是事先构建查询及其过滤器。

以你的方式做到这一点有一个好处:获取的对象总是可以假设是一致的。也就是说,对于查询,您的结果不能保证与可能刚刚发生的任何更新“一致”。这两种方法都会受到最终一致性的影响,因为除非您执行祖先查询,否则可能无法从索引中一致地读取与查询匹配的对象,但您的方法可以保证您使用其键获取的对象确实是最多的到目前为止的版本。