【问题标题】:Improving SQLite Performance提高 SQLite 性能
【发布时间】: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();
}

我尝试过的事情

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

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

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

【问题讨论】:

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

标签: c# sql sqlite


【解决方案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 等,我当然会输入真实的列名。这些只是我的占位符。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-11
    • 1970-01-01
    • 2016-10-23
    • 1970-01-01
    • 2010-12-15
    • 2010-12-15
    相关资源
    最近更新 更多