我有一个存储过程usp_appdata
,它被我们的应用程序加载屏幕以及应用程序中的许多其他地方使用。这个 SP 非常耗费资源并返回大量数据。我打算制作此存储过程的副本,usp_appdata_initial
并将其仅用于应用程序加载屏幕,并将原始 spusp_appdata
用于所有其他调用。将同一个过程分成多个过程并将每个过程用于特定目的是否会提供任何性能优势?谢谢!
我有一个存储过程usp_appdata
,它被我们的应用程序加载屏幕以及应用程序中的许多其他地方使用。这个 SP 非常耗费资源并返回大量数据。我打算制作此存储过程的副本,usp_appdata_initial
并将其仅用于应用程序加载屏幕,并将原始 spusp_appdata
用于所有其他调用。将同一个过程分成多个过程并将每个过程用于特定目的是否会提供任何性能优势?谢谢!
如果您正在制作过程的文字副本并从一个调用堆栈调用一个实例并从另一个调用堆栈调用另一个实例,那么应该没有性能差异。
如果您在过程中重构加载屏幕所需的代码
usp_appdata_initial
,那么您将减少每次打开加载屏幕时 SQL 服务器需要做的工作量,从而改善资源消耗和争用服务器。关于加载屏幕的调用堆栈,您可能会也可能不会看到该过程运行时的任何直接性能改进。但是您可能至少会减轻整个服务器上的一些负载(这可能会或可能不会很重要)。
执行过程时,不会发生影响同一过程的其他执行或什至阻止您更改过程本身的代码的锁定(无论过程并发运行的频率如何)。
相反,当您编写存储过程的代码时,架构修改锁会放置在该存储过程上
ALTER
,这可能会立即导致该过程的并发新运行等待ALTER
完成。因此,通过将更改非常频繁(并且与该调用堆栈无关)的代码重构到另一个过程中,可以略微提高一个运行非常频繁的过程的执行性能。但是
ALTER
语句通常几乎是瞬间运行的,因此即使使用非常频繁使用的程序,收益也可能无法估量。要获得更具体的答案,我们至少需要查看两个版本的代码及其相关的执行计划。