0

我有一个填充 SQL Server 2008 R2 数据仓库的 SSIS 包,当它从头开始重新创建 DW 时,它会对一个存储过程进行数百万次调用,该存储过程在计算方面进行繁重的工作。

问题是 SSIS 包需要几天才能运行,而且不应该花那么长时间。关键似乎是SSIS包调用SProc时,SProc返回结果大约需要2分钟。但是,如果我手动重新创建调用(在同一个数据库上),返回结果需要 <1 秒,这是我所期望的。

请参阅此屏幕截图,顶部是 SQL Profiler Trace,显示 SSIS 包的调用耗时 130 秒,底部是我对调用的重新创建,耗时 <1 秒。

http://screencast.com/t/ygsGcdBV

SProc 查询数据库,使用游标遍历结果,对记录对进行大量计算,并将数字合并为 2 个返回的结果。

然而,手动调用的时间向我表明,这不是 SProc 本身的问题,也不是数据库本身的任何索引问题,那么为什么 SSIS 包比手动调用花费的时间要长得多?

任何提示表示赞赏。

谢谢,

4

3 回答 3

0

这可能很简单。验证表中的索引。它可能是相似/冲突的索引,解决方案可能是删除其中一个。使用 SSMS 中的 SQL 查询查看执行计划以及使用的索引对象。慢速SP也一样吗?如果他们使用不同的索引,请尝试使用 SP 中的快速索引。示例如何:

SELECT *
FROM MyTable WITH (INDEX(IndexName))
WHERE MyIndexedColumn = 0
于 2013-11-25T13:48:49.723 回答
0

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

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

  • 查看您的存储过程 SQL Server参数嗅探

慢方式:

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
于 2013-11-07T21:41:58.833 回答
0

我没有适合您的解决方案,但我确实有一个建议和程序可以帮助您获得有关解决方案的更多信息。

建议:被调用数百万次的存储过程不应该使用游标。通常一个游标可以被几条语句和一个或两个临时表替换。对于超过 10k 行左右的临时表,对其进行索引。

过程:在存储过程中的关键位置放置一个语句

declare @timer1 datetime = GetDate()
(some code)
declare @timer2 datetime = GetDate()
(more code)
declare @timer3 datetime = GetDate()

然后,最后:

select 
datediff(ss,@timer1,@timer2) as Action1,
datediff(ss,@timer2,@timer3) as Action2

此时,您将知道查询的哪一部分工作方式不同。我猜你有一个“啊哈!” 未来。

于 2013-07-31T13:47:51.393 回答