我必须插入大量数据(从SQLite程序中插入到一个Python中),其中许多字段通过外键进行验证。
查询如下所示,我使用executemany()执行插入操作。
INSERT INTO connections_to_jjos(
connection_id,
jjo_error_id,
receiver_task_id
sender_task_id
)
VALUES
(
:connection_id,
(select id from rtt_errors where name = :rtx_error),
(select id from tasks where name = :receiver_task),
(select id from tasks where name = :sender_task)
)大约300次插入大约需要15秒,我认为这太过分了。在生产中,应该有1500个成批的插入块。在类似的情况下,没有子查询外键,速度是难以置信的。很明显,FK会增加开销并减慢进程,但这太过了。
我可以做一个预查询来捕获所有外键id,然后直接插入它们,但是我觉得必须有一个更干净的选项。
另一方面,我读过关于隔离水平的文章,如果我不理解它,可能是在每个SELECT查询之前,都有一个自动提交来强制执行完整性.这可能也会减缓这一进程,但我以这种方式开展工作的努力完全失败了。
也许我做的是FK的一些本质上的错误。我如何提高性能?
附加信息
查询:
EXPLAIN QUERY PLAN select id from rtt_errors where name = '--Unknown--'
产出:
SEARCH TABLE
rtt_errors
USING COVERING INDEX sqlite_autoindex_rtt_errors_1 (name=?) (~1 rows)我在rtt_errors.name中创建了一个索引,但显然它没有使用它。
发布于 2013-07-08 11:39:30
理论上,Python的默认COMMIT不应该发生在连续的INSERT之间,但是您的性能非常差,就好像正在发生这样的事情。
将隔离水平设置为None,然后在所有INSERT的周围执行一对BEGIN/COMMIT命令。
https://stackoverflow.com/questions/17522056
复制相似问题