Sql server 一个执行官要多少钱?
我继承了一些遗留代码,其中每个存储过程实现了两次:一个用于通过输入参数提供的单个“案例id”,另一个用于表类型输入参数提供的“案例id”列表 我的任务是通过(重新)使用“列表SP”重新实现每个“单一id”SP来“提高可维护性”。相当乏味,但没有火箭科学:Sql server 一个执行官要多少钱?,sql-server,tsql,stored-procedures,Sql Server,Tsql,Stored Procedures,我继承了一些遗留代码,其中每个存储过程实现了两次:一个用于通过输入参数提供的单个“案例id”,另一个用于表类型输入参数提供的“案例id”列表 我的任务是通过(重新)使用“列表SP”重新实现每个“单一id”SP来“提高可维护性”。相当乏味,但没有火箭科学: CREATE PROCEDURE [dbo].[SingleIdProc] @CaseId BIGINT AS BEGIN DECLARE @TTIdsList dbo.TTIdsList INS
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
参数优化器时,它可能会找到更好的计划
你可能会发现这篇文章很有用
要查看SSMS中的实际执行计划,有一个按钮/命令显示/包括实际执行计划。看
我还推荐一种新的方法。即使是免费版本也很好。您可以在其中同时运行这两个变量,您将看到所有的统计数据彼此相邻。这有助于了解发生了什么。标量版本和TVP版本的执行计划是什么样子的?这与
EXEC
本身无关。特定ID的执行计划很可能与表参数的执行计划大不相同。当给定一个简单的bigint
时,参数优化器能够找到更好的计划。@MartinSmith标量和向量版本的实现是相同的(当然,输入参数除外,它要求按CaseId进行连接,以便在表上而不是在单个bigint上运行相同的精确代码).看一看:在SSMS中有一个按钮/选项显示实际执行计划。我也会推荐一个(即使是免费的版本也很好)。你可能会发现这很有用。