Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance SQL性能—SSIS调用存储过程需要2分钟,但SSMS需要<;1秒_Performance_Stored Procedures_Ssis_Sql Server 2008 R2 - Fatal编程技术网

Performance SQL性能—SSIS调用存储过程需要2分钟,但SSMS需要<;1秒

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包,它填充了SQL Server 2008 R2数据仓库,当它从头开始重新创建DW时,它会对一个存储过程执行数百万次调用,该存储过程在计算方面起着重要作用


问题是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分钟,我不知道如何继续调试原因。