SQLite插入數據效率最快的方式就是:開啟事務 + insert語句 + 關閉事務(提交)
利用事務的互斥性,如果在批量的插入操作前顯式地開啟一次事務,在插入操作結束后,提交事務,那么所有的操作將只執行一次事務,大大地提高IO效率
開啟事務和提交事務時缺省的,如果不顯式寫出來,將在每次insert語句前開啟事務,insert語句后提交,如果執行insert語句1000萬次,那么將自動開啟並提交1000萬次!!!
可以嘗試,去掉下面代碼中兩行紅色代碼,速度將顯著下降!!!
1 using System; 2 using System.IO; 3 using System.Data.SQLite; 4 using System.Diagnostics; 5 using System.Data.Common; 6 7 namespace SqliteTran 8 { 9 class Program 10 { 11 static void Main(string[] args) 12 { 13 DbProviderFactory Dbfactory = SQLiteFactory.Instance; 14 using (DbConnection dbConn = Dbfactory.CreateConnection()) 15 { 16 //連接數據庫 17 File.Delete("NBA.db4"); 18 dbConn.ConnectionString = "data source = NBA.db4"; 19 dbConn.Open(); 20 //創建數據表 21 string sql = "create table Garnett ([age] INTEGER PRIMARY KEY, [s] TEXT COLLATE NOCASE)"; 22 DbCommand cmd = dbConn.CreateCommand(); 23 cmd.Connection = dbConn; 24 cmd.CommandText = sql; 25 cmd.ExecuteNonQuery(); 26 27 // 添加參數 28 cmd.Parameters.Add(cmd.CreateParameter()); 29 // 開始計時 30 Stopwatch watch = new Stopwatch(); 31 watch.Start(); 32 33 DbTransaction trans = dbConn.BeginTransaction(); 34 // 連續插入記錄 35 for (int i = 0; i < 1000000; i++) 36 { 37 cmd.CommandText = "insert into Garnett ([s]) values (?)"; 38 cmd.Parameters[0].Value = i.ToString(); 39 cmd.ExecuteNonQuery(); 40 } 41 trans.Commit(); 42 dbConn.Close(); 43 // 停止計時 44 watch.Stop(); 45 Console.WriteLine(watch.Elapsed); 46 Console.ReadLine(); 47 } 48 } 49 } 50 }
不開啟事務,插入1k行

開啟事務,插入100w行

