sql-server - EXEC 的费用是多少?

标签 sql-server tsql stored-procedures

我继承了一些遗留代码,其中每个存储过程都实现了两次:一次用于通过输入参数提供的单个“案例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 恢复到之前的版本...

所以我的问题是:

  1. 这样的间接调用需要多少钱?
  2. 我如何衡量自己的绩效差异?

最佳答案

性能差异可能不是由 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/

相关文章:

mysql - 繁重的存储过程可以等待另一个 SP 完成吗?

asp.net - 不确定用于同步的 SQL Server 锁的类型

SQL 触发器在 Azure Elastic DB 中不起作用

sql - 连接字符串时VARCHAR(MAX)表现得很奇怪

tsql - T-SQL 中是否存在与 SELECT @@ROWCOUNT 等效的 PostgreSQL?

tsql - 我可以使用 Order by 对存储过程结果进行排序吗?

sql-server - WSO2 DSS - SQLServerException : This operation is not supported

sql-server - SQL Server varbinary bigint 与 BitConverter.ToInt64 值不同

sql-server - T-SQL 中具有可变数量搜索条件的 LIKE 运算符

mysql 存储过程与 mysql 命令行工具的脚本