.net 在使用编译查询时,我们还需要存储过程吗?

.net 在使用编译查询时,我们还需要存储过程吗?,.net,sql-server,linq-to-sql,entity-framework,compiled-query,.net,Sql Server,Linq To Sql,Entity Framework,Compiled Query,当在实体框架(或linq to sql)中结合sql Server使用编译查询时,使用存储过程实际上还有什么性能优势吗 编译后的查询将作为参数化查询缓存,所以性能应该接近于存储过程。是否存在存储过程性能显著提高的情况 --编辑-- 作为对Yakimych下面回答的回应,我并不是想暗示编译后的查询与存储过程相同。我试图弄清楚,如果您已经在应用程序端完成了所有可能的优化(在本例中是编译查询),是否仍然需要存储过程。因此,我想我正在寻找存储过程比应用程序端优化和参数化查询(编译查询就是这样)的组合更好

当在实体框架(或linq to sql)中结合sql Server使用编译查询时,使用存储过程实际上还有什么性能优势吗

编译后的查询将作为参数化查询缓存,所以性能应该接近于存储过程。是否存在存储过程性能显著提高的情况

--编辑--


作为对Yakimych下面回答的回应,我并不是想暗示编译后的查询与存储过程相同。我试图弄清楚,如果您已经在应用程序端完成了所有可能的优化(在本例中是编译查询),是否仍然需要存储过程。因此,我想我正在寻找存储过程比应用程序端优化和参数化查询(编译查询就是这样)的组合更好的原因


我问这个问题的一个原因是,许多人似乎认为存储过程由于不同的原因(例如)不再是必需的。

首先,编译EF查询与使用存储过程可以获得的性能优势无关

根据-当对概念模型执行查询时,会发生以下操作:

  • 加载元数据
  • 打开数据库连接
  • 生成视图
  • 准备查询
  • 执行查询
  • 加载和验证类型
  • 追踪
  • 物化对象
以及有关准备查询的说明:

包括编写查询命令、基于模型和映射元数据生成命令树以及定义返回数据形状的成本。因为实体SQL查询命令是缓存的,所以以后执行同一查询所需的时间更少。您还可以在以后的执行中使用编译的LINQ查询来降低此成本

因此,如果您编译查询并在以后重新使用它,那么在每次后续查询执行期间,您可以在应用程序中节省此操作的时间。但是,您不会影响针对数据库执行的生成的SQL代码编译查询时获得的性能优势是在应用程序级别。

另一方面,如果您对生成的SQL代码不满意,并且希望在数据库级别优化性能,通常会使用存储过程

编辑以回应您的评论和编辑

在我看来,您的印象是编译EF查询将以某种方式更改针对数据库运行的生成的SQL代码(您提到编译的查询会导致参数化SQL查询?)。事实并非如此。无论您是直接运行查询还是使用
compiledQuery.Invoke
,都会对数据库运行相同的SQL代码。此外,您不能完全控制它,而是依赖ORM以最好的方式生成它。在某些情况下,这不是最优的,这就是SP的作用所在

综上所述:

  • 编译查询纯粹是一种工作 应用程序端优化。信息技术 节省编译查询的时间 在代码中得到重用
  • 存储过程可用于调整SQL代码,使其尽可能接近您的目标,从而提供在数据库级别获得最佳性能的可能性
一种技术决不能替代另一种技术

“是否存在存储过程性能显著提高的情况?”

给定在EF或存储过程中生成的一段可比较的参数化SQL,它们的性能将相同

然而,DBA总是有机会根据他们对DB模式及其使用模式的经验进一步优化查询。存储过程允许他们在与使用它的应用程序隔离的情况下轻松地完成这项工作,而ORM则不然


我们有一个极其复杂的SQL Server DB,它有许多外部系统通过触发器来复制数据。EF给我们带来的问题是,在使用任何ORM而不是DBA时,数据库中被激发的SQL的责任将成为应用程序开发人员的责任。

一些知名专家的固定答案:Paul Nielsen


Adam Machanic:

我不是想暗示编译后的查询与存储过程相同(这就是为什么我提到它们被缓存为参数化查询)。我的意思是,如果您的ORM生成参数化查询(EF或任何其他查询),是否还有任何理由使用存储过程。很抱歉,如果这不完全清楚,我将更新我的问题以澄清。编辑我的答案以回应您的评论和编辑。(希望我能正确地理解您)不,我认为编译EF查询根本不会改变生成的SQL代码。我知道编译查询与存储过程无关。关键是EF生成的查询(无论是否编译)将像存储过程一样在sql server中进行优化和缓存。如果您愿意,我正在寻找两种查询请求样式之间的比较:一方面是存储过程,另一方面是EF生成(编译)查询。如果您确实意识到编译和非编译查询都将像存储过程一样在sql server中优化和缓存,为什么这个问题与编译的查询有关?关于实际讨论-在一种情况下,EF将创建并运行参数化查询,在另一种情况下,将调用SP。如果两种情况下的SQL代码相同,则不会有任何显著的性能差异,在这种情况下,我同意