【问题标题】:Sqlite Performance When Deleting Table Data删除表数据时的 Sqlite 性能
【发布时间】:2014-06-30 03:40:58
【问题描述】:

我有一个方法可以删除我本地 sqlite 数据库中的所有记录。

public void deleteAll() {
    Cursor c = getAllRows();
    long rowId = c.getColumnIndexOrThrow(KEY_ROWID);
    if (c.moveToFirst()) {
        do {
            deleteRow(c.getLong((int) rowId));
        } while (c.moveToNext());
    }
    c.close();
}

我注意到,如果我有大约 400 多条记录(每行大约有 5 个字符串列的简单行)要删除它大约需要 2 秒并冻结我的 UI。但是,如果我的记录少于 100 条,它几乎可以立即运行。我想知道这是否正常,或者我是否可能有一些代码潜伏在某处导致性能问题。我是一个初学者,所以如果我发现我有一些非常丑陋的代码将所有内容都锁定了,我丝毫不会感到震惊。

【问题讨论】:

  • 每次删除都成为一个单独的事务,用 start/commit 括起来,并伴随着写事务日志。就像插入一样,您应该在单个事务中执行组中的所有删除操作——您将看到大约 100 倍的性能提升。
  • 只有在需要时(通常)将需要的数据从数据库中提取到客户端,这是您出错的地方。从表中删除所有内容是不需要表中任何数据的操作,因此请遵循 juergen d 的建议

标签: performance sqlite android-sqlite android-cursor


【解决方案1】:

如果要删除表中的所有记录,只需调用单个查询

truncate your_table

delete from your_table

尽量避免一直调用很慢的查询。而是尝试使用单个查询来处理数据。

【讨论】:

  • SQLite 没有truncate 命令,但是没有WHERE 子句的DELETE FROM table 可以完成同样的事情。
  • 哇。那很简单。谢谢!
猜你喜欢
  • 2020-08-01
  • 1970-01-01
  • 2013-06-20
  • 2011-08-30
  • 2018-10-16
  • 1970-01-01
  • 2011-11-10
  • 1970-01-01
相关资源
最近更新 更多