我继承了一些遗留代码,其中每个存储过程都实现两次:一个用于单个“case id”通过输入参数提供,另一个用于 输入参数提供的“case id”列表。
通过(重新)使用“list SP”重新实现每个“单个id”SP,我被赋予了“提高可维护性”的任务。相当乏味,但没有什么火箭科学:
CREATE PROCEDURE [dbo].[SingleIdProc]
@CaseId BIGINT
AS
BEGIN
DECLARE @TTIdsList dbo.TTIdsList
INSERT INTO @TTIdsList(id)
VALUES (@CaseId)
EXEC [dbo].[SingleIdProcByList]
@CaseIds = @TTIdsList
END
RETURN 0
它正常工作(正确!),但现在DBA抱怨说这会损害性能以至于他不得不将所有这些“固定”的SP恢复到他们之前的版本......
所以我的问题是:
答案 0 :(得分:4)
性能上的差异可能不是由EXEC
引起的。
特定ID的执行计划很可能与table参数的执行计划完全不同。给定一个简单的bigint
参数时,优化器可能能够找到更好的计划。
您可能会发现这篇文章关于Execution Plan Basics有用。
要在SSMS中查看实际执行计划,可以使用按钮/命令来显示/包含实际执行计划。见Displaying Graphical Execution Plans (SQL Server Management Studio)。
我还建议SQL Sentry Plan Explorer。即使免费版也非常好。您可以同时运行两个变体,并且您将看到彼此相邻的所有统计数据。它有助于了解正在发生的事情。