Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net LINQ查询相对于SQL等价物的性能_.net_Sql_Linq_Performance - Fatal编程技术网

.net LINQ查询相对于SQL等价物的性能

.net LINQ查询相对于SQL等价物的性能,.net,sql,linq,performance,.net,Sql,Linq,Performance,我目前正在与工作人员就LINQ查询相对于SQL等价物的性能进行辩论 有人做过/看到过这方面的科学测试吗 如果不是的话,关于出于性能原因必须用SQL查询替换LINQ的轶事证据将帮助我说明问题。LINQ与LINQ2SQL或EF一样,需要有一个关于如何将LINQ查询转换为SQL的通用规则集,并由此引入一个抽象级别。这种抽象有时会导致语句不是最优的。手工编写SQL语句可以根据具体情况进行调整。 这导致了这样一个结论,即SQL的速度更有可能更快,特别是在复杂的场景中。但这并不意味着每个LINQ查询都比它的

我目前正在与工作人员就LINQ查询相对于SQL等价物的性能进行辩论

有人做过/看到过这方面的科学测试吗


如果不是的话,关于出于性能原因必须用SQL查询替换LINQ的轶事证据将帮助我说明问题。

LINQ与LINQ2SQL或EF一样,需要有一个关于如何将LINQ查询转换为SQL的通用规则集,并由此引入一个抽象级别。这种抽象有时会导致语句不是最优的。手工编写SQL语句可以根据具体情况进行调整。
这导致了这样一个结论,即SQL的速度更有可能更快,特别是在复杂的场景中。但这并不意味着每个LINQ查询都比它的SQL等价查询慢。

我使用EF 1和Oracle的经验支持这一点。

SQL查询更好的一个更明显的例子是更新/删除批处理。LINQtoSQL中没有内置的工具来处理多个更新或删除,只是逐个处理记录,从而为每个记录生成单独的查询

var myRecords = myContext.Books.Where(b => b.Author = "Bob");
foreach (var rec in myRecords)
    myContext.Books.DeleteOnSubmit(rec);
myContext.SubmitChanges()  // generates delete statement for each record.

在一般情况下,LINQ经过优化以生成非常高效的查询,有时甚至可以生成比使用SQL编写查询的直观方式更好的查询。但是,总会有例外情况,LINQ to SQL语句的效率不如可以手动编写的SQL查询。

运行LINQ查询时,LINQ会生成T-SQL代码来执行查询。您可以运行SQL Server探查器来了解查询的外观。我以前做过,生成的T-SQL看起来非常干净


我不能直接谈论性能,因为我没有运行任何数字,但我看到的一件事是,除非在LINQ查询中使用表中的rowversion列,否则表中的每一列都将包含在WHERE子句中,这是LINQ内置的乐观并发检查的一部分。使用rowversion列允许LINQ仅使用该列进行此检查,从而使T-SQL更干净、更高效。

请检查其他问题:


在我看来,linq在几乎所有方面都可以使用。在一些罕见的情况下,如果您非常擅长sql,并且确实想提高性能,那么就改用原始sql;当(使用我们的)评测时,我们注意到LINQ(在本例中为SQL)正在为基本查询生成TSQL,并且操作在DB服务器上运行得非常快(0.5ms等)——但是,实际的查询操作需要更长的时间(在某些情况下,对于相同的0.5ms查询,类似于20ms+)。那么时间在哪里?你可能会想“查询翻译”,但不是;我们还有很多
ExecuteQuery
代码(即手工编写TSQL的代码),这与做的事情完全相同。事实证明,在物化器和身份图之间的某个地方,大量的时间被浪费了

所以,;我们编写了自己的materializer,它几乎可以替代
ExecuteQuery
——因此诞生了

在LINQ方面,它通常可以为简单的查询生成TSQL,但对于任何复杂的查询,我通常更信任手工编码的TSQL。以一个案例为例,我有一个复杂的查询,涉及组、跳过和执行。它的表现并不好。当我用ROW_NUMBER()等手工编写时,同样的结果占用了“统计IO”和总时间的4%


我目前对LINQ的看法是ORM工具使数据变异变得轻而易举,但对于查询我倾向于使用简洁。这很讽刺,因为LINQ中的Q是“查询”。

LinqToSql是ADO.Net之上的一个层。因此,如果在Sql查询中使用ADO.Net,您将比LinqToSql“更快”(不做LinqToSql所做的额外工作)

对于.Net和机器代码,也可以使用相同的参数(当性能是唯一标准时)。NETIL最终会被JIT'ed到机器上,如果您刚开始编写机器,您会更快

这里有几个重要的场景:

  • 如果您的查询是低IO的,并返回大量数据进行具体化,那么LinqToSql将比原始sql花费更多的时间。另一方面,最终得到的是客户实例而不是数据行
  • 如果您的查询是高度动态的,这样您就永远不会两次发布同一个sql文本,那么您总是会产生查询转换成本。Sql查询将更快(尤其是如果不计算Sql文本的构造)
以下是几个不重要的场景:

  • 如果您的查询需要大量的数据库IO(报表样式),那么您不会注意到LinqToSql抽象的额外客户端CPU开销

  • 如果您的查询是重复的(相同的查询具有不同的参数),那么使用CompiledQuery可以降低LinqToSql抽象的大部分成本 一般来说,根据我的经验,EF4.1或LINQtoSQL的问题不是LINQ,而是编码器

    开发人员通常不知道如何编写高效的查询代码,也不知道如何编写高效且可扩展的数据库访问代码(即,他们很懂VB或C#,但不懂SQL),这体现在他们如何构造查询中。在这一点上,他们是否使用LINQ并不重要

    当应用程序在开发中工作正常(dev数据库有100000行数据),但在生产中表现不佳(数百万行数据)时,这一点才真正表现出来。开发人员立即指出,它在开发过程中运行良好,所以一定是数据库出了问题,而不是他们的代码出了问题。开发人员和DBA之间的战争就是这样开始的

    虽然我真的很喜欢林克,但你通常会觉得莫夫更好