2013-05-24 36 views
15

Tôi cần tăng giá trị trong cột định kỳ với dữ liệu tôi nhận được trong tệp. Bảng có> 400000 hàng. Cho đến nay, tất cả các nỗ lực của tôi dẫn đến hiệu suất rất kém. Tôi đã viết một thí nghiệm phản ánh yêu cầu của tôi:sqlalchemy vấn đề hiệu suất cập nhật số lượng lớn

#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())) 

thời gian tôi nhận được sau đây:

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 

làm như vậy một 400000+ số lượng hàng sẽ mất nhiều quá lâu.

Tôi mới đến sqlalchemy, nhưng tôi đã làm rất nhiều đọc tài liệu, và tôi chỉ không thể hiểu những gì tôi đang làm sai.

cảm ơn trước!

Trả lời

13

Bạn đang sử dụng đúng cách tiếp cận bằng cách thực hiện cập nhật hàng loạt với một truy vấn.

Lý do mất nhiều thời gian là vì bảng không có chỉ mục trên sometable.column1. Nó chỉ có chỉ mục chính trên cột id.

Truy vấn cập nhật của bạn sử dụng sometable.column1 trong mệnh đề where để xác định hồ sơ. Vì vậy, cơ sở dữ liệu phải quét qua tất cả các bản ghi bảng cho mỗi cập nhật cột đơn.

Để thực hiện cập nhật chạy nhanh hơn nhiều bạn cần cập nhật bảng mã định nghĩa giản đồ của bạn thêm sáng tạo chỉ số để định nghĩa column1 với , index=True:

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

Tôi đã thử nghiệm cập nhật mã trong máy tính của tôi - nó mất < 2 giây để chương trình chạy.

Tuyên bố BTW cho mô tả câu hỏi của bạn - bạn đặt tất cả mã cần thiết để tái tạo sự cố của mình.

+0

tuyệt vời, cảm ơn! Tôi đã nghe nói về lập chỉ mục, nhưng tôi nghĩ nó chỉ đi vào hoạt động với khối lượng lớn hơn nhiều. Tất cả rõ ràng bây giờ, chúc mừng! – devboell

Các vấn đề liên quan