2017-10-10 5 views
1

Existe-t-il un moyen d'accélérer ce sql? J'utilise un serveur lié. J'ai essayé de faire une fusion et la performance était la même.Est-il possible d'accélérer cette mise à jour SQL Server liée?

participants --update par 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 

Je suis mise à jour plus de 35 colonnes, je les ai laissés pour simplifier la requête.

j'ajouté ce et il ne semble pas aider

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

Le col de la bouteille semble être la quantité de colonnes que je suis mise à jour.

Est-il possible d'accélérer cette mise à jour?

Répondre

0

Le serveur Sql local ne sait rien sur les statistiques, le nombre d'enregistrements ou les index sur le serveur Sql distant/lié. En tant que tel, il doit apporter tous les des enregistrements du serveur distant pour même faire la vérification sur la colonne RecordModified.

Vous pouvez améliorer les choses en utilisant `OPENQUERY(), pour permettre au serveur distant lié de pré-filtrer les résultats avant de les envoyer au serveur local. Cela permettra de limiter le trafic réseau seulement les des documents pertinents et permettre au serveur distant d'utiliser ses index comme il construit le jeu de résultats:

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 

Encore mieux si vous pouvez également limiter les colonnes renvoyées en changeant la * juste ce que vous avoir besoin.

+0

Cela a fonctionné Great! Je devais juste le passer comme une ficelle et ensuite faire Exec. Fonctionne en moins de 1 seconde, où avant a pris 45 secondes ... Merci –

0
--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