¿Cómo ACTUALIZAR eficientemente una columna en una tabla PostgreSQL grande usando Python / psycopg2?
Tengo una mesa grande con ca. 10 millones de filas en la base de datos PostgreSQL 9.4. Se ve algo así:
gid | number1 | random | result | ...
1 | 2 | NULL | NULL | ...
2 | 15 | NULL | NULL | ...
... | ... | ... | ... | ...
Ahora me gustaría actualizar las columnasrandom
yresult
como una función denumber1
. Eso significa que al menosrandom
necesita ser producido en un script fuera de la base de datos. Como tengo RAM limitada, me pregunto cómo podría hacerlo de manera eficiente usandopsycopg2
. Creo que me enfrento a dos problemas: cómo recuperar los datos sin usar demasiada RAM y cómo recuperarlos allí. El enfoque simple se vería así:
curs.execute("""SELECT gid1, number1 FROM my_table;""")
data = curs.fetchall()
result = []
for i in data:
result.append((create_random(i[1]), i[0]))
curs.executemany("""UPDATE my_table
SET random = %s
WHERE gid = %s;""",
results)
curs.execute("""UPDATE my_table
SET result = number1 * random;""")
Sin embargo, esto ciertamente agotará rápidamente toda mi memoria y tomará una eternidadUPDATE my_table
.
¿Cuál sería una estrategia más inteligente? Se accede a la base de datos exclusivamente y se puede bloquear. La función aleatoria de PostgreSQL desafortunadamente no es adecuada para mi caso.