Wie kann eine Spalte in einer großen PostgreSQL-Tabelle mit Python / psycopg2 effizient aktualisiert werden?
Ich habe einen großen Tisch mit ca. 10 Millionen Zeilen in der PostgreSQL 9.4-Datenbank. Es sieht ungefähr so aus:
gid | number1 | random | result | ...
1 | 2 | NULL | NULL | ...
2 | 15 | NULL | NULL | ...
... | ... | ... | ... | ...
Nun möchte ich die Spalten aktualisierenrandom
undresult
als Funktion vonnumber1
. Das bedeutet, dass mindestensrandom
muss in einem Skript außerhalb der Datenbank erstellt werden. Da ich nur über begrenzten Arbeitsspeicher verfüge, frage ich mich, wie ich das mit @ effizient erledigen kanpsycopg2
. Ich glaube, ich stehe vor zwei Problemen: Wie kann ich die Daten abrufen, ohne zu viel RAM zu verbrauchen, und wie kann ich sie wieder dort abrufen? Der simpleton Ansatz würde so aussehen:
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;""")
Allerdings wird dies sicherlich schnell mein ganzes Gedächtnis erschöpfen und ewig dauern, bisUPDATE my_table
.
Was wäre eine intelligentere Strategie? Auf die Datenbank wird exklusiv zugegriffen und sie kann gesperrt werden. Die PostgreSQL-Zufallsfunktion ist für meinen Fall leider nicht geeignet.