【发布时间】:2013-07-25 19:57:51
【问题描述】:
我正在对 SQLite3 数据库进行大批量插入操作,并试图了解我应该期待什么样的性能与我实际看到的性能。
我的桌子是这样的:
cursor.execute(
"CREATE TABLE tweets(
tweet_hash TEXT PRIMARY KEY ON CONFLICT REPLACE,
tweet_id INTEGER,
tweet_text TEXT)"
)
我的插入看起来像这样:
cursor.executemany("INSERT INTO tweets VALUES (?, ?, ?)", to_write)
其中to_write 是一个元组列表。
目前,数据库中有大约 1200 万行,插入 50 000 行大约需要 16 分钟,在 2008 年的 macbook 上运行。
这听起来合理吗,还是发生了什么严重的事情?
【问题讨论】:
-
您是否尝试过在每个查询中插入多个值?也许不是一次全部,因为您必须创建一个非常大的字符串,但每个字符串可能有 100 个?以我的经验,这大大提高了插入速度。
-
@GustavLarsson:
executemany应该利用已经在每行列中准备查询和流式传输。 -
@GustavLarsson:您是如何提议创建多个插入的?
execute()和executemany()只允许 one 语句。 -
我猜想
for i in range(0,len(my_list),100):execute_many(qry,my_list[i:i+100])之类的东西 -
executemany是否使用事务?如果没有,sqlite 将在内部使用隐式事务包装每个插入语句,这可能会导致批量插入的性能巨大。有关更多信息,请参阅这些:sqlite.org/faq.html#q19 或 stackoverflow.com/questions/3852068/sqlite-insert-very-slow