微软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 可以停止测量运行时间。通过属性 ElapsedElapsedMilliseconds 或 ElapsedTicks 查询运行时间值。当实例正在运行或已停止时,可以查询运行时间属性。运行时间属性在 Stopwatch运行期间稳固递增;在该实例停止时保持不变。

默认情况下,Stopwatch 实例的运行时间值相当于所有测量的时间间隔的总和。每次调用 Start 时开始累计运行时间计数;每次调用 Stop 时结束当前时间间隔测量,并冻结累计运行时间值。使用 Reset 方法可以清除现有 Stopwatch 实例中的累计运行时间。

Stopwatch 在基础计时器机制中对计时器的刻度进行计数,从而测量运行时间。如果安装的硬件和操作系统支持高分辨率性能的计数器,则 Stopwatch 类将使用该计数器来测量运行时间;否则,Stopwatch 类将使用系统计数器来测量运行时间。使用 Frequency 和 IsHighResolution 字段可以确定实现 Stopwatch 计时的精度和分辨率。

Stopwatch 类为托管代码内与计时有关的性能计数器的操作提供帮助。具体说来,Frequency 字段和 GetTimestamp 方法可以用于替换非托管 Win32 APIQueryPerformanceFrequency 和 QueryPerformanceCounter

注意:

在多处理器计算机上,线程在哪个处理器上运行无关紧要。但是,由于 BIOS 或硬件抽象层 (HAL) 中的 bug,在不同的处理器上可能会得出不同的计时结果。若要为线程指定处理器关联,请使用 ProcessThread..::.ProcessorAffinity 方法。

测试前准备:

新建一个数据库: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操作数据库的性能测试(转)的更多相关文章

  1. sql操作数据库(1)-->DDL、DML、DQL

    SQL 操作数据库 概念:结构化查询语言 Structured Quary Language 作用:  1.是一种数据库的查询的标准,对所有的数据库都支持  2.不同的数据库SQL语句可能有点不同 ( ...

  2. LINQ to SQL更新数据库操作(转载)

    使用LINQ to SQL建模Northwind数据库 在这之前一起学过LINQ to SQL设计器的使用,下面就使用如下的数据模型: 当使用LINQ to SQL设计器设计以上定义的五个类(Prod ...

  3. [LINQ TO SQL]使用LINQ TO SQL创建数据库

    这篇博客将介绍如何使用LINQ TO SQL来创建数据库,以及如何映射Table之间的主外键关系. 我们的数据库表关系如下: Province与City之间1:M,City与Area之间1:M的关系. ...

  4. MVC3+Linq to sql 显示数据库中数据表的数据

    1:首先创建asp.net mvc3应用程序 2:创建项目完成后 找到controllers文件鼠标右击选择添加控制器 3 为models文件夹添加一个linq to sql类文件,然后把数据库中的数 ...

  5. LINQ TO SQL:操作有层次关系的对象

    对于关系型数据与对象数据之间最大的隔阂就是由标识列连接起来的行(关系型数据)与由集合保存的对象(对象数据)之间的冲突. 例如某个Subject对象(也就是数据库中的Subject表),从Subject ...

  6. android: SQLite使用 SQL 操作数据库

    虽然 Android 已经给我们提供了很多非常方便的 API 用于操作数据库,不过总会有一些 人不习惯去使用这些辅助性的方法,而是更加青睐于直接使用 SQL 来操作数据库.这种人 一般都是属于 SQL ...

  7. MVC linq To SQL更新数据库操作

    首先在视图中提交数据,使用Html.BeginForm() @using(Html.BeginForm()) { @Html.EditorForModel() //编辑模板.控制器中传过来的数据 &l ...

  8. sql操作数据库(2)--->DQL、数据库备份和还原

    查询 查询表中的所有的行和列的数据 ​ select * from 表名; ​ select * from student; 查询指定列的数据:如果有多个列,中间用逗号隔开. select 列名1,列 ...

  9. sql操作数据库(3)-->外键约束、数据库表之间的关系、三大范式、多表查询、事务

    外键约束 在新表中添加外键约束语法: constraint 外键约束名称 foreign key(外键的字段名称) references 主表表名(主键字段名) 在已有表中添加外键约束:alter t ...

随机推荐

  1. BZOJ2671 : Calc

    设$d=\gcd(a,b),a=xd,b=yd$,则$a+b|ab$等价于$x+y|xyd$. 因为$x,y$互质,所以$x+y|d$. 假设$x<y$,那么对于固定的$x,y$,有$\lflo ...

  2. 洛谷P4141消失之物

    题目描述 ftiasch 有 N 个物品, 体积分别是 W1, W2, …, WN. 由于她的疏忽, 第 i 个物品丢失了. “要使用剩下的 N – 1 物品装满容积为 x 的背包,有几种方法呢?” ...

  3. Intel Code Challenge Final Round (Div. 1 + Div. 2, Combined) A. Checking the Calendar 水题

    A. Checking the Calendar 题目连接: http://codeforces.com/contest/724/problem/A Description You are given ...

  4. hdu 5773 The All-purpose Zero 线段树 dp

    The All-purpose Zero 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5773 Description ?? gets an seq ...

  5. URAL 1970 J - 皇后像廣場 dfs

    J - 皇后像廣場 题目连接: http://acm.hust.edu.cn/vjudge/contest/123332#problem/J Description Vova was walking ...

  6. OPTIMIZE TABLE ipc_analysisdatasyn, ipc_analysisdatatkv,ipc_autoupdateset, ipc_equipmentwaring,ipc_fguid, ipc_receivedata, ipc_senddata, tb_qualitativeanalysis, tb_quantifyresult, tb_quantifyresulthis

    OPTIMIZE TABLE ipc_analysisdatasyn, ipc_analysisdatatkv,ipc_autoupdateset, ipc_equipmentwaring,ipc_f ...

  7. 多个RS-485设备怎么连接到一台电脑上?可以设置地址,有协议

    计算机都是RS232的,所以要给计算机串口配一个232/485转换器,然后给所有485设备设置一个地址. 计算机用查询方式,根据设备地址查询指定设备. 比如,计算机发送5个自节 01 03 04 FF ...

  8. 标记 {x:Null},d:DesignWidth,d:DesignHeight

    {x:Null}:用于设置某属性值为Null,比如<Rectangle Fill="{x:Null}" />,其实就相当于<Rectangle />,个人感 ...

  9. Quartz:不要重复造轮子,一款企业级任务调度框架。

    背景 第一次遇到定时执行某些任务的需求时,很多朋友可能设计了一个小类库,这个类图提高了一个接口,然后由调度器调度所有注册的接口类型,我就是其中之一,随着接触的开源项目越来越多,我的某些开发习惯受到了影 ...

  10. skb的两个函数pskb_copy和skb_copy

    转自:http://blog.csdn.net/farmwang/article/details/54235252 skb的两个函数pskb_copy和skb_copy 前者仅仅是将sk_buff的结 ...