Linq与SQL和存储过程在性能方面的比较

本文关键字:性能 方面 比较 存储过程 SQL Linq | 更新日期: 2023-09-27 18:28:55

我使用的是SQL Server 2005数据库,我的应用程序位于ASP.NET MVC4中。应用程序的业务逻辑有点复杂,包含多个表联接和搜索条件。在极端情况下,我需要连接大约10个表来获取单个网格所需的数据。我想知道我是应该使用SP还是使用Linq-to-SQL应用程序代码来最大限度地提高我的应用程序性能。

Linq与SQL和存储过程在性能方面的比较

SQL Server基本上通过以下步骤来执行任何查询(存储过程调用或特殊SQL语句):

  1. 语法检查查询
  2. 如果可以,它会检查计划缓存,看看它是否已经有了该查询的执行计划
  3. 如果有执行计划,则(重新)使用该计划并执行查询
  4. 如果还没有计划,则确定执行计划
  5. 该计划存储在计划缓存中,以便以后重用
  6. 执行查询

重点是:特设SQL和存储过程的处理方式没有区别。

如果一个特定的SQL查询正确地使用了参数(无论如何,为了防止SQL注入攻击),那么它的性能特征是没有什么不同,最明显的是,不会比执行存储过程差

存储过程还有其他好处(例如,无需授予用户直接表访问权限),但就性能而言,使用参数化适当的ad-hoc SQL查询与使用存储过程一样高效。

更新:非参数化查询上使用存储过程更好,主要有两个原因:

  • 由于每个非参数化查询对SQL Server来说都是一个新的、不同的查询,因此它必须经历确定执行计划的所有步骤,对于每个查询(因此浪费时间,也浪费计划缓存空间,因为将执行计划存储到计划缓存中最终并没有真正的帮助,因为该特定查询可能不会被再次执行)

  • 非参数化查询有SQL注入攻击的风险,应该不惜一切代价避免

您通常会发现存储过程的性能更快,因为存储过程会在可能的情况下重用执行计划。Linq查询本质上是针对数据库的特别查询,每次都作为新请求进行处理,而无需缓存。