我有一个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日记帐模式
为什么提交时间会变得更高,我该如何预防呢?
答案 0 :(得分:0)
在WAL模式下,数据库需要在一定量的更改后执行checkpoints。 (这与您是否有索引无关,但对于索引,更多数据会发生变化,因此您应该看到更频繁的检查点。)
进行大量更改时,disable WAL mode;这可能比禁用索引有更大的影响。