Ios 使用事务的SQLite优化

Ios 使用事务的SQLite优化,ios,sqlite,optimization,transactions,Ios,Sqlite,Optimization,Transactions,我创建了一个iOS应用程序,当用户点击按钮时,将创建一个线程,该线程将执行SELECT语句50次。我从中读到一种优化技术,并写道(我的重点) 除非已经在交易中,否则每个 SQL语句有一个新事务 开始了。这是非常重要的 昂贵,因为它需要 重新打开、写入和关闭 每个语句的日志文件。这 可以通过包装顺序来避免 包含BEGIN的SQL语句的数量 交易和结束交易 声明此加速也很重要 为不符合以下条件的语句获取 更改数据库。 因此,我尝试添加开始事务在线程的开头和结束事务和线程结束,我发现它将运行时间减少了

我创建了一个iOS应用程序,当用户点击按钮时,将创建一个线程,该线程将执行
SELECT
语句50次。我从中读到一种优化技术,并写道(我的重点)

除非已经在交易中,否则每个 SQL语句有一个新事务 开始了。这是非常重要的 昂贵,因为它需要 重新打开、写入和关闭 每个语句的日志文件。这 可以通过包装顺序来避免 包含
BEGIN的SQL语句的数量
交易
结束交易
声明此加速也很重要
为不符合以下条件的语句获取
更改数据库。

因此,我尝试添加
开始事务在线程的开头和
结束事务和线程结束,我发现它将运行时间减少了一半。但是,由于它位于线程中,有时会出现如下情况:

BEGIN TRANSACTION from thread 1
BEGIN TRANSACTION from thread 2
END TRANSACTION from thread 2
END TRANSACTION from thread 1
第二个
BEGIN
和第二个
END
语句将失败。因此,我想将
BEGIN
/
END
语句移出线程 i、 e.在应用程序开始时只调用一次
BEGIN
,在应用程序结束时调用
END
。但我不确定它是否会耗尽内存?i、 e.打开事务时考虑应用程序的生命周期,而不提交它。数据库是只读的,因为它与应用程序捆绑在一起


谢谢您的帮助。

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

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);

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

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

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);
然后在所有线程之间共享
连接
对象。这应该让您获得让事务保持打开状态的所有性能好处,而不必让事务保持打开状态。(您可能不需要第二个命令。我认为SQLite足够聪明,可以认识到它不需要为只读连接锁定或记录日志,但我不相信它是这样的。)