如何加快postgresql中的批量更新速度

时间:2013-12-18 22:18:20

标签: python postgresql python-3.x sqlalchemy

当我处理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的建议,我把一个索引和它的火箭速度加回来了!

1 个答案:

答案 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的配置。