Tengo una tabla tmp_drop_ids
con una columna, id
, y 3,3 millones de entradas. Quiero iterar sobre la mesa, haciendo algo con cada 200 entradas. Tengo este código:postgresql: desplazamiento + límite llega a ser muy lento
LIMIT = 200
for offset in xrange(0, drop_count+LIMIT, LIMIT):
print "Making tmp table with ids %s to %s/%s" % (offset, offset+LIMIT, drop_count)
query = """DROP TABLE IF EXISTS tmp_cur_drop_ids; CREATE TABLE tmp_cur_drop_ids AS
SELECT id FROM tmp_drop_ids ORDER BY id OFFSET %s LIMIT %s;""" % (offset, LIMIT)
cursor.execute(query)
Esto funciona muy bien, al principio, (~ 0.15s para generar la tabla tmp), pero va a reducir la velocidad de vez en cuando, por ejemplo, alrededor de 300,000 entradas comenzaron a tomar 11-12 segundos para generar esta tabla de tmp, y de nuevo alrededor de 400k. Básicamente parece poco confiable.
Voy a utilizar esos identificadores en otras consultas, así que pensé que el mejor lugar para tenerlos estaba en una tabla tmp. ¿Hay alguna forma mejor de iterar a través de resultados como este?
¿Tiene tmp_drop_ids indexado? CREAR UN ÍNDICE ÚNICO tmp_drop_ids_id_uidx ON tmp_drop_ids (id); – filiprem
@filiprem: lo hago sí – Claudiu