对于DataSet,DataReader,sql语句取数据,存储过程取数据这些常见的方式,它们之间的效率问题,网上的评论非常多,而且又不是十分地统一,为了证明它们到底"有多快",我进行了如下测试:

测试一:

主题:DataSet   VS  DataReader

数据量:10万数据的测试表

连接方式:本机

先进行数据表DataTable的装载测试:

DataTable+sql语句装载

 1             SqlConnection conn = new SqlConnection("server=.;database=Test;uid=Test;pwd=test;");
 2             DataTable resultDt = new DataTable();
 3             resultDt.Columns.Add(new DataColumn("Id", typeof(int)));
 4             resultDt.Columns.Add(new DataColumn("TestData1",typeof(string)));
 5             resultDt.Columns.Add(new DataColumn("TestData2", typeof(string)));            
 6             string queryStr = "select * from TestTable";//构建数据表,连接对象及查询语句

 7             Stopwatch watch1 = new Stopwatch();//方式一:DataSet方式装载
 8             watch1.Start();
 9             SqlDataAdapter sda = new SqlDataAdapter(queryStr, conn);
10             DataSet ds = new DataSet();
11             sda.Fill(ds);
12             resultDt = ds.Tables[0];
13             watch1.Stop();
14 
15 
16             Stopwatch watch2 = new Stopwatch();//方式二:DataReader方式装载
17             watch2.Start();
18             SqlCommand cmd = new SqlCommand(queryStr, conn);
19             conn.Open();
20             SqlDataReader sdr = cmd.ExecuteReader();
21             while (sdr.Read()) {
22                 DataRow dr = resultDt.NewRow();
23                 dr["Id"] = sdr["id"];
24                 dr["TestData1"] = sdr["TestData1"];
25                 dr["TestData2"] = sdr["TestData2"];
26                 resultDt.Rows.Add(dr);
27             }
28             sdr.Close();
29             conn.Close();
30             watch2.Stop();
31 
32             Console.WriteLine("DataSet    method,Reflection: " + watch1.Elapsed);
33             Console.WriteLine("DataReader method,Reflection: " + watch2.Elapsed);
34             Console.ReadLine();

测试结果:

DataSet    method,Reflection: 00:00:01.0080464
DataReader method,Reflection: 00:00:01.1056812

然后,我们把这个语句放进存储过程,再测试速度:

存储过程中语句也就是刚刚的查询语句:

DataTable+存储过程装载

 1             SqlConnection conn = new SqlConnection("server=.;database=Test;uid=Test;pwd=test;");
 2             DataTable resultDt = new DataTable();
 3             resultDt.Columns.Add(new DataColumn("Id", typeof(int)));
 4             resultDt.Columns.Add(new DataColumn("TestData1", typeof(string)));
 5             resultDt.Columns.Add(new DataColumn("TestData2", typeof(string)));
 6 
 7 
 8 
 9             SqlCommand cmd = new SqlCommand();
10             cmd.CommandType = CommandType.StoredProcedure;
11             cmd.CommandText = "GetTestData";
12             cmd.Connection = conn;
13 
14             Stopwatch watch1 = new Stopwatch();
15             watch1.Start();            
16             SqlDataAdapter sda = new SqlDataAdapter(cmd);
17             DataSet ds = new DataSet();
18             sda.Fill(ds);
19             resultDt = ds.Tables[0];
20             watch1.Stop();
21 
22 
23             Stopwatch watch2 = new Stopwatch();
24             watch2.Start();            
25             conn.Open();
26             SqlDataReader sdr = cmd.ExecuteReader();
27             while (sdr.Read())
28             {
29                 DataRow dr = resultDt.NewRow();
30                 dr["Id"] = sdr["id"];
31                 dr["TestData1"] = sdr["TestData1"];
32                 dr["TestData2"] = sdr["TestData2"];
33                 resultDt.Rows.Add(dr);
34             }
35             sdr.Close();
36             conn.Close();
37             watch2.Stop();
38 
39             Console.WriteLine("DataSet    method,Reflection: " + watch1.Elapsed);
40             Console.WriteLine("DataReader method,Reflection: " + watch2.Elapsed);
41             Console.ReadLine();

运行结果为:

DataSet    method,Reflection: 00:00:01.0025863
DataReader method,Reflection: 00:00:01.1531541

小结:不管是SQL语句方式,还是存储过程方式,把数据装进DataTable,DataSet方式都比DataReader要快一点点.要是不装载到DataTable呢,情况会不会有所改变呢?

带着这个问题,我有了如下测试:

DataReader不装进DataTable

 1             SqlConnection conn = new SqlConnection("server=.;database=Test;uid=Test;pwd=test;");
 2             DataTable resultDt = new DataTable();
 3             resultDt.Columns.Add(new DataColumn("Id", typeof(int)));
 4             resultDt.Columns.Add(new DataColumn("TestData1", typeof(string)));
 5             resultDt.Columns.Add(new DataColumn("TestData2", typeof(string)));
 6             string queryStr = "select * from TestTable";
 7             Stopwatch watch1 = new Stopwatch();
 8             watch1.Start();
 9             SqlDataAdapter sda = new SqlDataAdapter(queryStr, conn);
10             DataSet ds = new DataSet();
11             sda.Fill(ds);
12             resultDt = ds.Tables[0];
13             watch1.Stop();
14 
15 
16             Stopwatch watch2 = new Stopwatch();
17             watch2.Start();
18             SqlCommand cmd = new SqlCommand(queryStr, conn);
19             conn.Open();
20             SqlDataReader sdr = cmd.ExecuteReader();
21             int i = 0;
22             while (sdr.Read())
23             {
24                 i++;
25             }
26             sdr.Close();
27             conn.Close();
28             watch2.Stop();
29 
30             Console.WriteLine("DataSet    method,Reflection: " + watch1.Elapsed);
31             Console.WriteLine("DataReader method,Reflection: " + watch2.Elapsed);
32             Console.ReadLine();
33 

运行结果:

DataSet    method,Reflection: 00:00:00.9876266
DataReader method,Reflection: 00:00:00.1093267

情况有了改变.但现实中,DataReader不装载到任何对象中的情况还是非常少的.例如,我们经常把这些数据装到List<>对象中,效率究竟怎么样?

List<>装载

 1             SqlConnection conn = new SqlConnection("server=.;database=Test;uid=Test;pwd=test;");
 2             List<TestData> resultDt = new List<TestData>();            
 3             TestData td = null;
 4             string queryStr = "select * from TestTable";
 5             Stopwatch watch1 = new Stopwatch();
 6             watch1.Start();
 7             SqlDataAdapter sda = new SqlDataAdapter(queryStr, conn);
 8             DataSet ds = new DataSet();
 9             sda.Fill(ds);            
10             foreach (DataRow dr in ds.Tables[0].Rows) {
11                 td = new TestData();
12                 td.Id = Convert.ToInt32(dr["Id"]);
13                 td.TestData1 = dr["TestData1"].ToString();
14                 td.TestData2 = dr["TestData2"].ToString();
15                 resultDt.Add(td);
16             }
17             watch1.Stop();
18 
19 
20             Stopwatch watch2 = new Stopwatch();
21             watch2.Start();
22             SqlCommand cmd = new SqlCommand(queryStr, conn);
23             conn.Open();
24             SqlDataReader sdr = cmd.ExecuteReader();            
25             while (sdr.Read())
26             {
27                 td = new TestData();
28                 td.Id = Convert.ToInt32(sdr["Id"]);
29                 td.TestData1 = sdr["TestData1"].ToString();
30                 td.TestData2 = sdr["TestData2"].ToString();
31                 resultDt.Add(td);
32             }
33             sdr.Close();
34             conn.Close();
35             watch2.Stop();
36 
37             Console.WriteLine("DataSet    method,Reflection: " + watch1.Elapsed);
38             Console.WriteLine("DataReader method,Reflection: " + watch2.Elapsed);
39             Console.ReadLine();

运行结果:

DataSet    method,Reflection: 00:00:01.1134010
DataReader method,Reflection: 00:00:00.4901601

小结:

DataSet中包含了DataTable的集合,所以,在SqlDataAdapter.Fill(ds)的过程中,其实已经进行了一次数据装载,再装载到其它对象,等于是进行了2次装载.故尔速度稍慢.

要将数据装到DataTable时,DataReader比DataSet要慢,而装载到List<>对象时,DataReader要比DataTable快至少一倍.

我目前用的是2005的测试环境,下次我会到2008环境下测试延迟加载,看看情况会有什么不同.

转载于:https://www.cnblogs.com/CoreCaiNiao/archive/2009/12/24/1631514.html

究竟哪种取数据的方式最快?相关推荐

  1. 黑客用上机器学习你慌不慌?这 7 种窃取数据的新手段快认识一下

    作者 | IrrfanAk 译者 | 天道酬勤,责编 | Carol 来源 | AI科技大本营(ID:rgznai100) 机器学习以分析大型数据集和模式识别的能力而闻名.它基本上属于人工智能的一个子 ...

  2. HashMap两种遍历数据的方式

    HashMap的遍历有两种方式,一种是entrySet的方式,另外一种是keySet的方式. 第一种利用entrySet的方式: Map map = new HashMap(); Iterator i ...

  3. iOS 四种保存数据的方式!

    2019独角兽企业重金招聘Python工程师标准>>> 在iOS开发过程中,不管是做什么应用,都会碰到数据保存的问题.将数据保存到本地,能够让程序的运行更加流畅,不会出现让人厌恶的菊 ...

  4. cocos2d-x中几种存储数据的方式

    说明:本文所论述内容均基于cocos2dx 3.0 版本. 1.UserDefault 它是cocos2d-x用来存取基本数据类型用的.保存为XML文件格式. 查看CCUserDefault文件,可以 ...

  5. IOS 四种保存数据的方式

    在iOS开发过程中,不管是做什么应用,都会碰到数据保存的问题.将数据保存到本地,能够让程序的运行更加流畅,不会出现让人厌恶的菊花形状,使得用户体验更好.下面介绍一下数据保存的方式: 1.NSKeyed ...

  6. 几种前端数据存储方式(记录)

    1. cookie cookie生成cookie是存在客户端,session存在服务器端.在cookie当用户第一次访问网页时,服务器会给客户端返回一个cookie,在cookie中保存着服务器端se ...

  7. 黑客用上机器学习你慌不慌?这 7 种窃取数据的新手段快来认识一下!

    作者 | IrrfanAk 译者 | 天道酬勤.Carol 责编 | Carol 出品 | AI科技大本营(ID:rgznai100) 机器学习以分析大型数据集和模式识别的能力而闻名.它基本上属于人工 ...

  8. oracle 取第三大的值,Oracle 常见的几种访问提取数据的方式!

    oracle中常见的几种提取数据的方式可以分为三大类:全表扫描,通过rowid访问和索引扫描.下面先看一下全表扫描. 1.table full scan全表扫描:这个应该是平时工作中比较常见,一般在返 ...

  9. 四种常见的 POST-- content-type数据提交方式

    HTTP/1.1 协议规定的 HTTP 请求方法有 OPTIONS.GET.HEAD.POST.PUT.DELETE.TRACE.CONNECT 这几种.其中 POST 一般用来向服务端提交数据,本文 ...

最新文章

  1. ORACLE ORA-01653: unable to extend table 的错误
  2. python 操作 excel
  3. 浏览器拦截打开新窗口情况总结
  4. c++ 提取傅里叶描述子_非谐声子模拟方法(Normal Mode Decomposition)
  5. 在一个centos6上安装多个不同版本python
  6. [RK3399][Android7.1][Camera]IMX307 mclk 37.125M补丁
  7. 【电脑讲解】硬件知识
  8. php strlen 汉子,php使用strlen()判断中文汉字字符串长度
  9. 我的海淀驾校考驾照之路
  10. WinRAR怎么去广告
  11. 男女逗段,瞅瞅有没有说到你
  12. 前世回眸,今生结缘,滚滚红尘,谁人可依
  13. 极米发布极光RS Pro、H3、Z8X三款新品
  14. Jakarta Bean Validation,Constrain once, validate everywhere!
  15. android获取手机短信记录,android 获取手机电话号码和短信内容
  16. Android USB 输入设备
  17. Linux C/C++源码实现常见命令mkdir
  18. 【算法】二维子矩阵的和
  19. UC研发团队热招中!(12月20日更新版)
  20. [置顶] 【稀饭】react native 实战系列教程之热更新原理分析与实现

热门文章

  1. matlab暂态信号,MATLAB6在电力暂态波形仿真实现中的应用
  2. Java 使用反射处理注解
  3. (dag模型+最长路+字典序)嵌套矩形
  4. 江西省计算机应用基础对口高考复习,江西省对口高考计算机应用基础复习题(各章及综合练习)...
  5. 闪灯什么意思_开夜车被对方闪了一下是什么意思?老司机:灯语都不懂,晚上别开车...
  6. Navicat连接Mysql 8.0.16报错:Client does not support authentication protocol requested by server?
  7. kpi绩效考核流程图_公开!松松团队KPI绩效考核表分享
  8. 火焰传感器感应有火亮灯代码_智能无线感应灯火了,光感人感2种传感器感应,做照明品牌的几光...
  9. Java try catch语句详解
  10. 两用物项许可证办理流程_一指通 | 出口许可证办理流程