Как эффективно ОБНОВИТЬ столбец в большой таблице 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, к сожалению, не подходит для моего случая.

Ответы на вопрос(1)

Ваш ответ на вопрос