去面试的时候,面试官问我“存储过程有什么好处?” 我开始回答,但当我说“它减少了网络拥塞”时,他突然说“不,它没有”。
我突然停顿了一下,我不敢问他为什么。采访结束后,我在网上搜索了很多,但我发现我说的重点是有,但没有解释。所以我问自己并做出了一些断言:
由于存储过程是预编译的,即已经为其创建了执行计划,因此它提高了执行速度。但是对于我们将一些变量传递给 SP 的情况,这些变量需要去服务器执行,并且应该为每个变量检索不同的结果。
所以我的观点是面试官是对的:网络拥塞并没有减少,每次都要将变量传递给数据库并返回结果,所以网络忙于这些。正确的?
我的断言正确吗?
在 SQL Server 中,查询优化器通过这些步骤来执行任何查询(存储过程调用或临时 SQL 语句):
重点是:即席 SQL 和存储过程没有区别。
如果 ad-hoc SQL 查询正确使用了参数——无论如何它都应该如此,以防止 SQL 注入攻击——它的性能特征没有什么不同,而且绝对不会比执行存储过程差。
存储过程还有其他好处(例如,无需授予用户直接表访问权限),但就性能而言,使用正确参数化的即席 SQL 查询与使用存储过程一样高效。
如果有一个中等大小的 SQL 语句(因此它适合单个网络数据包),那么从应用程序执行该语句或将其打包为 SP 并执行 SP 将在网络方面是相同的。
但是,我经常看到的一种模式是应用程序函数需要多个 SQL 语句才能产生结果。假设我们正在向数据库写入订单。首先,我们验证客户 (1),然后是产品代码 (2),然后是库存水平 (3),然后写入订单标题 (4),返回 ID,该 ID 用作订单行 (5) 中的外键。如果每个调用都是与应用程序分开进行的,则这是到数据库服务器的五次往返。如果将值作为参数传递给 SP,则它是具有单个响应的单个请求 - 一次往返。
因此,我认为将业务功能的 SQL 密集型部分打包为存储过程确实可以减少典型场景中的网络负载。