【问题标题】:Optimize Cursor with Linked Server - SQL Server使用链接服务器优化光标 - SQL Server
【发布时间】: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


    【解决方案1】:

    当您使用链接服务器时,您将从远程表中检索所有数据,并且条件子句将在您的 MSSQL 上执行,而不是在远程 MSSQL 上。 为避免从远程服务器获取所有表数据,您需要在远程服务器上对其进行过滤。 一种方法是在远程 MSSQL 上创建表函数,该函数将接收您要过滤的值。 然后用过滤条件调用 [10.1.13.202].MMProdatHA.dbo.OPContacts 您将调用 [10.1.13.202].MMProdatHA.dbo.fn_OPContacts(@exeproc)。

    谢谢, 马诺

    【讨论】:

      猜你喜欢
      • 2011-08-22
      • 1970-01-01
      • 2010-12-07
      • 2021-08-09
      • 2020-03-24
      • 1970-01-01
      • 2013-08-08
      • 2011-01-13
      • 2016-06-17
      相关资源
      最近更新 更多