SQLite更新ONE记录非常(相对)缓慢

时间:2014-02-05 23:24:41

标签: sqlite sql-update

在插入/更新许多行时,我知道SQLite的“问题”,但这不是这种情况。

我正在更新一行中的一个字段,由PK编制索引,在一个包含约250条记录的表中。查询总是需要大约200毫秒。这听起来很少,但它很大。

为什么1个非常简单的UPDATE查询需要200毫秒?所有阅读都非常快速。

我试过了:

  • BEGINCOMMIT - 没有变化,因为它只是一条陈述
  • PRAGMA journal_mode=PERSIST - 没有变化,显然磁盘不是问题吗?
  • 删除UPDATE语句 - 这对于时间来说非常有用!但是它不是很持久

与同一系统上的MySQL进行比较:在一个非常相似的数据库中 0.6ms

我不需要事务安全性(ACID?)或任何你称之为的东西。如果计算机在此查询期间崩溃,我可能会失去所有更改。 MySQL(InnoDB)有一个选项:innodb_flush_log_at_trx_commit。 SQLite有类似的东西吗?

我正在使用sqlite-3.7.9,如果这很重要。

2 个答案:

答案 0 :(得分:7)

是的,SQLite有一个像MySQL的innodb_flush_log_at_trx_commit

这样的选项
PRAGMA synchronous=OFF

它就像一个魅力。没有ACID,是的速度。出于某种令人难以置信的原因,UPDATE现在需要< 1毫秒。

journal_mode

也在改善
PRAGMA journal_mode=MEMORY
or
PRAGMA journal_mode=OFF

两者都非常快,而不是ACID。回滚不是问题,因此在这种情况下两者都很好。 OFF是最快的,因为它根本不创建日记(?)。

答案 1 :(得分:0)

SQLite是处理轻量级数据集的好选择。是的,在插入/更新数据时,它比任何数据库慢得多。通过自己提交查询,可以加快这些操作。请通过下面的演示代码。我已经使用JDBCTemplate Spring框架引用了JAVA代码来执行我的数据库操作。请使用try-catch bolcks处理所需的异常

conn = DataSourceUtils.getConnection(jdbcTemplate.getDataSource());
conn.setAutoCommit(false);
PreparedStatement stmt = conn.prepareStatement(query_string);
for(Object[] temp:argsListForInsertQuery)
{
    stmt.setString(1, (String)temp[0]);
    stmt.setString(2, (String)temp[1]);
    stmt.setString(3, (String)temp[2]);
    stmt.setString(4, (String)temp[3]);
    stmt.addBatch();
 }
 stmt.executeBatch();
 conn.commit();
 conn.setAutoCommit(true);
 conn.close();