mcf*_*oft 4 sqlite performance android
我有一个 1400 行的表。每行都有一个 blob 字段,用于保存 10kb 到 500kb 之间的数据。我需要删除那个表。删除表需要 3.5 分钟,删除表需要 3 分钟。这对用户来说太长了。如何尽快删除该表?(不需要回滚或任何安全性,只需将其删除即可。)
我已经尝试了以下方法。1. 设置页面大小:
sqlitedatabase.setPageSize(8000);
sqlitedatabase.execSQL("DROP TABLE IF EXISTS " + sTableName);
Run Code Online (Sandbox Code Playgroud)
2. 停用无效的日志。
sqlitedatabase.rawQuery("PRAGMA journal_mode=OFF",null);
sqlitedatabase.execSQL("DROP TABLE IF EXISTS " + sTableName);
Run Code Online (Sandbox Code Playgroud)
这对我不起作用。日志日志,我猜它需要很多时间,仍然被写入磁盘。
来自SQLite 手册(添加了重点):
在删除表时,SQLite 比其他数据库慢。这可能是因为当 SQLite 删除一个表时,它必须遍历并删除处理该表的数据库文件中的记录。另一方面,MySQL 和 PostgreSQL 使用单独的文件来表示每个表,因此它们可以简单地通过删除文件来删除表,这要快得多。
您确实可以选择创建和存储多个数据库文件,然后您可以通过单个连接ATTACH和DETACH查询来管理这些文件。
这是我刚刚在 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>
Run Code Online (Sandbox Code Playgroud)
由于ex表在它自己的文件中example.sqlite,我可以简单地从连接中分离该数据库并删除整个文件,这会快得多。
请记住,您可以附加的 DB 数量相当少(使用默认编译选项:7)。我还读到在这种情况下不支持外键,尽管该信息可能已过时。