【发布时间】:2014-11-04 04:45:00
【问题描述】:
我正在使用 SQL Server 2005 数据库并且我的应用程序在 ASP.NET MVC4 中。 应用程序的业务逻辑有点复杂,包含多个表连接和搜索条件。在极端条件下,我需要加入大约 10 个表来获取单个网格所需的数据。 我想知道是否应该使用 SP 或 Linq to SQL 应用程序代码来最大化我的应用程序性能。
【问题讨论】:
标签: c# asp.net sql-server linq
我正在使用 SQL Server 2005 数据库并且我的应用程序在 ASP.NET MVC4 中。 应用程序的业务逻辑有点复杂,包含多个表连接和搜索条件。在极端条件下,我需要加入大约 10 个表来获取单个网格所需的数据。 我想知道是否应该使用 SP 或 Linq to SQL 应用程序代码来最大化我的应用程序性能。
【问题讨论】:
标签: c# asp.net sql-server linq
SQL Server 基本上通过这些步骤来执行任何查询(存储过程调用或即席 SQL 语句):
重点是:即席 SQL 和存储过程的处理方式没有区别。
如果 ad-hoc SQL 查询正确使用 参数 - 无论如何都应该使用,以防止 SQL 注入攻击 - 它的性能特征没有什么不同,而且绝对是 不比执行存储过程差。
存储过程还有其他好处(例如,无需授予用户直接表访问权限),但就性能而言,使用适当参数化的即席 SQL 查询与使用存储过程一样高效程序。
更新:在非参数化查询上使用存储过程更好,主要有两个原因:
由于每个非参数化查询都是对 SQL Server 的新的、不同的查询,因此对于每个查询,它都必须经过确定执行计划的所有步骤(因此浪费时间- 并且还浪费计划缓存空间,因为将执行计划存储到计划缓存中最终并没有真正的帮助,因为该特定查询可能不会再次执行)
非参数化查询存在 SQL 注入攻击的风险,应不惜一切代价避免
【讨论】:
.AddWithValue 将很少使用缓存。
您通常会发现存储过程的性能更快,因为存储过程会尽可能重用执行计划。 Linq 查询本质上变成了针对数据库的即席查询,没有缓存的情况下每次都作为新请求进行处理。
【讨论】: