【问题标题】:Sqlite delete incredibly slow - How to speed up?Sqlite 删除速度非常慢 - 如何加快速度?
【发布时间】:2014-02-11 16:17:01
【问题描述】:

我读到删除操作很慢,我想知道如何改进此检查。

我有一张表,每天有 10-15k 行填充,每次启动时我都需要清理 6 个月以上的所有记录,但是当数据库增长时,我开始遇到速度问题。运行此命令时接近 100 万条记录 - 即使我没有要删除的内容 - 软件也会挂起几分钟......这是不可接受的:

Using cnn as New SqliteConnection(dbConnection)
    cnn.Open()
    dim cmd as New SQLiteCommand(cnn)
    cmd.CommandText = "DELETE FROM tablename WHERE timecolumn < datetime('now', '-6 months')"
    rowsUpdated = cmd.ExecuteNonQuery
End Using

即使没有删除记录,这也会导致几分钟的挂起。

我怎样才能更快,更快地做到这一点?

我正在为 WinCe 6 开发 .NET compact framework 3.5

谢谢

【问题讨论】:

  • 你应该在这么大的数据库中使用 sqlite 吗?您是否可以考虑转换?
  • 嗯,设备功能没有退出......所以我宁愿尽可能不要切换到 SQL。如果我没有机会,我会... Milion 是 SQLITE 的大型数据库吗?老实说,我不这么认为
  • 您的“时间列”是否已编入索引?可以加快什么都没有被删除的情况。
  • 不,不是安东尼,我要这样做并再次测试。并阅读另一篇文章,谢谢 Alberto

标签: .net database sqlite delete-row sql-delete


【解决方案1】:

这里有很多东西需要调整SQLite Optimization。我会尝试通过更改“PRAGMA cache_size”将整个“tablename”放入内存。当您删除它时,它必须大幅重新平衡 btree。如果它可以全部在内存中,它会快很多。

我还会在“时间列”字段上添加一个索引。没有它,删除将扫描表中的每条记录。当实际删除符合条件的记录时,它会增加完成的工作,但总体上应该会快很多。

如果可能,请移至支持分区的数据库(如 postgreSQL)并使用“时间列”将数据拆分为时间段。这使得数据库将您的表划分为许多子表,并真正加快了在“时间列”之间搜索的内务管理和查询......

【讨论】:

  • 谢谢,我读到索引列会减慢更新/插入速度,这对我来说可能是个问题......无论如何我会尝试与 PRAGMA 更改一起尝试。
  • 如果您每天只添加 15k 行,那么索引应该不会太慢......
  • 我知道这是旧的,但 Sqlite 似乎在删除索引/FK 相关表时存在实际问题,特别是在自连接时。做 PRAGMA foreign_keys = 0;从 [MyTable] 中删除 [条件]; PRAGMA foreign_keys = 1;将我的删除时间从 960 秒加快到大约 1.2 秒
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-25
  • 2010-11-12
  • 1970-01-01
  • 1970-01-01
  • 2012-03-07
  • 2018-04-24
相关资源
最近更新 更多