.net 在使用编译查询时,我们还需要存储过程吗?
当在实体框架(或linq to sql)中结合sql Server使用编译查询时,使用存储过程实际上还有什么性能优势吗 编译后的查询将作为参数化查询缓存,所以性能应该接近于存储过程。是否存在存储过程性能显著提高的情况 --编辑--.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下面回答的回应,我并不是想暗示编译后的查询与存储过程相同。我试图弄清楚,如果您已经在应用程序端完成了所有可能的优化(在本例中是编译查询),是否仍然需要存储过程。因此,我想我正在寻找存储过程比应用程序端优化和参数化查询(编译查询就是这样)的组合更好
作为对Yakimych下面回答的回应,我并不是想暗示编译后的查询与存储过程相同。我试图弄清楚,如果您已经在应用程序端完成了所有可能的优化(在本例中是编译查询),是否仍然需要存储过程。因此,我想我正在寻找存储过程比应用程序端优化和参数化查询(编译查询就是这样)的组合更好的原因
我问这个问题的一个原因是,许多人似乎认为存储过程由于不同的原因(例如)不再是必需的。首先,编译EF查询与使用存储过程可以获得的性能优势无关 根据-当对概念模型执行查询时,会发生以下操作:
- 加载元数据
- 打开数据库连接
- 生成视图
- 准备查询
- 执行查询
- 加载和验证类型
- 追踪
- 物化对象
compiledQuery.Invoke
,都会对数据库运行相同的SQL代码。此外,您不能完全控制它,而是依赖ORM以最好的方式生成它。在某些情况下,这不是最优的,这就是SP的作用所在
综上所述:
- 编译查询纯粹是一种工作 应用程序端优化。信息技术 节省编译查询的时间 在代码中得到重用
- 存储过程可用于调整SQL代码,使其尽可能接近您的目标,从而提供在数据库级别获得最佳性能的可能性
我们有一个极其复杂的SQL Server DB,它有许多外部系统通过触发器来复制数据。EF给我们带来的问题是,在使用任何ORM而不是DBA时,数据库中被激发的SQL的责任将成为应用程序开发人员的责任。一些知名专家的固定答案:Paul Nielsen
Adam Machanic:我不是想暗示编译后的查询与存储过程相同(这就是为什么我提到它们被缓存为参数化查询)。我的意思是,如果您的ORM生成参数化查询(EF或任何其他查询),是否还有任何理由使用存储过程。很抱歉,如果这不完全清楚,我将更新我的问题以澄清。编辑我的答案以回应您的评论和编辑。(希望我能正确地理解您)不,我认为编译EF查询根本不会改变生成的SQL代码。我知道编译查询与存储过程无关。关键是EF生成的查询(无论是否编译)将像存储过程一样在sql server中进行优化和缓存。如果您愿意,我正在寻找两种查询请求样式之间的比较:一方面是存储过程,另一方面是EF生成(编译)查询。如果您确实意识到编译和非编译查询都将像存储过程一样在sql server中优化和缓存,为什么这个问题与编译的查询有关?关于实际讨论-在一种情况下,EF将创建并运行参数化查询,在另一种情况下,将调用SP。如果两种情况下的SQL代码相同,则不会有任何显著的性能差异,在这种情况下,我同意