我有一个在PostgreSQL 9.4数据库中拥有大约1000万行的大型表格。它看起来有点像这样:
gid | number1 | random | result | ...
1 | 2 | NULL | NULL | ...
2 | 15 | NULL | NULL | ...
... | ... | ... | ... | ...
现在我想根据
number1
的函数来更新random
和result
列。这意味着至少需要在数据库外部的脚本中生成random
。由于我的RAM有限,我想知道如何使用psycopg2
进行高效处理。我认为我面临两个问题:如何在不使用过多RAM的情况下获取数据以及如何将其重新放回去。简单的方法看起来像这样: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;""")
然而,这会消耗掉我所有的内存,并且需要很长时间才能更新我的表格
。
有什么更明智的策略吗?数据库正在被独占访问并且可以被锁定。不幸的是,PostgreSQL的随机函数对我的情况不适用。