0

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

查询看起来像这样,我使用 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,然后直接插入它们,但我觉得必须有一个更清洁的选择。

另一方面,我已经阅读了Isolation level,如果我没有理解错,可能是在每个 SELECT 查询之前,有一个自动 COMMIT 来强制执行完整性......这可能会导致减慢过程也是如此,但我以这种方式工作的尝试完全不成功。

也许我在 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 中创建了一个索引,但显然它没有使用它。

4

1 回答 1

1

理论上,Python 的默认COMMITs 不应该发生在连续INSERT的 s 之间,但是您极差的性能看起来好像正在发生这种情况。

隔离级别设置为None,然后围绕所有s执行一对BEGIN/COMMIT命令一次。INSERT

于 2013-07-08T11:39:30.270 回答