我正在测试Linq性能,我无法弄清楚浪费了多长时间(MS-SQL Server 2005)。
所以这就是我所拥有的:具有聚簇索引和非聚簇索引的单个表,所有搜索都是使用非聚集索引100%覆盖的列完成的。我有10 000条记录,所有操作都“逐一”触及所有记录。现在是时候了:
T-SQL:
LINQ:
好的,检查存在实际上并不等同于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。但我没有得到这样的时间。
通过之前的编辑,我描述了一个不同的结构,原因是我尽量使其尽可能清晰。我自己并不喜欢真实案例的例子,所以我会尽量让读者容易上手; - )
答案 0 :(得分:1)
您可以先使用LINQPad之类的工具来查看LINQ正在执行的实际SQL查询。
就个人而言,我已经一次又一次地看到了这一点,因此我倾向于将性能作为TSQL的首要任务。
生成的SQL很可能有一些奇怪之处。我们需要获得有关您的查询性质的更多信息,以了解您可能正在使用的内容。