Как эффективно ОБНОВИТЬ столбец в большой таблице PostgreSQL, используя Python / psycopg2?
У меня есть большой стол с ок. 10 миллионов строк в базе данных PostgreSQL 9.4. Это выглядит примерно так:
gid | number1 | random | result | ...
1 | 2 | NULL | NULL | ...
2 | 15 | NULL | NULL | ...
... | ... | ... | ... | ...
Теперь я хотел бы обновить столбцыrandom
а такжеresult
как функцияnumber1
, Это означает, что по крайней мереrandom
должен быть произведен в сценарии вне базы данных. Поскольку у меня ограниченная оперативная память, мне интересно, как я мог бы сделать это эффективно, используяpsycopg2
, Я считаю, что столкнулся с двумя проблемами: как получить данные, не используя слишком много оперативной памяти, и как вернуть их туда. Простой подход будет выглядеть так:
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;""")
Тем не менее, это, безусловно, быстро истощит всю мою память и навсегдаUPDATE my_table
.
Какая стратегия будет умнее? Доступ к базе данных осуществляется исключительно и может быть заблокирован. Случайная функция PostgreSQL, к сожалению, не подходит для моего случая.