Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用外键子查询加快大规模插入_Python_Sql_Sqlite - Fatal编程技术网

Python 使用外键子查询加快大规模插入

Python 使用外键子查询加快大规模插入,python,sql,sqlite,Python,Sql,Sqlite,我必须插入大量数据(从Python程序到SQLite数据库),其中许多字段通过外键进行验证 查询如下所示,我使用executemany()执行插入 大约300次插入大约需要15秒,我认为这太多了。在生产中,应该有1500块左右的批量插入。在没有外键子查询的类似情况下,速度令人难以置信。很明显,FK会增加开销并减慢进程,但这太多了 我可以做一个预查询来捕获所有外键id,然后直接插入它们,但我觉得必须有一个更干净的选项 另一方面,我读过关于的,如果我没有理解错,可能是在每个SELECT查询之前,有一

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

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

大约300次插入大约需要15秒,我认为这太多了。在生产中,应该有1500块左右的批量插入。在没有外键子查询的类似情况下,速度令人难以置信。很明显,FK会增加开销并减慢进程,但这太多了

我可以做一个预查询来捕获所有外键id,然后直接插入它们,但我觉得必须有一个更干净的选项

另一方面,我读过关于的,如果我没有理解错,可能是在每个SELECT查询之前,有一个自动提交来强制执行完整性。。。这可能会导致进程的放缓,但我尝试以这种方式工作却完全失败

也许我对FK做了一些实质性的错误。如何提高性能

其他信息

查询:

解释查询计划从rtt\U错误中选择id,其中name='--Unknown--'

产出:

SEARCH TABLE
    rtt_errors

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

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

理论上,Python默认的
COMMIT
s不应该发生在连续的
INSERT
s之间,但您极低的性能看起来似乎就是这样


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

解释查询计划从rtt\u错误(其中name=42和其他查询中选择id)的输出是什么?我已经在底部添加了信息。我猜您已经对
名称
?同样在
任务
表中?是的,没错,每个“名称”列都是
唯一的
。这需要一个索引。请尝试设置自动提交模式,然后在所有的
INSERT
s周围执行显式的
BEGIN
/
COMMIT
命令。我认为自动提交的原因是子查询。这些文件从另一个表获取信息,sqlite在select之前提交,以保持一致性。这是有道理的,但我不会冒任何不稳定的风险,所以这是不必要的。
SEARCH TABLE
    rtt_errors

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