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