首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用外键的子查询加速大量插入

使用外键的子查询加速大量插入
EN

Stack Overflow用户
提问于 2013-07-08 08:27:35
回答 1查看 163关注 0票数 0

我必须插入大量数据(从SQLite程序中插入到一个Python中),其中许多字段通过外键进行验证。

查询如下所示,我使用executemany()执行插入操作。

代码语言:javascript
复制
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--'

产出:

代码语言:javascript
复制
SEARCH TABLE
    rtt_errors

USING COVERING INDEX sqlite_autoindex_rtt_errors_1 (name=?) (~1 rows)

我在rtt_errors.name中创建了一个索引,但显然它没有使用它。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-07-08 11:39:30

理论上,Python的默认COMMIT不应该发生在连续的INSERT之间,但是您的性能非常差,就好像正在发生这样的事情。

隔离水平设置为None,然后在所有INSERT的周围执行一对BEGIN/COMMIT命令。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17522056

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档