Performance SQL性能—SSIS调用存储过程需要2分钟,但SSMS需要<;1秒
我有一个SSIS包,它填充了SQL Server 2008 R2数据仓库,当它从头开始重新创建DW时,它会对一个存储过程执行数百万次调用,该存储过程在计算方面起着重要作用Performance SQL性能—SSIS调用存储过程需要2分钟,但SSMS需要<;1秒,performance,stored-procedures,ssis,sql-server-2008-r2,Performance,Stored Procedures,Ssis,Sql Server 2008 R2,我有一个SSIS包,它填充了SQL Server 2008 R2数据仓库,当它从头开始重新创建DW时,它会对一个存储过程执行数百万次调用,该存储过程在计算方面起着重要作用 问题是SSIS包需要几天的时间才能运行,不应该花那么长的时间。关键似乎是,当SSIS包调用存储过程时,存储过程大约需要2分钟才能返回结果。但是如果我手动(在同一个数据库上)重新创建调用,则需要我没有解决方案,但我有一个建议和过程可以帮助您获得解决方案的更多信息 建议:被调用数百万次的存储过程不应该使用游标。通常,游标可以由几个
问题是SSIS包需要几天的时间才能运行,不应该花那么长的时间。关键似乎是,当SSIS包调用存储过程时,存储过程大约需要2分钟才能返回结果。但是如果我手动(在同一个数据库上)重新创建调用,则需要我没有解决方案,但我有一个建议和过程可以帮助您获得解决方案的更多信息 建议:被调用数百万次的存储过程不应该使用游标。通常,游标可以由几个语句和一两个临时表代替。对于行数超过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
此时,您将知道查询的哪一部分工作方式不同。我猜您一定遇到了一个“啊哈!”问题。我怀疑真正的问题出在您的存储过程中,但为了解决您的问题,我还提供了一些基本的SSIS项目:
- 确保OLE DB源的连接管理器都设置为DelayValidation(=True)
- 确保ValidateExternalMetadata设置为false
- DefaultBufferMaxRows和DefaultBufferSize对应于表的行大小
- 删除并重新创建目标组件SSIS
- 确保在存储过程中设置ANSI_空值
- 确保存储过程中的SQL命中索引
- 添加查询提示选项(FAST 10000)-此提示意味着它将选择一个优化前10000行的查询–默认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
快捷方式:
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
这可能很简单。验证表中的索引。它可能是相似/冲突的索引,解决方案可能是删除其中一个索引。 使用SSMS中的SQL查询,可以查看执行计划以及使用的索引对象。慢SP也是这样吗? 如果它们使用不同的索引,请尝试在SP中使用快速索引。示例如何:
SELECT *
FROM MyTable WITH (INDEX(IndexName))
WHERE MyIndexedColumn = 0
这里有很多可能性。首先是参数嗅探,然后是不同的集合选项。权威性的论文是,但是@PaulWhite在感谢您花时间回复和提示方面有一个更简洁的回应。我意识到游标并不理想,但它通常只在几十行中迭代,而且通常非常快,这就是为什么当存储过程手动执行时,只需不到一秒钟的原因。我不认为使用临时表可以在这方面有多大改进。问题仍然是,从SSIS调用同一代码需要2分钟,我不知道如何继续调试原因。