有没有办法加快这个链接服务器 SQL 的更新?

Is there anyway to speed up this linked Server SQL update?

有没有办法加快这个sql?我正在使用链接服务器。我尝试进行合并,但性能是一样的。

--通过recordModified Server 1 -> Server 2更新参与者

update p1 
set  p1.[RecordCreated] = p2.RecordCreated
,p1.[RecordModified] = p2.RecordModified
,p1.[Email] = p2.Email
from ERSS_Local.dbo.Participant p1
join [Computer2\SqlExpress].ERSS_Local.dbo.Participant p2 
on p2.RecordModified >= (select LastSync from ERSS_DB_Sync) 
and p1.ParticipantID = p2.ParticipantID 
and p1.RecordCreated = p2.RecordCreated and p1.RecordModified < p2.RecordModified

我正在更新超过 35 个列,我将它们排除在外以简化查询。

我添加了这个,但似乎没有帮助

 on p2.RecordModified >= (select LastSync from ERSS_DB_Sync) 

瓶颈似乎是我正在更新的列的数量。

有没有办法加快这个更新语句?

本地 Sql 服务器对 remote/linked Sql 服务器上的统计信息、记录数或索引一无所知。事实上,它需要从远程服务器获取 所有 的记录,甚至对 RecordModified 列进行检查。

您可以使用 `OPENQUERY() 进行改进,让链接的远程服务器在将结果发送到本地服务器之前预先过滤结果。这将仅限制相关记录的网络流量,并允许远程服务器在构建结果集时使用它的索引:

update p1 
    set  p1.[RecordCreated] = p2.RecordCreated
        ,p1.[RecordModified] = p2.RecordModified
        ,p1.[Email] = p2.Email
from ERSS_Local.dbo.Participant p1
join OPENQUERY([Computer2\SqlExpress], 
    'SELECT * FROM ERSS_Local.dbo.Participant  WHERE p2.RecordModified >= ''' + (select LastSync from ERSS_DB_Sync) + '''') p2 
  on p1.ParticipantID = p2.ParticipantID 
   and p1.RecordCreated = p2.RecordCreated 
   and p1.RecordModified < p2.RecordModified

如果您还可以通过将 * 更改为您所需要的来限制返回的列,那就更好了。

--assign a variable prevents some issues with query optimizer
DECLARE @LastSync DATETIME;
SELECT @LastSync = LastSync from ERSS_DB_Sync

update 
    p1 
set 
     p1.[RecordCreated] = p2.RecordCreated
    ,p1.[RecordModified] = p2.RecordModified
    ,p1.[Email] = p2.Email
from 
    ERSS_Local.dbo.Participant p1
    join (
            SELECT 
                [Computer2\SqlExpress].ERSS_Local.dbo.Participant  
            WHERE 
                RecordModified >= @LastSync
                -- force the destination engine to filter this set first
        ) as p2
    on p1.ParticipantID = p2.ParticipantID 
    and p1.RecordCreated = p2.RecordCreated and p1.RecordModified < p2.RecordModified