【问题标题】:sqlalchemy bulk update performance problemssqlalchemy 批量更新性能问题
【发布时间】:2013-05-19 20:05:36
【问题描述】:

我需要使用在文件中收到的数据定期增加列中的值。该表有 > 400000 行。到目前为止,我所有的尝试都导致性能非常差。 我写了一个实验来反映我的要求:

#create table
engine = create_engine('sqlite:///bulk_update.db', echo=False)
metadata = MetaData()

sometable = Table('sometable',  metadata,
    Column('id', Integer, Sequence('sometable_id_seq'), primary_key=True),
    Column('column1', Integer),
    Column('column2', Integer),
)

sometable.create(engine, checkfirst=True)

#initial population
conn = engine.connect()
nr_of_rows = 50000
insert_data = [ { 'column1': i, 'column2' : 0 } for i in range(1, nr_of_rows)]
result = conn.execute(sometable.insert(), insert_data)

#update
update_data = [ {'col1' : i, '_increment': randint(1, 500)} for i in range(1, nr_of_rows)]

print "nr_of_rows", nr_of_rows
print "start time   : " + str(datetime.time(datetime.now()))

stmt = sometable.update().\
        where(sometable.c.column1 == bindparam('col1')).\
        values({sometable.c.column2 : sometable.c.column2 +     bindparam('_increment')})

conn.execute(stmt, update_data)

print "end time : " + str(datetime.time(datetime.now()))

我得到的时间是:

nr_of_rows 10000
start time  : 10:29:01.753938
end time    : 10:29:16.247651

nr_of_rows 50000
start time  : 10:30:35.236852
end time    : 10:36:39.070423

因此,执行 400000+ 行将花费太多时间。

我是 sqlalchemy 的新手,但我确实阅读了很多文档,但我无法理解我做错了什么。

提前致谢!

【问题讨论】:

    标签: python sqlite sqlalchemy sql-update bulk-load


    【解决方案1】:

    您正在使用正确的方法,通过单个查询进行批量更新。

    之所以需要这么长时间是因为该表在sometable.column1 上没有索引。它在列 id 上只有主索引。

    您的更新查询在 where 子句中使用 sometable.column1 来识别记录。因此数据库必须扫描所有表记录以进行每列更新。

    要使更新运行得更快,您需要更新表架构定义代码,以使用 , index=True 将索引创建添加到 column1 定义:

    sometable = Table('sometable',  metadata,
        Column('id', Integer, Sequence('sometable_id_seq'), primary_key=True),
        Column('column1', Integer, index=True),
        Column('column2', Integer),
    )
    

    我在我的机器上测试了更新的代码 - 程序运行需要

    顺便说一句,对您的问题描述表示赞赏 - 您放置了重现问题所需的所有代码。

    【讨论】:

    • 太好了,谢谢!我听说过索引,但我认为它只在大得多的卷中发挥作用。现在一切都清楚了,干杯!
    猜你喜欢
    • 1970-01-01
    • 2019-02-26
    • 1970-01-01
    • 1970-01-01
    • 2017-06-11
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 2019-08-17
    相关资源
    最近更新 更多