作者:mobiledu2502922357 | 来源:互联网 | 2023-05-18 08:41
SQLite插入数据效率最快的方式就是:开启事务+insert语句+关闭事务(提交)利用事务的互斥性,如果在批量的插入操作前显式地开启一次事务,在插入操作结束后,提交事务,那么所
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行