首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >linq性能: linq对time -时间到哪里去了?

linq性能: linq对time -时间到哪里去了?
EN

Stack Overflow用户
提问于 2010-02-03 15:13:08
回答 1查看 1.2K关注 0票数 1

我现在正在测试Linq的性能,我不知道什么是浪费了一段时间(MS 2005)。

这就是我所拥有的:单表包含聚集索引和非聚集索引,所有搜索都使用100%由非聚集索引覆盖的列完成。我有1万份记录,所有的操作都一个接一个地“触及”所有记录。现在泰晤士报:

T:

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

LINQ:

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

好的,检查是否存在并不是真正等效的Linq和T,但真正困扰我的是以下事实:

代码语言:javascript
复制
LINQ(fetch)+TSQL(update) < LINQ(update)

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

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

那两分钟去哪了?

编辑

在回答时,请回答以下问题: LINQ和TSQL之间为什么会有这样的区别?请不要讨论这样的主题: TSQL是用于集合的,您应该在一个批处理中完成它(所有记录一次),您应该使TSQL更快。谢谢。

edit2:

表的结构非常简单: id (PK)、Name (int、外部索引)、位字段+40个字段或类似的内容

为了关注特定的查询,我运行了这样的循环:

代码语言:javascript
复制
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,唯一的区别是选择,我获取所有字段(更新被复制和粘贴)。不过,我可以花时间对LINQ并将它添加到这个时候(对于SELECT+UPDATE ),并且我应该得到LINQ。但我没有这么多时间。

在之前的编辑中,我描述了一些不同的结构,原因是我试图尽可能清楚地说明这一点。我自己不喜欢真实案例的例子,所以我会尽量让读者更容易;-)

EN

回答 1

Stack Overflow用户

发布于 2010-02-03 15:19:54

首先,您可以使用像LINQPad这样的工具来查看LINQ正在执行什么实际的SQL查询。

不过,就我个人而言,我已经一次又一次地看到了这一点,因此,我倾向于在性能是TSQL的最高优先级时使用TSQL。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2192934

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档