Google App Engine : Cursor Versus Offset

Do you know which is the best approach for fetching chunks of result from a query?

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)

Reading the Google documentation, it seems that Cursor does not add the overhead of a query offset.

20
задан systempuntoout 25 August 2010 в 13:53
поделиться

1 ответ

Хотя трудно измерить точно и надежно, я был бы удивлен, если бы курсор не бегал по кругу вокруг подхода смещения сразу после того, как возвращается достаточно большой набор сущностей Person. Как документы очень четко и ясно говорят

Хранилище данных получает смещение + предел результатов к заявке. Первое результаты смещения не пропускаются само хранилище данных.

Метод fetch() пропускает первый результаты смещения, затем возвращает остальные (ограничение результатов).

Запрос имеет производительность характеристики, соответствующие линейно с суммой смещения плюс Лимит.

Я не уверен, как это может быть более явным: O(offset + limit) — это производительность большого O при выборке со смещением. Если в целом (скажем, по нескольким запланированным задачам) вы извлекаете миллион элементов, по 1000 за раз, когда вы извлекаете последние 1000 (со смещением 999000), хранилище данных не пропускает первые 999000 (даже если fetch не возвращает их), поэтому влияние на производительность будет ошеломляющим.

Такое предостережение не относится к использованию курсоров: выборка возобновляется точно с того места, где она была остановлена, без необходимости повторной выборки всех (возможно, многих) элементов, уже извлеченных вдоль этого курсора в предыдущих запросах. Следовательно, при производительности O(limit) прошедшее время должно быть сколь угодно лучше, чем то, которое вы можете получить со смещением, если это смещение становится достаточно большим.

31
ответ дан 30 November 2019 в 00:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: