有没有办法加快这个链接服务器 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
有没有办法加快这个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