簡體   English   中英

sqlalchemy批量更新性能問題

[英]sqlalchemy bulk update performance problems

我需要定期使用文件中收到的數據增加列中的值。 該表有> 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的新手,但我確實做過很多文檔閱讀,而我卻無法理解我做錯了什么。

提前致謝!

您通過使用單個查詢進行批量更新來使用正確的方法。

之所以花費那么長是因為表沒有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),
)

我在我的機器上測試了更新的代碼 - 程序運行花了不到2秒。

BTW對你的問題描述贊不絕口 - 你把所有需要的代碼都重現了你的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM