Using AppEngine appstats I profiled my queries, and noticed that although the docs say a query costs one read, queries using ndb.OR (or .IN which expands to OR), cost n reads (n equals the number of OR clauses).

eg:

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

This query costs 2 reads (it matches 0 entities). If I replace the ndb.OR with Vote.object.IN, the number of reads equals the length of array I pass to read.

This behavior is kind of contradicts the docs.

I was wondering if anyone else experienced the same, and if this is a bug in AE, docs, or my understanding.

Thanks.

有帮助吗?

解决方案

The query docs for ndb are not particularly explicit but this paragraph is your best answer

In addition to the native operators, the API supports the != operator, combining groups of filters using the Boolean OR operation, and the IN operation, which test for equality to one of a list of possible values (like Python's 'in' operator). These operations don't map 1:1 to the Datastore's native operations; thus they are a little quirky and slow, relatively. They are implemented using in-memory merging of result streams. Note that p != v is implemented as "p < v OR p > v". (This matters for repeated properties.)

In this doc https://developers.google.com/appengine/docs/python/ndb/queries

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top