我有一个SQLite数据库(第一个使用SQLite的项目),我需要一次删除大量记录,这就像是14.000条记录。这个问题如下(我更改了名称以便更好地阅读):
delete from table_1 where table_2_id in (
select id from table_2 where table_3_id in (
select id from table_3
where (deleted = 1 or
table_4_id in (select id from table_4 where deleted = 1))));
此查询需要8分钟才能删除。但是当我做的时候
select * from table_1 where table_2_id in (
select id from table_2 where table_3_id in (
select id from table_3
where (deleted = 1 or
table_4_id in (select id from table_4 where deleted = 1))));
它在3秒钟内给出了一个结果。
我尝试使用事务,缓存大小,日志模式,但我没有让它工作以获得更好的性能。我错过了什么?
答案 0 :(得分:1)
我遇到了同样的问题。解决方案是将其分成许多较小的块,并一次又一次地执行,直到不再有行受影响(sqlite3_changes()返回零)。
当然这种方式操作没有尽快完成,但表格不会连续锁定太长时间。 希望这有助于某人。
答案 1 :(得分:0)
它是30MB并且也转向了virusscanner,但没有任何结果。所以我尝试了多个东西,我复制了数据库,删除了所有外键并再次尝试,而且速度要快得多。那么我在所有外键上放了一个索引,它也快速删除了。所以这是解决方案,但我不知道为什么它选择快速并删除超慢。但希望这对任何人都有帮助!
答案 2 :(得分:0)
您对所涉及的任何列都有索引吗?如果是这样,请考虑将其删除以进行大型删除,然后重建它。如果不这样做,请尝试添加一个。
答案 3 :(得分:-1)
我在python中有一个脚本来删除sqLite DB中的条目,lfl是我要从DB中删除的文件列表,语句速度处理很多:
$("#quote").html('<%= escape_javascript(render 'quote') %>');