ios - 使用事务优化 SQLite

标签 ios sqlite optimization transactions

我创建了一个 iOS 应用程序,当用户点击按钮时,将创建一个线程,并且该线程将执行 SELECT 语句 50 次。我从 http://web.utk.edu/~jplyon/sqlite/SQLite_optimization_FAQ.html#transactions 读到了一种优化技术它写道,(强调我的)

Unless already in a transaction, each SQL statement has a new transaction started for it. This is very expensive, since it requires reopening, writing to, and closing the journal file for each statement. This can be avoided by wrapping sequences of SQL statements with BEGIN TRANSACTION; and END TRANSACTION; statements. This speedup is also obtained for statements which don't alter the database.

因此,我尝试在线程的开头添加 BEGIN TRANSACTION;END TRANSACTION; 以及线程的末尾,我发现它减少了运行时间减半。但是,由于是在线程中,有时会出现这样的情况:

BEGIN TRANSACTION from thread 1
BEGIN TRANSACTION from thread 2
END TRANSACTION from thread 2
END TRANSACTION from thread 1

第二个 BEGIN 和第二个 END 语句将失败。因此,我想将 BEGIN/END 语句移出线程 即在应用程序开始时仅调用一次 BEGIN ,在应用程序结束时调用 END 。但不知道会不会占用内存?即在应用程序的整个生命周期中打开事务而不提交它。该数据库是只读的,因为它与应用程序捆绑在一起。

感谢您的帮助。

最佳答案

如果它是只读数据库,请尝试使用打开它

sqlite3_open_v2("path/to/database", &connection,
                SQLITE_OPEN_READONLY | SQLITE_OPEN_FULLMUTEX, 0);
sqlite3_exec(connection,
             "PRAGMA locking_mode = EXCLUSIVE; PRAGMA journal_mode = OFF;",
             0, 0, &errmsg);

然后在所有线程之间共享connection对象。这应该可以让您获得保持事务打开的所有性能优势,而不必保持事务打开。 (您可能不需要第二个命令。我想 SQLite 足够聪明,能够认识到它不需要锁定或记录只读连接,但我不相信它是这样。)

关于ios - 使用事务优化 SQLite,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5366779/

相关文章:

iphone - popViewControllerAnimated 不更新信息 iPhone SDK

c++ - 在QT gui上将.csv文件导入到sqlite3数据库表

matlab - 最优性准则法

javascript - 如何优化这个 JSP/JavaScript 代码?

ios - 在不使用 TextView 的情况下获取属性字符串的估计高度

javascript - 使用 Phonegap 3.3.0 for ios 访问文件

android - 如何在android中的所有表列中搜索字符串?

mysql - 有索引的查询比没有索引慢

ios - 如何在加载时为 UITableView 中的行设置动画?

sql - sqlite fts 表中的 rowid 与 docid 有什么区别?