SQLite删除慢

时间:2014-06-19 10:43:46

标签: performance sqlite sql-delete

我有一个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秒钟内给出了一个结果。

我尝试使用事务,缓存大小,日志模式,但我没有让它工作以获得更好的性能。我错过了什么?

4 个答案:

答案 0 :(得分:1)

我遇到了同样的问题。解决方案是将其分成许多较小的块,并一次又一次地执行,直到不再有行受影响(sqlite3_changes()返回零)。

当然这种方式操作没有尽快完成,但表格不会连续锁定太长时间。 希望这有助于某人。

答案 1 :(得分:0)

它是30MB并且也转向了virusscanner,但没有任何结果。所以我尝试了多个东西,我复制了数据库,删除了所有外键并再次尝试,而且速度要快得多。那么我在所有外键上放了一个索引,它也快速删除了。所以这是解决方案,但我不知道为什么它选择快速并删除超慢。但希望这对任何人都有帮助!

答案 2 :(得分:0)

您对所涉及的任何列都有索引吗?如果是这样,请考虑将其删除以进行大型删除,然后重建它。如果不这样做,请尝试添加一个。

答案 3 :(得分:-1)

我在python中有一个脚本来删除sqLite DB中的条目,lfl是我要从DB中删除的文件列表,语句速度处理很多:

$("#quote").html('<%= escape_javascript(render 'quote') %>');