当我处理100,000条记录或附近时,有一个运行速度非常快的脚本(大约20秒处理30,000条记录)。脚本从postgresql数据库中获取记录,处理它们,然后在数据库中标记这些记录已被处理。
问题是我现在已将脚本指向具有5000万条记录的数据库,现在10,000条记录大约需要160秒!那非常慢。
我有什么办法可以加快我的更新速度吗?
我的python和SQLAlchemy核心代码是:
def process_records(no_of_records, data)
for x in range(no_of_records):
my_data = data[x]
'''process the data, when done, mark as is_processed'''
dict = {}
dict['b_id'] = pid
dict['is_processed'] = is_processed
is_processed_list.append(dict)
CONN = Engine.connect()
trans = CONN.begin()
stmt = mytable.update().where(mytable.c.id == bindparam('b_id')).\
values(is_processed=bindparam('is_processed'))
CONN.execute(stmt, is_processed_list)
trans.commit()
修改
我描述了我的代码,我意识到问题不在于这个python循环,甚至是批量插入。问题where I was loosing 80+ seconds
是在首先选择要处理的数据。有一次我想出了那个@ Martin的建议,我把一个索引和它的火箭速度加回来了!
答案 0 :(得分:2)
您应该检查查询计划程序告诉您的内容。使用“EXPLAIN”为SQL查询添加前缀,以获取有关Postgresql尝试执行的操作的详细信息。首先,尝试选择应该更新的行以查看发生的情况。
如果选择部分很慢(读取),则可以通过在此条件下使用索引来固定(mytable.c.id == b_id)。请注意,在Postgresql中,FOREIGN KEY不会为您的表编制索引。
有关EXPLAIN的详细信息,请参阅此处:http://www.postgresql.org/docs/current/static/sql-explain.html
如果写入部分很慢,您可能需要调整Postgresql的配置。