【问题标题】:SSIS pre-evaluation phase taking longSSIS预评估阶段需要很长时间
【发布时间】:2013-10-10 20:32:34
【问题描述】:

我有一个数据流,其中包含调用存储过程的 OLEDB 源(通过变量生成的语句)。 在 SSMS 中,需要 8 分钟,但包本身需要 3 倍的时间才能完成。 我已将验证 (DelayValidation) 设置为 true,因此它仍会在运行时执行此操作。我还在数据流组件以及连接管理器中设置了元数据的验证。 数据流也有 ReadUncommitted。 我不知道还能去哪里看,关于如何让这个运行更快的任何帮助都会很棒。

【问题讨论】:

  • 您能否发布 SSIS 日志,指出您认为哪里存在性能问题。
  • 没有为包启用日志记录,但是当使用 dtexecui 运行时,该过程在预执行阶段需要很长时间。我希望从包中完全减少或删除该步骤,因为这是瓶颈所在。
  • 我不知道答案,但是当我搜索“ssis 预执行阶段卡住”时发现了很多东西可以尝试。您是否对数据库运行了探查器以查看它在这段时间内在做什么?它针对什么数据库?
  • 我已启用日志记录并分析了数据库。接收元数据的时间似乎存在差距,因为它完成了与另一个数据库的链接,因为日志或配置文件中没有任何内容,只是一个巨大的时间差距。我希望 +50 分能激发你的 ESP 能力。
  • 这是 SQL Sever 20??你有能力修改存储过程吗?

标签: sql performance ssis


【解决方案1】:

我怀疑真正的问题出在您的存储过程中,但我也包含了一些基本的 SSIS 项目以尝试解决您的问题:

  • 确保 OLE DB 源的连接管理器都设置为DelayValidation (= True)。
  • 确保将 ValidateExternalMetadata 设置为 false
  • DefaultBufferMaxRows 和 DefaultBufferSize 对应表的行大小
  • DROP 并重新创建您的目标组件是 SSIS
  • 确保您的存储过程已设置 ANSI_NULLS ON
  • 确保存储过程中的 SQL 命中索引
  • 添加查询提示 OPTION (FAST 10000) - 此提示意味着它将选择一个针对前 10,000 行进行优化的查询——默认 SSIS 缓冲区大小

  • 查看您的存储过程 SQL Server parameter sniffing

慢行:

create procedure GetOrderForCustomers(@CustID varchar(20))
as
begin
  select * from orders
  where customerid = @CustID
end

快捷方式:

create procedure GetOrderForCustomersWithoutPS(@CustID varchar(20))
as
begin
  declare @LocCustID varchar(20)
  set @LocCustID = @CustID

  select * from orders
  where customerid = @LocCustID
end

【讨论】:

  • 为什么建议跳过验证?我觉得它很有价值,尽管有时很慢。您是否看到它会导致问题,在编译时当然不存在表或字段的特定场景之外?
  • 我没有看到它会导致问题,只是它很慢。将 ValidateExternalMetadata 属性设置为 False 比将 DelayValidation 属性设置为 True 可以更精细地控制数据流。当 ValidateExternalMetadata 属性设置为 True(默认值)时,它有助于避免包使用事务时出现锁定问题。出于这个原因,您可能希望坚持在任务级别使用 DelayValidation,除非您有一些压倒一切的需要在组件级别工作。
  • OPTION (FAST N) 适合我。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-23
  • 2014-05-15
  • 2017-04-16
  • 2021-12-11
  • 1970-01-01
  • 2013-09-07
相关资源
最近更新 更多