默认情况下,如何使用PRAGMA synchronous = OFF让SQLite更快地运行

时间:2010-11-18 00:02:18

标签: database sqlite

我刚从命令行创建了一个新的SQLite数据库,并且我与SQLite数据库建立了ODBC连接 如果我发出查询,默认情况下,同步似乎是“开启”,这实际上是在缓慢降低INSERT性能。

如何让SQLite数据库默认为 PRAGMA synchronous = OFF ,而无需为此发送SQL命令?我可以创建一个.INI文件或其他东西来启用吗?

5 个答案:

答案 0 :(得分:10)

不幸的是,对于每个人,在让这个问题停留6天之后,我终于找到了答案。 SQLite ODBC driver似乎就是答案。如果您创建DSN,则可以在DSN设置中将“同步”设置为“关闭”。非常方便。

答案 1 :(得分:4)

默认情况下,SQLite在FULL同步上运行。没有INI,除了连接时没有任何改变。但是,每次会话只需设置一次,因此您可以更改项目的连接功能,以便在连接后添加“PRAGMA synchronous = OFF”命令。这实际上是最干净,最快捷的方法。

但是如果您确实希望SQLite在默认情况下关闭同步打开数据库,您可能希望使用不同的默认值重新编译SQLite。

对于当前版本(3.7.3),在sqlite-amalgamation source的sqlite.c中查找变量safety_level

变化:

safety_level = 3;

要:

safety_level = 1;

(是的,它是shell设置中的一个。)在openDatabase函数中(如果您愿意,可以attachFunc。)


如果你确实需要加速这个过程,正如评论中所述,你至少会考虑交易。在路上,这是首选的解决方案。它可能不是最简单的,也可能是最可能的(时间毕竟仅限于所有),但从长远来看,它是最干净,最安全,最容易维护的。 (我只是不得不放弃我的胸膛。完成!)

答案 2 :(得分:2)

在Java中,我在getConnection方法上使用以下代码段。所以每当我获得新连接时,同步都将被禁用。

    Connection con = DriverManager.getConnection("jdbc:sqlite:lms.db");        
    Statement st = con.createStatement();        
    String sql="PRAGMA synchronous=OFF";
    st.execute(sql);

答案 3 :(得分:0)

距离该主题的最后一个答案已经有很长时间了,但是如果像我这样的人正在寻找一种设置“ PRAGMAynchronous = OFF”但无法保持SQLite连接存活的方法(我有我的理由);我所做的是在查询开始时设置“ PRAGMA syncon = OFF”,然后进行常规操作,然后以分号(;)分隔,如下所示:

PRAGMA synchronous = OFF; INSERT INTO [...]

不知道这是否是最佳做法,但这对我有用。

答案 4 :(得分:0)

无论如何,在 Windows 中,PRAGMA 语句必须在打开数据库之后执行,而不是之前。