提高SQLite性能

时间:2013-02-26 23:43:50

标签: c# sql sqlite

我有file.sql包含20,000插入命令

来自.sql文件的示例

  

插入table VALUES   (1,-400,400,3,154850,'文本',590628,' TEXT' 1610,' TEXT' 79);

     

插入table VALUES   (39,-362,400,3,111659,'文本',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. 使用开始事务和提交事务[在我的代码中显示]。
  3. 使用Firefox的SQLite Manager扩展来测试是否。{ 减慢问题来自剧本;但是,我很惊讶 我尝试使用我的代码处理相同的20,000行 已经在4月4日被拉到了数据库!!!。
  4. 使用PRAGMA synchronous = OFF,以及PRAGMA journal_mode = MEMORY
  5. begin transaction;commit transaction;附加到 分别是.sql文件的开头和结尾。
  6. 正如SQLite文档所述:SQLite能够每秒处理50,000个命令。这是真实的,我使用SQLite Manager确定了它[在我认可的第三个中描述];但是,我在4分钟内完成了20,000命令,这些命令表明存在错误。

    问题:我面临的问题是什么执行非常缓慢?!

2 个答案:

答案 0 :(得分:0)

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();
}

答案 1 :(得分:0)

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

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语句。