linq性能:linq vs t-sql - 时间到了哪里?

时间:2010-02-03 15:13:08

标签: sql linq performance

我正在测试Linq性能,我无法弄清楚浪费了多长时间(MS-SQL Server 2005)。

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

T-SQL:

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

LINQ:

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

好的,检查存在实际上并不等同于Linq和T-SQL,但真正困扰我的是事实:

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

另请注意,真正的更新部分比单独获取更快!

LINQ中的更新已经过优化,可以使用主(聚簇)索引而不是整个表(WHERE子句)。

那么,2分钟的去哪儿了?

修改

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

EDIT2:

表的结构非常简单: id(PK),Name(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 name=@nr;
  set @p1 = 1- @p1;
  update test_mono set bit_field=@p1 where id=@p0;
  set @i = @i+1;
  set @nr = @nr-1;
end

对此有点评论:bit_field在这里为我提供了确保某些东西可以修改的保证。上下的计数器来自真实数据,我必须确保每次选择我得到一条记录。最后一个 - 与LINQ唯一不同的是SELECT,我获取所有字段(UPDATE被复制和粘贴)。但是我可以花时间LINQ SELECT并将它添加到这个时间(TSQL),我应该得到LINQ SELECT + UPDATE。但我没有得到这样的时间。

通过之前的编辑,我描述了一个不同的结构,原因是我尽量使其尽可能清晰。我自己并不喜欢真实案例的例子,所以我会尽量让读者容易上手; - )

1 个答案:

答案 0 :(得分:1)

您可以先使用LINQPad之类的工具来查看LINQ正在执行的实际SQL查询。

就个人而言,我已经一次又一次地看到了这一点,因此我倾向于将性能作为TSQL的首要任务。

生成的SQL很可能有一些奇怪之处。我们需要获得有关您的查询性质的更多信息,以了解您可能正在使用的内容。