究竟哪种取数据的方式最快?
对于DataSet,DataReader,sql语句取数据,存储过程取数据这些常见的方式,它们之间的效率问题,网上的评论非常多,而且又不是十分地统一,为了证明它们到底"有多快",我进行了如下测试:
测试一:
主题:DataSet VS DataReader
数据量:10万数据的测试表
连接方式:本机
先进行数据表DataTable的装载测试:
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
然后,我们把这个语句放进存储过程,再测试速度:
存储过程中语句也就是刚刚的查询语句:
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呢,情况会不会有所改变呢?
带着这个问题,我有了如下测试:
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<>对象中,效率究竟怎么样?
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
究竟哪种取数据的方式最快?相关推荐
- 黑客用上机器学习你慌不慌?这 7 种窃取数据的新手段快认识一下
作者 | IrrfanAk 译者 | 天道酬勤,责编 | Carol 来源 | AI科技大本营(ID:rgznai100) 机器学习以分析大型数据集和模式识别的能力而闻名.它基本上属于人工智能的一个子 ...
- HashMap两种遍历数据的方式
HashMap的遍历有两种方式,一种是entrySet的方式,另外一种是keySet的方式. 第一种利用entrySet的方式: Map map = new HashMap(); Iterator i ...
- iOS 四种保存数据的方式!
2019独角兽企业重金招聘Python工程师标准>>> 在iOS开发过程中,不管是做什么应用,都会碰到数据保存的问题.将数据保存到本地,能够让程序的运行更加流畅,不会出现让人厌恶的菊 ...
- cocos2d-x中几种存储数据的方式
说明:本文所论述内容均基于cocos2dx 3.0 版本. 1.UserDefault 它是cocos2d-x用来存取基本数据类型用的.保存为XML文件格式. 查看CCUserDefault文件,可以 ...
- IOS 四种保存数据的方式
在iOS开发过程中,不管是做什么应用,都会碰到数据保存的问题.将数据保存到本地,能够让程序的运行更加流畅,不会出现让人厌恶的菊花形状,使得用户体验更好.下面介绍一下数据保存的方式: 1.NSKeyed ...
- 几种前端数据存储方式(记录)
1. cookie cookie生成cookie是存在客户端,session存在服务器端.在cookie当用户第一次访问网页时,服务器会给客户端返回一个cookie,在cookie中保存着服务器端se ...
- 黑客用上机器学习你慌不慌?这 7 种窃取数据的新手段快来认识一下!
作者 | IrrfanAk 译者 | 天道酬勤.Carol 责编 | Carol 出品 | AI科技大本营(ID:rgznai100) 机器学习以分析大型数据集和模式识别的能力而闻名.它基本上属于人工 ...
- oracle 取第三大的值,Oracle 常见的几种访问提取数据的方式!
oracle中常见的几种提取数据的方式可以分为三大类:全表扫描,通过rowid访问和索引扫描.下面先看一下全表扫描. 1.table full scan全表扫描:这个应该是平时工作中比较常见,一般在返 ...
- 四种常见的 POST-- content-type数据提交方式
HTTP/1.1 协议规定的 HTTP 请求方法有 OPTIONS.GET.HEAD.POST.PUT.DELETE.TRACE.CONNECT 这几种.其中 POST 一般用来向服务端提交数据,本文 ...
最新文章
- ORACLE ORA-01653: unable to extend table 的错误
- python 操作 excel
- 浏览器拦截打开新窗口情况总结
- c++ 提取傅里叶描述子_非谐声子模拟方法(Normal Mode Decomposition)
- 在一个centos6上安装多个不同版本python
- [RK3399][Android7.1][Camera]IMX307 mclk 37.125M补丁
- 【电脑讲解】硬件知识
- php strlen 汉子,php使用strlen()判断中文汉字字符串长度
- 我的海淀驾校考驾照之路
- WinRAR怎么去广告
- 男女逗段,瞅瞅有没有说到你
- 前世回眸,今生结缘,滚滚红尘,谁人可依
- 极米发布极光RS Pro、H3、Z8X三款新品
- Jakarta Bean Validation,Constrain once, validate everywhere!
- android获取手机短信记录,android 获取手机电话号码和短信内容
- Android USB 输入设备
- Linux C/C++源码实现常见命令mkdir
- 【算法】二维子矩阵的和
- UC研发团队热招中!(12月20日更新版)
- [置顶] 【稀饭】react native 实战系列教程之热更新原理分析与实现
热门文章
- matlab暂态信号,MATLAB6在电力暂态波形仿真实现中的应用
- Java 使用反射处理注解
- (dag模型+最长路+字典序)嵌套矩形
- 江西省计算机应用基础对口高考复习,江西省对口高考计算机应用基础复习题(各章及综合练习)...
- 闪灯什么意思_开夜车被对方闪了一下是什么意思?老司机:灯语都不懂,晚上别开车...
- Navicat连接Mysql 8.0.16报错:Client does not support authentication protocol requested by server?
- kpi绩效考核流程图_公开!松松团队KPI绩效考核表分享
- 火焰传感器感应有火亮灯代码_智能无线感应灯火了,光感人感2种传感器感应,做照明品牌的几光...
- Java try catch语句详解
- 两用物项许可证办理流程_一指通 | 出口许可证办理流程