代码之家  ›  专栏  ›  技术社区  ›  djangofan

如何使SQLite在PRAGMA synchronous=OFF的情况下运行得更快

  •  5
  • djangofan  · 技术社区  · 14 年前

    我刚刚从命令行创建了一个新的SQLite数据库,并且有一个到SQLite数据库的ODBC连接。
    如果我发出it查询,默认情况下,同步似乎是“ON”,这在很大程度上降低了INSERT性能。

    如何将SQLite数据库默认为 PRAGMA synchronous = OFF 不需要发送SQL命令就可以了?我可以创建一个.INI文件或其他什么来启用它吗?

    4 回复  |  直到 14 年前
        1
  •  10
  •   MPelletier    14 年前

    不幸的是,让这个问题坐了6天之后,我终于找到了答案。这个 SQLite ODBC driver 似乎就是答案。如果您创建DSN,它允许您在DSN设置中将同步设置为“关闭”。很方便。

        2
  •  4
  •   MPelletier    14 年前

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

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

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

    更改:

    safety_level = 3;
    

    致:

    safety_level = 1;
    

    (是的,这是一个从外壳设置) openDatabase 功能(和 attachFunc 如果你愿意的话)。


    如果你真的需要加速这个过程,正如评论中所说,你至少要考虑交易。接下来,这是首选的解决方案。它可能不是最简单的,也可能是最有可能的(毕竟时间是有限的),但它是最干净、最理智、最容易长期维护的。(我只是想把它从我的胸口里拿出来。完成!)

        3
  •  2
  •   Prasath Rajan    10 年前

    在Java中,我在get connection方法上使用了下面的代码片段,因此每当我获得新的连接时,同步将被禁用。

        Connection con = DriverManager.getConnection("jdbc:sqlite:lms.db");        
        Statement st = con.createStatement();        
        String sql="PRAGMA synchronous=OFF";
        st.execute(sql);
    
        4
  •  0
  •   Murilo Calegari de Souza    6 年前

    这个话题的最后一个答案已经很久没有了,但是如果像我这样的人正在寻找一种方法来设置'PRAGMA synchronous=OFF',但是无法保持SQLite连接(我有我的原因);我所做的是在请求查询时设置'PRAGMA synchronous=OFF',然后在软件之后执行常规操作,然后用分号(;)分隔,如下所示:

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

    不知道这是不是一个最佳实践,但它对我有效。