SQL 服务器存储过程在网络集群中性能更好吗?

Do SQL Server stored procedures perform better in network clusters?

据我所知,与仅在 C# 中构建命令并在程序代码中显式调用它们相比,使用存储过程似乎具有边际性能优势,至少在涉及共享服务器程序的机器时和数据库引擎(当程序很简单时)。大多数人似乎认为这是一个 'preference issue',并添加一些其他的小好处来证明他们的理由。

但是,我找不到任何相关信息,那就是当数据库引擎位于与主应用程序不同的物理机器上时存储过程的好处。

如果我没记错的话,在服务器场中,存储过程不会从主服务器应用程序卸载某些 cpu 线程上的处理,并在数据库引擎服务器上完成主要处理cpu 而不是?或者,当 C# 库 'build' 数据库引擎要处理的信息时,这是否已经在数据库引擎的 cpu 上完成了?

具体来说,我有一个长 运行 事务,我可以在 C# 事务块中进行多次调用,但我怀疑存储过程实际上会通过减少网络调用而获得巨大的性能优势到数据库引擎,并保证处理不在主服务器应用程序上完成。

这是真的吗?

如果 SP 只是一个简单的查询(即一个 SELECT 语句),性能增益是预编译 SP。虽然查询是 运行,但如果它是查询或 SP,您应该看不出有任何区别。

如果 SP 更复杂,我不确定效果,因为这取决于查询。

存储过程的性能提升(与 Dapper 或 OR/M 之类的 Entity Framework 相比)可能会有所不同,从几乎相同到非常明显的性能改进。我认为如果不查看将被转换为存储过程的代码,就无法回答您的问题。

话虽如此,根据我进行单个存储过程调用与从应用程序代码调用多个语句的经验,是的,它可能会更快。

SP 更重要的好处是所有数据都保存在 DBMS 中,而不是来回发送给客户端。如果您正在处理大量数据,那么好处会更加明显。如果您的数据库位于不同的机器上,差异会增加,如果它们之间的连接速度很慢,差异会更大。 相反,您必须考虑到 SP 通常不会编译为机器代码,因此如果 SP 实现非常复杂的逻辑,则在客户端上实现逻辑可能会更快。 然后你还应该考虑将业务逻辑移动到服务器对代码维护不太好,你可以添加一个技术借记在数据库中实现一些应该在你的客户端代码中的东西。 因此,没有适用于所有季节的解决方案,但通常编写良好的 SP 比客户端上的相同代码 运行

更快

这里有一些问题。正如其他人所说,这取决于。原始的 select 语句几乎不会引人注意。如果有一个非常复杂的查询,那么 SP 可以节省大量重复的解析。如果中间数据很多,那么 SP 会将数据保存在本地,从而减少网络流量。如果您的数据库具有比客户端更高的规格,由于 CPU 马力,它可能 运行 更快。

缺点可能是让每个人的数据库陷入困境,而这些处理可以在客户端上完成。如果您 运行 的 SQL 服务器性能不足,通常会​​出现这种情况。另一个微妙的方面是多核数据库服务器的许可成本可能非常高。 SQL 服务器盒子上的每个周期 $ 可能是客户端上的很多倍。