一、SqlDataReader和SqlDataAdapter性能对比
Stopwatch sw = new Stopwatch(); sw.Start(); using(SqlConnection cnn = new SqlConnection(@"Data Source=RuyeeSoft\SqlExpress;user id=sa;password=123;Initial catalog=NorthWind")) { SqlCommand cmd = cnn.CreateCommand(); cmd.CommandText = "select top(2000000) * from student"; cnn.Open(); SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection); DataTable auto = new DataTable("Auto"); DataColumn vin = new DataColumn("ID"); vin.DataType = typeof(int); vin.Unique = true; vin.AllowDBNull = false; vin.Caption = "ID"; auto.Columns.Add(vin); DataColumn Name = new DataColumn("Name"); Name.DataType = typeof(string); Name.MaxLength = ; //Name.Unique = true; Name.AllowDBNull = false; Name.Caption = "Name"; auto.Columns.Add(Name); DataColumn score = new DataColumn("score"); score.DataType = typeof(int); //score.Unique = true; score.AllowDBNull = false; score.Caption = "score"; auto.Columns.Add(score); while (rdr.Read()) { DataRow newAuto = auto.NewRow(); newAuto[); newAuto[); newAuto[); auto.Rows.Add(newAuto); } } sw.Stop(); Console.WriteLine("1总运行时间:" + sw.Elapsed); sw.Start(); using (SqlConnection cnn = new SqlConnection(@"Data Source=ruyeesoft\SqlExpress;user id=sa;password=123;Initial catalog=NorthWind")) { SqlCommand cmd = cnn.CreateCommand(); cmd.CommandText = "select top(2000000) * from student"; SqlDataAdapter sda = new SqlDataAdapter(cmd); DataTable dt = new DataTable(); cnn.Open(); sda.Fill(dt); } sw.Stop(); Console.WriteLine("2总运行时间:" + sw.Elapsed);
对比结果
100万条数据的效果
1总运行时间:00:00:11.3748084
2总运行时间:00:00:18.0405345
200万条数据的效果
1总运行时间:00:00:24.1619173
2总运行时间:00:00:37.6120735
二、使用非连接数据
1、关于并发:
由于不同的客户端拿到了相同版本的副本,修改后都要讲结果保存到数据库中,这时出现了以哪个修改后的副本为最新版本的决策冲突问题。
2、解决并发冲突:
a、时间优先:第一次更新优先。
b、时间优先:最后一次更新优先。
c、角色优先:看获取副本的客户端的权限级别,谁级别高以谁为准。
d、位置优先:如总部优先与分店。
e、用户解决冲突:提供一个解决冲突界面,让用户选择数据的版本。如tfs的版本冲突解决策略。
3、应该加载什么离线数据
a、数据选择:应该只加载用户需要处理的数据,而不是加载整个数据库。
b、数据量:数量量的大小会影响加载的时间、更新的时间和客户的内存需求量。
c、分割数据:根据业务的使用目的,最好将数据分割成多个部分,并分别存入相应的DataSet对象中。不能在不同的DataSet对象的DataTable对象之间建立外键约束。
4、为了更好的使用离线数据,请使用GUID作为数据库的主键。