Sqlite3:删除索引以提高插入性能,但随后提交速度很慢

时间:2017-05-02 07:26:28

标签: sql indexing sqlite insert commit

我有一个Python程序,它处理大量数据文件并从中提取记录,然后将它们插入到SQLITE3数据库中。 我按日期对数据库进行分区(每天创建一个新的数据库)以减小大小,但它们仍然达到9GB,并且插入速度逐渐变慢,因为该表具有索引。

所以在添加一堆记录之前我想删除索引,然后再添加它,并且记录应该插入更快。然而,我发现插入操作速度得到了改善,但每个记录批次之后的提交都需要永远!

以下是日志中的示例,使用索引:

DB-ADDREC-START|Adding 11425 records from 2017-05-01 into database...
DB-ADDREC-END| (Duration: 9.15 seconds)
DB-COMMIT-START|Committing database transaction..
DB-COMMIT-END| (Duration: 0.96 seconds)

删除索引后,提交时间变化很大但变得非常大:

DB-ADDREC-START|Adding 10681 records from 2017-05-01 into database...
DB-ADDREC-END| (Duration: 0.06 seconds)
DB-COMMIT-START|Committing database transaction..
DB-COMMIT-END| (Duration: 2.29 seconds)

DB-ADDREC-START|Adding 11185 records from 2017-05-01 into database...
DB-ADDREC-END| (Duration: 0.20 seconds)
DB-COMMIT-START|Committing database transaction..
DB-COMMIT-END| (Duration: 21.28 seconds)

为了帮助我也设置:

PRAGMA synchronous=OFF

此外,我目前正在使用WAL日记帐模式

为什么提交时间会变得更高,我该如何预防呢?

1 个答案:

答案 0 :(得分:0)

在WAL模式下,数据库需要在一定量的更改后执行checkpoints。 (这与您是否有索引无关,但对于索引,更多数据会发生变化,因此您应该看到更频繁的检查点。)

进行大量更改时,disable WAL mode;这可能比禁用索引有更大的影响。

相关问题