只有更烂的程序员 - Go语言中文社区

只有更烂的程序员


要想SQL CE里面插入数据,我就直接把数据插入进去:

1        public static void InsertIntoSqlCe()
2ExpandedBlockStart.gifContractedBlock.gif        {
3            for (int i=0;i<Count;i++)
4ExpandedSubBlockStart.gifContractedSubBlock.gif            {
5                SqlCeHelper.ExecuteNonQuery(insertData);
6            }

7        }

 

插入的数据是:

ContractedBlock.gifExpandedBlockStart.gif插入的数据(每个插入200次)
1const string insertData = @"insert into TestTable ([key],[value]) values ('TestKey1','TestValue1') ";
2const string insertDataWithTran = @"insert into TestTable ([key],[value]) values ('TestKey2','TestValue2')";

老大喊程序慢,让优化一下.忽然间想起来以前看到一篇文章里面说,插入多条数据用事务的话会快很多.立马写代码试验:

ContractedBlock.gifExpandedBlockStart.gif带有事务的插入

 1        public static void InsertIntoSqlCeWithTran()
 2ExpandedBlockStart.gifContractedBlock.gif        {
 3            using(SqlCeConnection conn=new SqlCeConnection(SqlCeHelper.ConnString))
 4ExpandedSubBlockStart.gifContractedSubBlock.gif            {
 5                conn.Open();
 6                SqlCeTransaction tran = conn.BeginTransaction();
 7
 8                for (int i = 0; i < Count; i++)
 9ExpandedSubBlockStart.gifContractedSubBlock.gif                {
10                    SqlCeHelper.ExecuteNonQuery(tran, insertDataWithTran);
11                }

12
13                tran.Commit();
14            }

15        }

一测试,立马发现效率大不一样:

简单插入耗时:51422.969ms,大约50s,

用事务插入:   915.7294ms,不到1s,有时候测试会略微多余1s的.

可见用事务插入效率高很多,单次插入在锁上面的花费巨大...........

 

 闲暇之余,顺手测试了一下sqlite的效率:

简单的插入:

1        public static void InsertIntoSqlite()
2ExpandedBlockStart.gifContractedBlock.gif        {
3            for (int i = 0; i < Count;i++ )
4ExpandedSubBlockStart.gifContractedSubBlock.gif            {
5                SqliteHelper.ExecuteNonQuery(insertData);
6            }

7        }

 

带有事务的插入:

ContractedBlock.gifExpandedBlockStart.gifsqlite上面用事务插入
 1        public static void InsertIntoSqliteWithTran()
 2ExpandedBlockStart.gifContractedBlock.gif        {
 3            using (SQLiteConnection conn = new SQLiteConnection(SqliteHelper.ConnString))
 4ExpandedSubBlockStart.gifContractedSubBlock.gif            {
 5                conn.Open();
 6                SQLiteTransaction tran = conn.BeginTransaction();
 7
 8                for (int i = 0; i < Count; i++)
 9ExpandedSubBlockStart.gifContractedSubBlock.gif                {
10                    SqliteHelper.ExecuteNonQuery(tran, insertDataWithTran);
11                }

12
13                tran.Commit();
14            }

15        }

 

运行时间:

简单插入:22952.6452ms,约21s到22s.

事务插入:245.404ms(非常强悍啊).

 

RT.没有最烂的程序员,只有更烂的程序员. 这两天写WM程序算是体会到了.

PS: SQL CE不是一般的烂,现在极其不想用SQL CE了,版本众多,功能简单,部署困难....有机会的话用SQLite吧~~

老久没写文章了,今天冒个泡

 

PS:

1.这次加上主键

num Pk 自增,其他的不变,插入200条分别是47--55.7s和1.0--1.1s.

Sqlite上面表也一样,插入200条数据分别是20--22s和270--310ms.

2.关于Update

通过主键update另外两个字段的值,update200次.

Sql Ce 耗时为53850.4612--54642.9023ms和2103.0424--2188.6178ms.

Sqlie耗时为 14469.8865--15233.3454ms和181.2472--244.342ms.

注意,这些都为典型值,如果对性能有要求,可以多次测量估算平均值. 


PS:特别订正:

1. 在sql ce上面,事务并不能提高程序的性能,反而会有降低.之所以之前的程序表现"良好",是因为事务的使用降低了

SqlConnection打开的时间消耗,在只用一个Connection的情况下,事务的的确确降低了程序的性能.这一点需要注意.

2. 在sqlite上面,怪异的事,事务反而提高的程序的性能.这就只能解释为,sqlite的锁消耗是非常大.据说sqlite的锁是用

文件锁实现的,所以效率较低.......

3. 嵌入式数据库一般不存在并发问题,请在操作的时候使用长连接形式访问数据库,减小Connection上面的消耗.


特别鸣谢: 戚应杰 TX,指出本文错误之处.

 

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/weixin_34375054/article/details/85428323
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-03-01 22:45:13
  • 阅读 ( 674 )
  • 分类:职场

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢