Linq to SQL的Select性能测试

前几天看到neuhawk 的文章linq to sql 的动态条件查询方法,文章最后选取了Ricom关于Linq to SQL的性能分析,里面说道Linq to SQL性能不错,有时候比ADO.NET还要好,当时觉得这分析结果难以让 人相信,应该Linq to SQL底层还是用ADO.NET 2.0实现的,即使效率再高也应该不能超越。加上最近几天 在MSDN论坛上看到有些人质疑Linq to SQL的效率,所以我做了一个很简单的测试,测试Linq to SQL的 select性能。

以Northwind数据库为例,对Product表进行查询(我增加了里面的数据,增加到3000条),只选取 ProductID和ProductName,进行3000次查询,每次查询一条记录。首先看看使用SqlDataReader的代码:

 Stopwatch watch = new Stopwatch();
  watch.Start();

  using (SqlConnection conn = new SqlConnection("Data Source=.;Initial  Catalog=Northwind;Integrated Security=True"))
  {
    if (conn.State != System.Data.ConnectionState.Open)
      conn.Open();
    for (int i = 1; i <= 3000; i++)
    {
      SqlCommand cmd = new SqlCommand(
        "SELECT ProductID,ProductName FROM Products WHERE ProductID=" + i.ToString(),  conn);
      cmd.CommandType = System.Data.CommandType.Text;
      using (SqlDataReader reader = cmd.ExecuteReader())
      {
        if (reader.Read())
        {
          Product p = new Product();
          p.ProductID = (int)reader["ProductID"];
          p.ProductName = (string)reader["ProductName"];
        }
      }

    }
  }

  watch.Stop();
  Console.WriteLine("[Using SqlReader] total time: " + watch.Elapsed.ToString ());

这里的Product是用Linq to SQL Designer自动生成的,只有ProductID和ProductName属性。运行 的结果如下:

[Using SqlReader] total time: 00:00:00.6521155

时间: 2024-10-23 11:06:07

Linq to SQL的Select性能测试的相关文章

LINQ体验(5)——LINQ to SQL语句之Select/Distinct和Count/Sum/Min/Max/Avg

上一篇讲述了LINQ,顺便说了一下Where操作,这篇开始我们继续说LINQ to SQL语句,目的让大家从语句的角度了解LINQ,LINQ包括LINQ to Objects.LINQ to DataSets.LINQ to SQL.LINQ to Entities.LINQ to XML,但是相对来说LINQ to SQL在我们程序中使用最多,毕竟所 有的数据都要在数据库运行着各种操作.所以先来学习LINQ to SQL,其它的都差不多了,那么就从Select说起吧,这个在编写程序中也最为常

使用LINQ to SQL更新数据库(下):性能测试

在上一篇随笔中,我们列举了使用LINQ to SQL对数据库进行更新的5中方案.本文将对这几种方案进 行测试和对比,力求找出一个最佳实践. 准备工作 我们的测试还是基于Products表.为了使测试更符合实际,我们将与之关联的Categories.Suplliers 和Order_Details表都添加进来.首先创建一个IProductRepository接口,定义插入.查找.更新操作: public interface IProductRepository { void InsertProdu

Linq to SQL对象的增删改

你的程序里,是否到处充斥着这种代码: db.Customers.InsertOnSubmit(customer); db.SubmitChange(); 如果某一天,因为 Customers 表的数据库巨增,需要把它拆成两个表,你是否会胆寒???当然,对于查询,我们可以通过视图来解决.对于插入,或者更新呢?据说,现在的数据库在某些情况下,可以对视图进行数据的更新.插入.但是我们要考虑的是不可以的情况.是不是得每个地方都改呀?对于一个大型的项目,这种改动是很可怕的,某个地方少改了,就糟糕了.不过,

Linq to SQL对象的标识

很多朋友都向我提过,希望我写一下关于Linq to SQL 或者 VS 插件方面的文章.尽管市面上有很多 Linq to SQL 的书籍,但是都是介绍怎么用,缺乏深度.关于 VS 插件方面的书籍也是很显浅,按书籍做出来的东西,只能是学生级别的东西,根本拿不出手.他们觉得我有这个能力写好. 从技术能力的角度来说,的确是不存在什么问题,但是,要把一门技术讲精讲透,是花很时间的事情.自己付出了很多,如果不能得到读者的认同,那这个专题写下去也没什么意义了.这个专题不是教你怎么使用Linq to SQL,

LINQ to SQL的执行可能无法复用查询计划

查询计划 Sql Server在执行一条查询语句之前都对对它进行"编译 "并生成"查询计划",查询计划告诉Sql Server的查询引擎 应该用什么方式进行工作.Sql Server会根据当前它可以收集到的各种信息(例 如内存大小,索引的统计等等)把一条查询语句编译成它认为"最优 "的查询计划.很显然,得到这样一个查询计划需要消耗CPU资源,而大部 分的查询语句每次经过编译所得到的查询计划往往是相同的,因此除非指定了 RECOMPILE选项,Sq

在Linq to Sql中管理并发更新时的冲突(1) 预备知识

无论与目前的ORM框架相比有没有优势,Linq to Sql在语言和平台的级别上 为我们提供了一种新的操作对象和数据的方式,在一定程度上为我们解决了 Object != Data的问题.在实际应用中,对于数据库的操作往往有着天生的并发 性,因此在更新数据时可能会产生冲突.有些时候,如果没有合理的解决冲突问 题,轻则让用户摸不着头脑,重则让系统数据处于一种不一致的状态.Linq to Sql自然考虑到了这一点,本系列讨论的内容,就是在使用Linq to Sql时,如何 管理并发更新时产生的冲突.

在LINQ to SQL中使用Translate方法以及修改查询用SQL

目前LINQ to SQL的资料不多--老赵的意思是,目前能找到的资 料都难以摆脱"官方用法"的"阴影".LINQ to SQL最 权威的资料自然是MSDN,但是MSDN中的文档说明和实例总是显得"大开大 阖",依旧有清晰的"官方"烙印--这简直是一 定的.不过从按照过往的经验,在某些时候如果不按照微软划定的道道来走,可 能就会发现别样的风景.老赵在最近的项目中使用了LINQ to SQL作为数据层的基础,在LINQ to S

LINQ to SQL公共基类

备注:本文的源代码例子,使用的数据库为SQL Server 2005下的Northwind示范数据库,同时为相关表建立了TimeStamp列. LINQ是Visual Studio 2008中提供的一系列新特性,用以扩展C#或者Visual Basic语言,提供了强有力的查询能力.作为LINQ的组成部分,LINQ to SQL提供了将关系数据作为对象处理的运行时架构.从某种程度上说,它相当于是微软提供的类似于NHibernate和Castle之类的ORM工具或框架.当我们需要对数据库进行访问时,

LINQ to SQL语句(23)之动态查询

动态查询 有这样一个场景:应用程序可能会提供一个用户界面,用 户可以使用该用户界面指定一个或多个谓词来筛选数据.这种情况在编译时不知 道查询的细节,动态查询将十分有用. 在LINQ中,Lambda表达式是许多 标准查询运算符的基础,编译器创建lambda表达式以捕获基础查询方法(例如 Where.Select.Order By.Take While 以及其他方法)中定义的计算.表达式 目录树用于针对数据源的结构化查询,这些数据源实现IQueryable<T>. 例如,LINQ to SQL 提