我必须插入大量数据(从 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 中创建了一个索引,但显然它没有使用它。