行插入哪个更快:SQL Server存储过程或C#服务器端代码?

时间:2016-03-27 19:50:26

标签: c# sql-server asp.net-mvc stored-procedures

我有一个表来管理嵌套集模型中的类别,并且在每个新行插入时,需要更新整个表。

对于性能问题,我想知道它是否更好:

  • 编写触发行插入的触发器和存储过程并管理表

OR

  • 编写主插入函数调用的C#方法?

1 个答案:

答案 0 :(得分:1)

这个问题没有正确的答案。一般来说,存储过程中包含的代码比ADO.NET中的代码更快。

话虽这么说,存储过程和触发器已缓存执行计划(ADO.NET的ad-hoc查询也是如此,但它们的工作方式略有不同)。执行计划基本上是SQL服务器用于执行连接操作的算法的路线图。随着存储过程或触发器变得更加复杂,它的执行计划变得更加复杂。单个复杂存储过程最终可能会有多个执行计划,具体取决于传递给它的参数。 当存储过程变得非常复杂时,可能发生的事情是SQL服务器可以开始选择实际工作非常糟糕的次优执行计划,并且您的代码可能突然变得非常慢。发生这种情况时,ADO.NET代码最终会更快,因为它通常涉及多个小型执行计划而不是一个大型执行计划。

一般情况下,当我遇到像你这样的情况时,我会选择使用只做几件事的存储过程。如果随着业务需求的变化而开始进行越来越多的更新,并且存储过程变得越来越长,最好将该过程分解为多个过程。

我会完全跳过触发器。触发器使得很难推断系统。它们几乎不可能进行调试,并且可以帮助您在未来发生意外。

在插入行时,您需要更新整个表,这有点像代码味道。如果这些插入频繁发生,您将遇到可怕的性能问题。我会寻找一种方法来更好地规范化您的数据,这样就不会发生这种情况,如果可能的话。