只有更烂的程序员

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

1图片 1        public static void InsertIntoSqlCe()
2图片 2图片 3        图片 4{
3图片 5            for (int i=0;i<Count;i++)
4图片 6图片 7            图片 8{
5图片 9                SqlCeHelper.ExecuteNonQuery(insertData);
6图片 10            }
7图片 11        }

 

插入的多少是:

图片 12图片 13插入的数据(每个插入200次)
1图片 14const string insertData = @”insert into TestTable ([key],[value]) values (‘TestKey1′,’TestValue1’) “;
2图片 15const string insertDataWithTran = @”insert into TestTable ([key],[value]) values (‘TestKey2′,’TestValue2’)”;

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

图片 16图片 17涵盖事务的插入

 1图片 18        public static void InsertIntoSqlCeWithTran()
 2图片 19图片 20        图片 21{
 3图片 22            using(SqlCeConnection conn=new SqlCeConnection(SqlCeHelper.ConnString))
 4图片 23图片 24            图片 25{
 5图片 26                conn.Open();
 6图片 27                SqlCeTransaction tran = conn.BeginTransaction();
 7图片 28
 8图片 29                for (int i = 0; i < Count; i++)
 9图片 30图片 31                图片 32{
10图片 33                    SqlCeHelper.ExecuteNonQuery(tran, insertDataWithTran);
11图片 34                }
12图片 35
13图片 36                tran.Commit();
14图片 37            }
15图片 38        }

一测试,立马发现功用大不同:

不难插入耗时:51422.969ms,大概50s,

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

足见用工作插入功能高很多,单次插入在锁上面的开支巨大………..

 

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

粗略的插入:

1图片 39        public static void InsertIntoSqlite()
2图片 40图片 41        图片 42{
3图片 43            for (int i = 0; i < Count;i++ )
4图片 44图片 45            图片 46{
5图片 47                SqliteHelper.ExecuteNonQuery(insertData);
6图片 48            }
7图片 49        }

 

含有事务的插入:

图片 50图片 51sqlite上边用工作插入
 1图片 52        public static void InsertIntoSqliteWithTran()
 2图片 53图片 54        图片 55{
 3图片 56            using (SQLiteConnection conn = new SQLiteConnection(SqliteHelper.ConnString))
 4图片 57图片 58            图片 59{
 5图片 60                conn.Open();
 6图片 61                SQLiteTransaction tran = conn.BeginTransaction();
 7图片 62
 8图片 63                for (int i = 0; i < Count; i++)
 9图片 64图片 65                图片 66{
10图片 67                    SqliteHelper.ExecuteNonQuery(tran, insertDataWithTran);
11图片 68                }
12图片 69
13图片 70                tran.Commit();
14图片 71            }
15图片 72        }

 

运作时刻:

简单插入: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,指出本文错误之处.

 

网站地图xml地图