SQLite 效能問題

摘要:SQLite 效能問題

這幾天有用到SQLite

在插入1、2千筆資料的時候,竟然要花上1、2分鐘

後來Google了一下,

才知道原來是我程式沒加 transaction 的關係

SQLite 預設每個操作都會執行 transaction

如果程式沒加 transaction,插入1000筆資料,就會執行1000次 transaction

如果程式有加 transaction,插入1000筆資料,只會執行1次 transaction

效能上會差很多

沒加 transaction -> 耗時 1 分鐘

有加 transaction -> 耗時 不到 0.1 秒

           // 先刪除資料庫
            File.Delete("test.db");

            // 建立資料庫
            SQLiteConnection.CreateFile("test.db");

            using (SQLiteConnection conn = new SQLiteConnection("Data Source=test.db"))
            {
                // 開啟資料庫
                conn.Open();

                // 建立資料表
                string sql = "create table test1 (id INTEGER PRIMARY KEY, number INTEGER)";
                SQLiteCommand cmd = conn.CreateCommand();
                cmd.Connection = conn;
                cmd.CommandText = sql;
                cmd.ExecuteNonQuery();

                // 開始計時
                Stopwatch watch = new Stopwatch();
                watch.Start();

                SQLiteTransaction trans = conn.BeginTransaction(); // 1
                try
                {
                    // 連續插入1000筆資料
                    for (int i = 0; i < 1000; i++)
                    {
                        cmd.CommandText = "insert into test1 (number) values (@a)";
                        cmd.Parameters.Clear();
                        cmd.Parameters.AddWithValue("@a", i);
                        cmd.ExecuteNonQuery();
                    }

                    trans.Commit(); // 2
                }
                catch
                {
                    trans.Rollback(); // 3
                }


                // 停止計時
                watch.Stop();
                Console.WriteLine(watch.Elapsed);
            }