ndb.OR使查询成本更高

时间:2014-04-27 13:15:16

标签: google-app-engine app-engine-ndb

使用AppEngine appstats我查询了我的查询,并注意到尽管文档说查询花费一次读取,使用ndb.OR(或扩展为OR的.IN)的查询,花费n读取(n等于OR子句的数量) )。

例如:

votes = (Vote.query(ndb.OR(Vote.object == keys[0], Vote.object == keys[1]))
     .filter(Vote.user_id == user_id)
     .fetch(keys_only=True))

此查询需要2次读取(它匹配0个实体)。如果我用Vote.object.IN替换ndb.OR,则读取次数等于我传递给读取的数组的长度。

这种行为与文档相矛盾。

我想知道是否有其他人经历过同样的事情,如果这是AE,docs或我的理解中的错误。

感谢。

1 个答案:

答案 0 :(得分:2)

ndb的查询文档并不是特别明确,但这段是你最好的答案

  

除了本机运算符之外,API还支持!=运算符,   使用布尔OR运算和IN组合滤波器组   操作,测试与可能值列表之一的相等性   (比如Python'在'运算符中)。这些操作不会将1:1映射到   数据存储的本地操作;因此它们有点古怪而缓慢,   相对。它们是使用结果的内存中合并实现的   流。注意,p!= v实现为" p< v OR p> V&#34 ;. (这个   重复财产的问题。)

在此文档中https://developers.google.com/appengine/docs/python/ndb/queries