有多个表包含超过100万条记录,我必须执行以下操作:
for record in GiantTable.objects.all():
doSomethingAwesome(record)
我试过了:
最后我最终编写了一个函数并在postgreSQL中创建了游标:
CREATE FUNCTION reffunc(refcursor) RETURNS refcursor AS $$
BEGIN
OPEN $1 FOR SELECT * FROM giantTable;
RETURN $1;
END;
$$ LANGUAGE plpgsql;
如psycopg2中所述,并将此光标称为:
import psycopg2
conn = psycopg2.connect("dbname=test user=root")
cur1 = conn.cursor() cur1.callproc('reffunc', ['curname'])
cur2= conn.cursor('curname')
for rec in cur2.fetchall():
doSomethingAwesome(rec)
我有两个疑问:
正如psycopg2中所述,
默认值2000允许每次往返获取大约100KB,假设记录了10-20列混合数字和字符串
但是这是否意味着postgreSQL每次在2000条记录之后都会命中DB,它如何返回结果?因为当我len(cur2.fetchall())
时,需要花费时间并返回总记录数。我应该在postgreSQL FETCH 2000 FROM gigantic_cursor;
中编写另一个函数,并在每2000个记录后从django调用此函数吗?
我应该采用这种方法,并对所有其他表做同样的事情。这是减少记忆和时间的最佳方式,还是我误解了什么?