dev*_*ell 16 python sqlite sqlalchemy bulk-load sql-update
我需要定期使用文件中收到的数据增加列中的值.该表有> 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()))
Run Code Online (Sandbox Code Playgroud)
我得到的时间是这些:
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
Run Code Online (Sandbox Code Playgroud)
所以做400000多行会花费太长时间.
我是sqlalchemy的新手,但我确实做过很多文档阅读,而我却无法理解我做错了什么.
提前致谢!
vvl*_*rov 13
您通过使用单个查询进行批量更新来使用正确的方法.
之所以花费那么长的原因是因为该表没有索引sometable.column1.它只有列的主索引id.
您的更新查询使用sometable.column1where子句来标识记录.因此,数据库必须扫描每个列更新的所有表记录.
要使更新运行更快,您需要更新表模式定义代码,以便使用以下内容将列创建添加到column1定义, index=True:
sometable = Table('sometable', metadata,
Column('id', Integer, Sequence('sometable_id_seq'), primary_key=True),
Column('column1', Integer, index=True),
Column('column2', Integer),
)
Run Code Online (Sandbox Code Playgroud)
我在我的机器上测试了更新的代码 - 程序运行花了不到2秒.
BTW对你的问题描述赞不绝口 - 你把所有需要的代码都重现了你的问题.
| 归档时间: |
|
| 查看次数: |
2846 次 |
| 最近记录: |