Google App Engine:游标与偏移量

sys*_*out 20 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)
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

阅读Google文档,似乎Cursor不会增加查询偏移量的开销.

Ale*_*lli 31

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

数据存储区将偏移量+限制结果提取给应用程序.数据存储区本身不会跳过第一个偏移结果.

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

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

我不确定它是如何更明确的:O(偏移+限制)是使用偏移量获取的大O性能.如果整体(在多说计划任务),你在每次获取一万件,1000,当你取的最后1000(带偏移999000)数据存储也不会跳过前999000(即使取不返回他们) ,因此性能影响将是惊人的.

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