我现在正在测试Linq的性能,我不知道什么是浪费了一段时间(MS 2005)。
这就是我所拥有的:单表包含聚集索引和非聚集索引,所有搜索都使用100%由非聚集索引覆盖的列完成。我有1万份记录,所有的操作都一个接一个地“触及”所有记录。现在泰晤士报:
T:
LINQ:
好的,检查是否存在并不是真正等效的Linq和T,但真正困扰我的是以下事实:
LINQ(fetch)+TSQL(update) < LINQ(update)还请注意,真正的更新部分比单独抓取更快!
LINQ中的更新已经优化为使用主(聚集)索引,而不是整个表(WHERE子句)。
那两分钟去哪了?
编辑
在回答时,请回答以下问题: 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,唯一的区别是选择,我获取所有字段(更新被复制和粘贴)。不过,我可以花时间对LINQ并将它添加到这个时候(对于SELECT+UPDATE ),并且我应该得到LINQ。但我没有这么多时间。
在之前的编辑中,我描述了一些不同的结构,原因是我试图尽可能清楚地说明这一点。我自己不喜欢真实案例的例子,所以我会尽量让读者更容易;-)
发布于 2010-02-03 15:19:54
首先,您可以使用像LINQPad这样的工具来查看LINQ正在执行什么实际的SQL查询。
不过,就我个人而言,我已经一次又一次地看到了这一点,因此,我倾向于在性能是TSQL的最高优先级时使用TSQL。
生成的SQL很可能有一些奇怪之处。我们需要获得更多关于查询性质的信息,以了解您可能使用的内容。
https://stackoverflow.com/questions/2192934
复制相似问题