【问题标题】:SQLite Delete SlowSQLite 删除慢
【发布时间】:2014-06-19 10:43:46
【问题描述】:

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

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

【问题讨论】:

  • 创建临时表(CREATE TEMP TABLE to_delete AS select table_1_id FROM table1 ...);使用它删除的速度有多快 (delete from table_1 where table_1_id in to_delete)?
  • 感谢您的快速回复。创建临时表需要不到一秒钟的时间,所以看起来性能是正确的。要使用查询“从 table_1 中删除 table_1_id in (select id from to_delete)”删除特定数据,它又需要大约 8 分钟。
  • 数据库文件有多大?你有多少内存?什么文件系统?网络?
  • 目前我有以下规格:大小 = 30MB,内存:8GB,磁盘:SSD,系统:Windows 7,网络:本地存储
  • 30 MB?不是国标?你有病毒扫描程序吗?

标签: performance sqlite sql-delete


【解决方案1】:

我遇到了同样的问题。解决方案是把它分成许多更小的块,然后一次又一次地做,直到没有更多的行受到影响(sqlite3_changes() 返回零)。

当然这样操作不会很快完成,但是表不会连续锁定太久。 希望这对某人有所帮助。

【讨论】:

    【解决方案2】:

    它是 30MB,也关闭了病毒扫描程序,但没有任何结果。所以我尝试了很多东西,我复制了数据库,删除了所有外键并再次尝试,速度快得多。所以我在所有外键上都放了一个索引,它也很快被删除了。所以这是解决方案,但我不知道为什么它会快速选择并删除超级慢。但希望这对任何人都有帮助!

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        while len(lfl)>0:
            print ("Deleting entries in DB: ",len(lfl))
            sql="""delete from md5t where file in ('%s')"""%('\',\''.join(tuple(lfl[:500])))
            cursor.execute(sql)
            db.commit()
            del lfl[:500]
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-09-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多