Como atualizar eficientemente uma coluna em uma grande tabela do PostgreSQL usando Python / psycopg2?
Eu tenho uma mesa grande com ca. 10 milhões de linhas no banco de dados PostgreSQL 9.4. Parece algo como isto:
gid | number1 | random | result | ...
1 | 2 | NULL | NULL | ...
2 | 15 | NULL | NULL | ...
... | ... | ... | ... | ...
Agora eu gostaria de atualizar as colunasrandom
eresult
como a função denumber1
. Isso significa que pelo menosrandom
precisa ser produzido em um script fora do banco de dados. Como tenho memória RAM limitada, pergunto-me como eu poderia fazer isso eficientemente usandopsycopg2
. Acredito que enfrento dois problemas: como buscar os dados sem usar muita memória RAM e como recuperá-los. A abordagem simplória seria assim:
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;""")
No entanto, isso certamente esgotará rapidamente toda a minha memória e levará uma eternidade paraUPDATE my_table
.
Qual seria uma estratégia mais inteligente? O banco de dados está sendo acessado exclusivamente e pode ser bloqueado. Infelizmente, a função aleatória do PostgreSQL não é adequada para o meu caso.