Google App Engine:游标与偏移量

时间:2010-08-25 13:46:23

标签: python google-app-engine

您知道从查询中获取结果块的最佳方法是什么?

1.Cursor

q = Person.all()
last_cursor = memcache.get('person_cursor')
if last_cursor:
    q.with_cursor(last_cursor)
people = q.fetch(100)
cursor = q.cursor()
memcache.set('person_cursor', cursor)

2.Offset

q = Person.all()
offset = memcache.get('offset')
if not offset:
   offset = 0
people = q.fetch(100, offset = offset)
memcache.set('offset', offset + 100)

阅读Google documentation,似乎Cursor不会添加查询偏移的开销

1 个答案:

答案 0 :(得分:31)

虽然很难精确可靠地进行测量,但是如果光标没有在偏移方法周围运行时很快就会感到惊讶,因为足够大的Person实体集将被返回。正如the docs非常清楚明确地说,

  

数据存储区提取偏移量+限制   结果给应用程序。首先   不会跳过偏移结果   数据存储本身。

     

fetch()方法跳过第一个   偏移结果,然后返回其余部分   (限制结果)。

     

查询具有性能   对应的特征   线性地与偏移量加上   限制。

我不确定它是如何更明确的: O(偏移+限制)是使用偏移量获取的大O性能。如果整体(比如说多个计划任务)你拿取一百万个项目,一次1000个,当你获取最后1000个项目(偏移999000)时,数据存储跳过第一个999000(甚至虽然fetch不会返回它们,但性能影响将是惊人的。

没有这样的警告适用于使用游标:从正确的位置获取恢复,而不必重复获取先前查询中已沿该游标提取的所有(可能很多)项目。因此,对于性能 O(限制),只要该偏移量足够大,经过的时间应该比使用偏移量获得的时间任意更好。