根据此处的定价文档,keys-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额外的读取成本。这是以额外的RPC请求和可计费实例时间为代价的。
当您执行普通查询(即非仅键查询)时,将返回您要查找的对象。运行查询的RPC请求也将开始获取查询匹配的每个对象,因此您可以更快地获得所有结果。根据查询的结果大小,所有这些都可以在单个RPC请求中获取(您可以进行调整batch_size
以调整查询占用的RPC总数)。
查询的工作方式是通过单个RPC请求扫描索引以查找与查询匹配的所有键,如果它仅是键查询,则仅返回结果列表。如果是正常查询,它将开始获取所需的对象,并执行其他RPC请求以根据需要将其全部获取。
费用是在执行查询时发生的,因此在您的示例中fetch
是在调用时。您只是在预先构建查询及其过滤器。
但是,按照自己的方式进行操作有一个好处:始终可以将获取的对象假定为一致的。也就是说,对于查询,不能保证您的结果与可能刚刚发生的任何更新“一致”。这两种方法最终都将遭受一致性的困扰,因为除非您执行祖先查询,否则可能无法从索引中一致地读取与查询匹配的对象,但是您的方法可以保证使用它们的键获取的对象确实是最多的。最新版本。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句