【发布时间】:2015-02-16 19:03:09
【问题描述】:
我有一个使用链接服务器的游标,处理时间太长,请我提供优化提示。想象一下,前 20 名需要 3 分钟。运行的存储过程是简单的更新。
提前致谢
PD:我打算在工作上使用这个光标
Use MMProdat
go
Declare @query nvarchar(MAX)
declare @id varchar(100)
declare @name varchar(100)
declare @prequery varchar(800)
declare @prequery2 varchar(800)
declare @prequery3 varchar(800)
select @prequery = 'declare @p3 bit' + CHAR(13) + CHAR(10) + 'set @p3 = NULL' + CHAR(13) + CHAR(10)
select @prequery2 = 'declare @p4 int' + CHAR(13) + CHAR(10) + 'set @p4 = 0' + CHAR(13) + CHAR(10) + 'declare @p5 int' + CHAR(13) + CHAR(10) + 'set @p5 = 0' + CHAR(13) + CHAR(10) + 'declare @p6 int' + CHAR(13) + CHAR(10) + 'set @p6 = 0' + CHAR(13) + CHAR(10)
select @prequery3 = 'declare @p5 int' + CHAR(13) + CHAR(10) + 'set @p5 = 0' + CHAR(13) + CHAR(10) + 'declare @p6 int' + CHAR(13) + CHAR(10) + 'set @p6 = 0' + CHAR(13) + CHAR(10) + 'declare @p7 int' + CHAR(13) + CHAR(10) + 'set @p7 = 0' + CHAR(13) + CHAR(10)
DECLARE cursorQuery CURSOR FOR
select top 20 Id, Query, Name from [10.1.13.202].MMProdatHA.dbo.OPContacts where exeproc = 0 order by tmstmp
OPEN cursorQuery
FETCH NEXT FROM cursorQuery INTO @id, @query, @name
WHILE @@Fetch_status = 0
BEGIN
IF ( @name = 'OuPNeedsContactReset')
begin
select @query = @prequery + @query + ', @p3 OUTPUT'
print @query
EXECUTE sp_executesql @query
update [10.1.13.202].MMProdatHA.dbo.OPContacts set ExeProc = 1 where Id = @id
end
ELSE IF ( @name = 'OuPCountProcessContacts')
begin
select @query = @prequery2 + @query + ',@p4 output,@p5 output,@p6 output'
print @query
EXECUTE sp_executesql @query
update [10.1.13.202].MMProdatHA.dbo.OPContacts set ExeProc = 1 where Id = @id
end
ELSE IF ( @name = 'OuPCountBatchContacts')
begin
select @query = @prequery3 + @query + ',@p5 output,@p6 output,@p7 output'
print @query
EXECUTE sp_executesql @query
update [10.1.13.202].MMProdatHA.dbo.OPContacts set ExeProc = 1 where Id = @id
end
else
begin
EXECUTE sp_executesql @query
update [10.1.13.202].MMProdatHA.dbo.OPContacts set ExeProc = 1 where Id = @id
end
FETCH NEXT FROM cursorQuery INTO @id, @query, @name
END
CLOSE cursorQuery
DEALLOCATE cursorQuery
【问题讨论】:
标签: sql sql-server-2008 tsql optimization query-optimization