gpt4 book ai didi

sql-server - 与通过 SSMS 手动执行相比,通过 SSIS(通过 SQL 代理作业)存储过程运行速度慢 24,000%

转载 作者:行者123 更新时间:2023-12-02 00:39:06 25 4
gpt4 key购买 nike

我面临一个非常奇怪的问题,与在 SSMS 中手动运行相比,通过 SSIS 包(通过 SQL 代理作业运行)存储过程运行速度非常慢。

通过作业,大约需要 2 小时,而手动运行只需 30 秒!

完全相同的存储过程并在同一服务器上运行。

这是SSIS包中的流程结构:

The SSIS control flow

相关存储过程的名称是BR_SHP_Timekeeper_Costs

同名的执行SQL任务使用ADO.NET连接管理器并运行:

EXEC BR_SHP_Timekeeper_Costs @p1, @p2

正如您所看到的,该任务通过优先级约束“链接”,以便它可以自行运行,即不会与其他任务竞争。

我注意到,在包执行期间(通过 SQL 代理),当它执行该任务时,我可以在事件监视器中看到大量 CXPACKET 等待类型,并且 CPU 正在运行 97-99%。

仅供引用,服务器有 8 个 vCPU,MAXDOP 设置为 0,并行成本阈值设置为 5

到目前为止,我已经尝试/调查/发现了以下内容:

  1. 此存储过程只有 1 个缓存执行计划,并且由 SSIS 和 SSMS(手动运行存储过程)使用

  2. 创建了一个运行 T-SQL 的虚拟 SQL 代理作业 - EXEC BR_SHP_Timekeeper_Costs。该作业在大约 30 秒内完成。

  3. 创建了一个虚拟 SSIS 包,其中仅包含执行 SQL 任务并使用 ADO.NET 连接管理器运行相同的存储过程。然后通过新的 SQL 代理作业运行它。约 30 秒内完成。

这里我还能检查什么?

有什么想法为什么会发生这种情况吗?我已经挠头一个星期左右了..

最佳答案

也许您可以尝试将参数@p1和@p2分配给存储过程中定义的两个变量,然后使用这些变量而不是参数。例如:

ALTER PROCEDURE BR_SHP_Timekeeper_Costs
@p1 int,
@p2 int

AS

declare @_p1 int, @_p2 int
set @_p1 = @p1
set @_p2 = @p2
....
....
select column1, column2 from table t where t.p1 = @_p1
....
....

在某些情况下,此解决方法可以加速执行。

希望对你有帮助!

关于sql-server - 与通过 SSMS 手动执行相比,通过 SSIS(通过 SQL 代理作业)存储过程运行速度慢 24,000%,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44086647/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com