我继承了一些遗留代码,其中每个存储过程都实现了两次:一次用于通过输入参数提供的单个“案例ID”,另一个用于>由表类型输入参数提供的“案例ID”列表。
我收到了一项任务,通过(重新)使用“列表 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 恢复到之前的版本...
所以我的问题是:
- 这样的间接调用需要多少钱?
- 我如何衡量自己的绩效差异?
最佳答案
性能差异可能不是由 EXEC
本身引起的。
特定 ID 的执行计划很可能与表参数的执行计划有很大不同。当给定一个简单的 bigint 参数时,优化器也许能够找到更好的计划。
您可能会找到这篇关于 Execution Plan Basics 的文章有用。
要查看 SSMS 中的实际执行计划,有一个按钮/命令可以显示/包含实际执行计划。请参阅Displaying Graphical Execution Plans (SQL Server Management Studio) 。
我还推荐一个SQL Sentry Plan Explorer 。即使免费版本也非常好。您可以同时运行其中的两个变体,您将看到所有统计数据并排显示。它有助于了解正在发生的事情。
关于sql-server - EXEC 的费用是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35391571/