5

挿入コマンドfile.sqlが含まれている20,000

.sqlファイルからのサンプル

INSERT INTO tableVALUES(1、-400,400,3,154850、'Text'、590628、'TEXT'、1610、'TEXT'、79);

INSERT INTO tableVALUES(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. トランザクションの開始とトランザクションのコミットを使用する[コードに表示]。
  3. 名前の付いたFirefoxの拡張機能を使用しSQLite Managerて、速度低下の問題がスクリプトに起因するかどうかをテストします。しかし、20,000コードを使用して処理しようとしているのと同じ行が、わずか4ミリ秒でデータベースにプルされていることに驚きました!!!。
  4. PRAGMA synchronous = OFF、および、を使用しPRAGMA journal_mode = MEMORYます。
  5. ファイルの先頭と末尾にそれぞれ追加しbegin transaction;ますcommit transaction;.sql

SQLiteのドキュメントにあるように:SQLiteは50,0001秒あたりのコマンドを処理できます。そしてそれは本当であり、私はSQLite Manager[私が試した3番目の何かで説明されているように]を使用してそれを確認しました。しかし、20,000何か問題があることを示す何かが4分でコマンドを完了しています。

質問:実行が非常に遅いのはなぜですか?!

4

2 に答える 2

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();
}
于 2013-02-27T15:10:03.800 に答える
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はUNIONALLステートメントをサポートしているようです。

于 2013-02-27T15:16:18.510 に答える