【问题标题】:drop or delete a sqlite - table as fast as possible on Android device在 Android 设备上尽快删除或删除一个 sqlite - 表
【发布时间】:2014-02-18 19:12:09
【问题描述】:

我有一个有 1400 行的表。每行都有一个 blob 字段,其中包含 10kb 到 500kb 之间的数据。我需要删除该表。删除表需要 3.5 分钟,删除表需要 3 分钟。这对用户来说太长了。 我怎样才能尽快删除该表? (无需回滚或任何安全措施,只需将其删除即可。)

我已经尝试了以下方法。 1. 设置页面大小:

sqlitedatabase.setPageSize(8000);
sqlitedatabase.execSQL("DROP TABLE IF EXISTS " + sTableName);

2。停用不起作用的日志。

sqlitedatabase.rawQuery("PRAGMA journal_mode=OFF",null);
sqlitedatabase.execSQL("DROP TABLE IF EXISTS " + sTableName);

这对我不起作用。日志日志,我想这需要很多时间,但仍会写入磁盘。

【问题讨论】:

  • 如果您将此表放在单独的数据库中,您可以删除数据库文件并重新创建数据库。这应该快于 3 分钟。但是为什么只删除一张桌子需要这么长时间呢?
  • 因为我的数据库还有其他不应该删除的填充表。我仍然需要删除原始数据库中的表。
  • 我的意思是,你需要这个表和你的其他数据在同一个数据库中吗?如果没有,我说的有效。或者,正如 rutter 所说,您可以使用附加和分离。
  • 谢谢。但我需要一个分贝内的所有表。我也想加入表格。我知道这也可以通过附加来实现。但我想这不是很高效,我不想将我的数据分成几个数据库。还是谢谢。

标签: android performance sqlite


【解决方案1】:

来自SQLite manual(已添加重点):

SQLite 在删除表时比其他数据库慢。 这可能是因为当 SQLite 删除表时,它必须遍历并删除数据库文件中处理的记录那张桌子。另一方面,MySQL 和 PostgreSQL 使用单独的文件来表示每个表,因此它们可以通过删除文件来删除表,这要快得多。

您确实可以选择创建和存储多个数据库文件,然后您可以使用 ATTACHDETACH 查询从单个连接进行管理。

这是我刚刚在 SQLite3 的命令行客户端中运行的示例:

sqlite> ATTACH 'example.sqlite' AS example;
sqlite> CREATE TABLE example.ex ( a INTEGER );
sqlite> INSERT INTO example.ex VALUES (1),(2),(3);
sqlite> SELECT * FROM example.ex;
1
2
3
sqlite> DETACH example;
sqlite>

由于ex 表在其自己的文件example.sqlite 中,我可以简单地将该数据库从连接中分离并删除整个文件,这样会快得多。

请记住,您可以附加的数据库数量相当少(default compile options: 7)。我还了解到,这种情况下不支持外键,尽管该信息可能已过时。

【讨论】:

  • 我认为这对我的情况不利。在我的数据库中有几个表(超过 7 个),它们也应该是可连接的。我想将我所有的表放在一个数据库中。但我考虑了一下。
  • 你的意思是,你想吃蛋糕。
  • 当然可以。我找到了解决方案。 ( enableWriteAheadLogging )
【解决方案2】:

我有一个解决方案,它可以将删除速度提高 6 倍。 与

connection_read.enableWriteAheadLogging();

我在 30 秒内放下桌子。没有它,它需要 3 分钟。 enableWriteAheadLogging 是另一种日志日志,速度更快。

【讨论】:

  • 在缓慢删除方面遇到了类似的问题。这帮助很大。
【解决方案3】:

为什么不把放置表代码放在一个单独的线程中呢?用户不必等待应用删除表。

【讨论】:

  • 在我的情况下,用户必须等待。我删除整个表,然后插入新记录。表格填满后,将数据显示给用户。所以用户必须等待,我有兴趣快速完成此操作。
  • 这个想法很好。重命名表并重新创建/重新填充原始表时,我可以将克隆的表放在单独的线程中。我对此进行了测试,但在线程运行期间 gui 库存/减速。
猜你喜欢
  • 1970-01-01
  • 2014-09-06
  • 2021-10-05
  • 2018-10-16
  • 2014-04-01
  • 2021-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多