2010-02-03 49 views
1

我现在正在测试Linq性能,并且我无法弄清楚一段时间会浪费什么(MS-SQL Server 2005)。linq性能:linq vs t-sql - 时间到了哪里?

所以这里是我所拥有的:具有聚集索引和非聚集索引的单表,所有的搜索都是使用非聚集索引100%覆盖的列完成的。我有10 000条记录,所有操作都会逐个“触及”所有记录。而现在的时间:

T-SQL:

  • 检查,如果每个记录存在(IF EXISTS ...);是的,它的存在 - 0:30(30秒)
  • 更新每个记录 - 1:16

LINQ:

  • 获取单个记录(的SingleOrDefault) - 5: 58
  • 更新每个记录(它包含的读取部) - 9点34分

好的,检查存在实际上不是当量的1- inq和T-SQL,但真正困扰我的是事实:

LINQ(fetch)+TSQL(update) < LINQ(update) 

另请注意,实际更新部分比单独提取更快!

LINQ中的更新已经优化为使用主(集群)索引而不是整个表(WHERE子句)。

那么,2分钟去哪?

编辑

当回答,请回答这个问题,为什么LINQ和TSQL之间的这种差异。请不要讨论如下主题:TSQL适用于集合,您应该批量执行(所有记录一次),您应该使TSQL更快。谢谢。

EDIT2:

表的结构是很容易的: ID(PK),姓名(INT,外部指数),位字段+ 40场或者像这样

要专注于特定的查询我运行这样的循环:

declare @i int; 
declare @nr int; 
declare @p1 bit; 
declare @p0 int; 

set @i = 0; 
set @nr = 1000000000; 

while @i<10000 
begin 
    select @p0=id,@p1=bit_field from test_mono where [email protected]; 
    set @p1 = 1- @p1; 
    update test_mono set [email protected] where [email protected]; 
    set @i = @i+1; 
    set @nr = @nr-1; 
end 

到一个小注释:这里bit_field成为我作为保证的东西将是肯定的修改。上下移动的计数器来自实际数据,我必须确保每次选择我都会得到一个记录。最后一个 - 与LINQ的唯一区别是SELECT,我获取所有字段(UPDATE被复制&粘贴)。不过,我可以花时间LINQ SELECT并将其添加到(TSQL的)这个时间,我应该得到LINQ SELECT + UPDATE。但我没有这样的时间。

与之前的编辑我描述了一个不同的结构,原因是我尽量做到这一点尽可能清晰。我不喜欢自己真实案例的实例,所以我会尽量让读者更容易;-)

+0

你看过LINQ(使用DataContext.Log)生成的SQL,然后尝试运行该查询分析器? – 2010-02-03 15:20:33

+0

我假设Linq你真的认为Linq to SQL? – 2010-02-03 15:21:20

+0

开销,LINQ必须使用可以独立运行的相同SQL命令访问数据库。给10,000次操作添加一小部分秒数,并将它加起来 – 2010-02-03 15:22:29

回答

1

您可能会从使用工具(如LINQPad)开始,查看实际的SQL查询的内容由LINQ执行。我个人认为这是一次又一次,所以我倾向于当性能是我留在TSQL中的首要任务时。

很可能生成的SQL有一些奇怪的地方。尽管我们需要获得更多信息,但您需要了解您可能与之合作的内容。

+0

谢谢你的链接,我试过了,但是我没有看到任何特别的地方。我可以自己转储LINQ-> SQL,它不显示SQL执行计划,所以它的功能相当有限(与LINQ代码+日志相比)。 – greenoldman 2010-02-04 09:50:30