提高 SQLite 性能

Posted

技术标签:

【中文标题】提高 SQLite 性能【英文标题】:Improving SQLite Performance 【发布时间】:2013-02-12 15:28:19 【问题描述】:

我有一个file.sql,其中包含20,000 的插入命令

来自.sql 文件的示例

插入table 值 (1,-400,400,3,154850,'Text',590628,'TEXT',1610,'TEXT',79);

插入table 值 (39,-362,400,3,111659,'Text',74896,'TEXT',0,'TEXT',14);

我正在使用以下代码创建内存中的 Sqlite 数据库并将值拉入其中然后计算经过的时间

using (var conn = new SQLiteConnection(@"Data Source=:memory:"))

    conn.Open();

    var stopwatch = new Stopwatch();
    stopwatch.Start();

    using (var cmd = new SQLiteCommand(conn))
    
        using (var transaction = conn.BeginTransaction())
        

                cmd.CommandText = File.ReadAllText(@"file.sql");
                cmd.ExecuteNonQuery();

            transaction.Commit();
        
    

    var timeelapsed = stopwatch.Elapsed.TotalSeconds <= 60
                          ? stopwatch.Elapsed.TotalSeconds + " seconds"
                          : Math.Round(stopwatch.Elapsed.TotalSeconds/60) + " minutes";
    MessageBox.Show(string.Format("Time elapsed 0", timeelapsed));
    conn.Close();

我尝试过的事情

    使用文件数据库而不是内存数据库。 使用开始事务和提交事务 [AS SHOWN IN MY CODE]。 使用Firefox的扩展名为SQLite Manager来测试是否 减速问题来自脚本;然而,我很惊讶 我尝试使用我的代码处理的相同 20,000 行 已在 4 毫秒内被拉入数据库!!!。 使用PRAGMA synchronous = OFF,以及PRAGMA journal_mode = MEMORY。 将begin transaction;commit transaction; 附加到 .sql 文件的开头和结尾。

正如 SQLite 文档所说:SQLite 能够每秒处理 50,000 命令。这是真实的,我使用SQLite Manager [如我尝试的第三件事中所述] 确定了这一点;但是,我在 4 分钟内完成了我的 20,000 命令,这表明有问题。

问题:我面临什么问题,为什么执行速度非常慢?!

【问题讨论】:

您是否尝试过事务对象之后创建命令对象? 我认为这是我的代码中所做的?? 您是否尝试了解 ReadAllText 方法需要多长时间? 只需要一秒钟,因为当我尝试调试程序时它只会停止不到一秒钟 在您的代码中,您先调用new SQLiteCommand(conn),然后再调用conn.BeginTransaction()。尝试在这两行之间切换,看看会发生什么。 【参考方案1】:

SQLite.Net 文档推荐以下交易结构

using (SqliteConnection conn = new SqliteConnection(@"Data Source=:memory:")) 

  conn.Open();
  using(SqliteTransaction trans = conn.BeginTransaction())
  
    using (SqliteCommand cmd = new SQLiteCommand(conn))
    
      cmd.CommandText = File.ReadAllText(@"file.sql");
      cmd.ExecuteNonQuery();
    
    trans.Commit();
  
  con.Close();

【讨论】:

【参考方案2】:

您是否能够将文本文件上下文操作为:

INSERT INTO table (col01, col02, col03, col04, col05, col06, col07, col08, col09, col10, col11)
SELECT 1,-400,400,3,154850,'Text',590628,'TEXT',1610,'TEXT',79
UNION ALL
SELECT 39,-362,400,3,111659,'Text',74896,'TEXT',0,'TEXT',14
;

也许尝试将它们“分批”成 100 个一组作为初始测试。

http://sqlite.org/lang_select.html

SqlLite 似乎支持 UNION ALL 语句。

【讨论】:

col01 等,我当然会输入真实的列名。这些只是我的占位符。

以上是关于提高 SQLite 性能的主要内容,如果未能解决你的问题,请参考以下文章

如何提高 Python 3.6 中的 SQLite 插入性能?

如何提高 SQLite 数据库的性能?

Sqlite3插入性能测试

将大型 python 列表传递到 SQLite SELECT 语句时如何提高性能?

使用嵌套查询的 sqlite 查询性能

增强 select sqlite 查询的性能