关于LINQ和SQL操作数据库的性能测试(转)
微软linq技术已经出现很久,很多公司已经开始商业使用,作为我们暂时没有用到的人来说,也应该适当的了解下相关知识,但是直到目前网络上对他的看法仍然是褒贬不一,当然任何事情都不可能完美的,下面就针对大多数人比较关注的效率问题做一次试验,来实实在在的用事实说次话,(由于过年在家无事突发奇想做的试验也没用到专业测试工具,但就大体而言,能说明问题就够了)
声明:本测试全部原创,属于个人爱好测试,如转载,希望保留作者,另外,如不认同或专业使用可另行测试
测试目的:主要是测试两者的时间区别
测试者:石曼迪(shiyeping@163.com)
测试环境:
CPU:奔腾双核T3400(2.16G) 内存:2G 667 硬盘:160G 操作系统:XP SP3 编译工具:vs 2008+mssql 2005 |
测试依据(非专业精密工具):
Stopwatch 类 提供一组方法和属性,可用于准确地测量运行时间。 Stopwatch 实例可以测量一个时间间隔的运行时间,也可以测量多个时间间隔的总运行时间。在典型的 Stopwatch 方案中,先调用 Start 方法,然后调用 Stop 方法,最后使用 Elapsed 属性检查运行时间。 Stopwatch 实例或者在运行,或者已停止;使用 IsRunning 可以确定 Stopwatch 的当前状态。使用 Start 可以开始测量运行时间;使用 Stop 可以停止测量运行时间。通过属性 Elapsed、ElapsedMilliseconds 或 ElapsedTicks 查询运行时间值。当实例正在运行或已停止时,可以查询运行时间属性。运行时间属性在 Stopwatch运行期间稳固递增;在该实例停止时保持不变。 默认情况下,Stopwatch 实例的运行时间值相当于所有测量的时间间隔的总和。每次调用 Start 时开始累计运行时间计数;每次调用 Stop 时结束当前时间间隔测量,并冻结累计运行时间值。使用 Reset 方法可以清除现有 Stopwatch 实例中的累计运行时间。 Stopwatch 在基础计时器机制中对计时器的刻度进行计数,从而测量运行时间。如果安装的硬件和操作系统支持高分辨率性能的计数器,则 Stopwatch 类将使用该计数器来测量运行时间;否则,Stopwatch 类将使用系统计数器来测量运行时间。使用 Frequency 和 IsHighResolution 字段可以确定实现 Stopwatch 计时的精度和分辨率。 Stopwatch 类为托管代码内与计时有关的性能计数器的操作提供帮助。具体说来,Frequency 字段和 GetTimestamp 方法可以用于替换非托管 Win32 APIQueryPerformanceFrequency 和 QueryPerformanceCounter。
|
测试前准备:
新建一个数据库:SpeedTest,插入500万条记录用时38分57秒,最终数据库大小:213M
见表语句如:
CREATE TABLE Tab( Id int IDENTITY(1,1) NOT NULL, Context nvarchar(50) NOT NULL, DoTime datetime NOT NULL ) |
测试代码见附件
插入语句如:
declare @i int,@start datetime,@end datetime set @i=0 set @start=getdate() while(@i<5000000) begin insert into tab(context,dotime)values('值:'+convert(varchar(20),rand()*10*rand()),getdate()) set @i=@i+1 end set @end=getdate() print '插入500万条数据用时:'+convert(varchar(20),datediff(ms,@start,@end)) |
第一轮测试——查询
查询第100000到120000条数据中的长度为8的数据
查询用SQL语句如:
--查询第到条数据中的长度为的数据 declare @start datetime,@end datetime set @start=getdate() select * from ( select top 20000 * from tab where id not in(select top 100000 id from tab)) as t where len(t.Context)=8 set @end=getdate() print '插入万条数据用时:'+convert(varchar(20),datediff(ms,@start,@end)) |
测试结果如:
单位:秒
第一次 |
第二次 |
第三次 |
第四次 |
第五次 |
第六次 |
第七次 |
第八次 |
第九次 |
第十次 |
|
Linq |
0.6788 |
0.681 |
0.6704 |
0.6804 |
0.686 |
0.6555 |
0.6753 |
0.677 |
0.6717 |
0.6744 |
SQL |
0.5653 |
0.5498 |
0.5699 |
0.5673 |
0.5699 |
0.5795 |
0.5756 |
0.5869 |
0.5749 |
0.5735 |
MSSQL |
0.156 |
0.110 |
0.143 |
0.170 |
0.126 |
0.156 |
0.126 |
0.143 |
0.140 |
0.126 |
第二轮测试——修改
查询用SQL语句(把能被5整除的数据修改为“测”,应该影响1000000行):
update tab set Context=Context where id%5=0 |
测试结果如下:
本来想批量修改数据的,更新100万行使用SQL语句用时基本在5.4——5.8秒之间,但是使用LINQ基本就挂了,5分钟都出不了结果,看来如果是批量修改,特别是大批量修改,还是尽量避免使用LINQ
现在就改变下测试思路,修改其中一条数据。
update tab set DoTime=dateadd(ms,1,DoTime) where id=2500000 |
测试结果如下:
单位:秒
第一次 |
第二次 |
第三次 |
第四次 |
第五次 |
第六次 |
第七次 |
第八次 |
第九次 |
第十次 |
|
Linq |
0.2068 |
0.2022 |
0.2029 |
0.2064 |
0.2055 |
0.2025 |
0.2067 |
0.2012 |
0.2058 |
0.2031 |
Sql |
0.1466 |
0.1425 |
0.1386 |
0.1419 |
0.1457 |
0.1388 |
0.142 |
0.1384 |
0.1388 |
0.1426 |
第三轮测试——插入
批量插入1万条数据
测试结果如下:
单位:秒
第一次 |
第二次 |
第三次 |
第四次 |
第五次 |
第六次 |
第七次 |
第八次 |
第九次 |
第十次 |
|
Linq |
9.4243 |
9.5757 |
9.2637 |
9.5913 |
9.5264 |
9.573 |
9.5606 |
9.5448 |
9.4261 |
9.7743 |
Sql |
8.7681 |
8.4239 |
7.9236 |
7.8332 |
7.8264 |
8.0614 |
7.997 |
7.979 |
7.888 |
8.2885 |
综上所述,LINQ这个新技术,在代码上和思想上的确很有优势,但是归根结底还是使用的是.net 2.0 的框架,只是抽象了一个接口而已,生成SQL语句的过程被LINQ完成,所以说LINQ即使到了极限也不能超越传统的SQL,另外据查资料,LINQ另一个瓶颈在于Lambda表达式。我们可以得出在效率要求不高的应用型系统中,使用LINQ还是很有优势的,毕竟代码少,维护方便,但是在修改操作上,特别是批量修改就毫无优势可言,效率低是一方面,内存在占用也是一个大问题,所以现在很多公司的做法就是两者混合起来用,不失为一个明智的选择。
试验用代码和文档:下载
关于LINQ和SQL操作数据库的性能测试(转)的更多相关文章
- sql操作数据库(1)-->DDL、DML、DQL
SQL 操作数据库 概念:结构化查询语言 Structured Quary Language 作用: 1.是一种数据库的查询的标准,对所有的数据库都支持 2.不同的数据库SQL语句可能有点不同 ( ...
- LINQ to SQL更新数据库操作(转载)
使用LINQ to SQL建模Northwind数据库 在这之前一起学过LINQ to SQL设计器的使用,下面就使用如下的数据模型: 当使用LINQ to SQL设计器设计以上定义的五个类(Prod ...
- [LINQ TO SQL]使用LINQ TO SQL创建数据库
这篇博客将介绍如何使用LINQ TO SQL来创建数据库,以及如何映射Table之间的主外键关系. 我们的数据库表关系如下: Province与City之间1:M,City与Area之间1:M的关系. ...
- MVC3+Linq to sql 显示数据库中数据表的数据
1:首先创建asp.net mvc3应用程序 2:创建项目完成后 找到controllers文件鼠标右击选择添加控制器 3 为models文件夹添加一个linq to sql类文件,然后把数据库中的数 ...
- LINQ TO SQL:操作有层次关系的对象
对于关系型数据与对象数据之间最大的隔阂就是由标识列连接起来的行(关系型数据)与由集合保存的对象(对象数据)之间的冲突. 例如某个Subject对象(也就是数据库中的Subject表),从Subject ...
- android: SQLite使用 SQL 操作数据库
虽然 Android 已经给我们提供了很多非常方便的 API 用于操作数据库,不过总会有一些 人不习惯去使用这些辅助性的方法,而是更加青睐于直接使用 SQL 来操作数据库.这种人 一般都是属于 SQL ...
- MVC linq To SQL更新数据库操作
首先在视图中提交数据,使用Html.BeginForm() @using(Html.BeginForm()) { @Html.EditorForModel() //编辑模板.控制器中传过来的数据 &l ...
- sql操作数据库(2)--->DQL、数据库备份和还原
查询 查询表中的所有的行和列的数据 select * from 表名; select * from student; 查询指定列的数据:如果有多个列,中间用逗号隔开. select 列名1,列 ...
- sql操作数据库(3)-->外键约束、数据库表之间的关系、三大范式、多表查询、事务
外键约束 在新表中添加外键约束语法: constraint 外键约束名称 foreign key(外键的字段名称) references 主表表名(主键字段名) 在已有表中添加外键约束:alter t ...
随机推荐
- PHP 从基础开始 ——重要知识点笔记
PHP static 关键词 通常,当函数完成/执行后,会删除所有变量.不过,有时我需要不删除某个局部变量.实现这一点需要更进一步的工作. 要完成这一点,请在您首次声明变量时使用 static 关键词 ...
- C/C++的64为长整型数的表示
在C/C++中,64为整型一直是一种没有确定规范的数据类型.现今主流的编译器中,对64为整型的支持也是标准不一,形态各异.一般来说,64位整型的定义方式有long long和__int64两种(VC还 ...
- (转载)Python 的 JPype 模块调用 Jar 包
Python 的 JPype 模块调用 Jar 包 背景与需求 最近学习并安装使用了HttpRunner框架去尝试做接口测试,并有后续在公司推广的打算. HttpRunner由Python开发,调用接 ...
- dtrace 相关资料
Here are some DTrace information sources: * [Oracle Wiki](https://wikis.oracle.com/display/DTrace/DT ...
- 网站性能工具-YSlow的23个规则-网站性能优化
1. 减少HTTP请求次数 合并图片.CSS.JS,改进首次访问用户等待时间. 2. 使用CDN 就近缓存==>智能路由==>负载均衡==>WSA全站动态加速 3. 避免空的src和 ...
- Revit API过滤元素类别(FamilySymbol与FamilyInstance)
仅OfCategory()过滤的元素包含系统FamilySymbolOfClass(typeof(FamilyInstance))过滤出来文档中族实例. ; ; ; ...
- 在ASP.NET MVC中使用Boostrap实现产品的展示、查询、排序、分页
在产品展示中,通常涉及产品的展示方式.查询.排序.分页,本篇就在ASP.NET MVC下,使用Boostrap来实现. 源码放在了GitHub: https://github.com/darrenji ...
- ASP.NET MVC异步验证是如何工作的03,jquery.validate.unobtrusive.js是如何工作的
在上一篇"ASP.NET MVC异步验证是如何工作的02,异步验证表单元素的创建"中了解了ASP.NET异步验证是如何创建表单元素的,本篇体验jquery.validate.uno ...
- Delphi 完全时尚手册之 Visual Style 篇 (界面不错) 转自http://blog.csdn.net/iseekcode/article/details/4733229
这里先说说两个概念:Theme(主题)和 Visual Style .Theme 最早出现在 Microsoft Plus! for Windows 95 中,是 Windows 中 Wallpape ...
- VirtualBox - NAT虚拟机访问外网 + Host-Only物理主机虚拟机互访
[root@localhost ~]# vi /etc/sysconfig/network-scripts/ifcfg-System_eth0 # 未手动设定HOST-ONLY静态IP时的默认值 #T ...