2010-08-25 6 views
20

¿Conoce cuál es el mejor enfoque para ir a buscar trozos de resultado de una consulta?Google App Engine: Cursor Versus Offset

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) 

Lectura de la Google documentation, parece que el cursor no agrega el sobrecarga de una consulta offset.

+1

Sería interesante ver algunas medidas sobre esto :) – svrist

Respuesta

29

Si bien es difícil medir con precisión y fiabilidad, me sorprendería que el cursor no corriera en torno al enfoque de desplazamiento en cuanto se devuelva un conjunto suficientemente grande de entidades Person. Como the docs decir muy clara y explícitamente,

El almacén de datos Obtiene compensado + limitar resultados a la aplicación. Los primeros resultados de compensación no se saltan por el almacén de datos sí.

El método fetch() omite los primeros resultados de desplazamiento, luego devuelve el resto (resultados límite).

La consulta tiene un rendimiento características que corresponden linealmente con el importe de compensación más el límite.

No estoy seguro de cómo podría ser más explícita: O (offset + límite) es el rendimiento de orden O de ir a buscar con un desplazamiento. Si en general (por ejemplo, en varias tareas programadas) está obteniendo un millón de elementos, 1000 a la vez, cuando obtiene los últimos 1000 (con el desplazamiento 999000), el almacén de datos no no omite los primeros 999000 (aunque fetch no devuelve ellos), por lo que el impacto en el rendimiento será asombroso.

Ninguna advertencia se aplica al uso de cursores: la búsqueda se reanuda exactamente donde se quedó, sin tener que buscar repetidamente todos los elementos (posiblemente muchos) ya obtenidos a lo largo de ese cursor en consultas anteriores. Por lo tanto, con un rendimiento O (límite), el tiempo transcurrido debe ser arbitrariamente mejor que se puede obtener con un desplazamiento, siempre que ese desplazamiento obtiene suficientemente grande.

+0

¿Qué considerarías como un "conjunto suficientemente grande de entidades Person"? 1,000? 10,000? 100,000? ¡Gracias! – JK140