2009-06-30 18 views
0

der folgende Code funktioniert gut, aber es dauert ein absolutes Alter zu laufen. Wie kann ich das beschleunigen?Leistungsproblem mit verteilten Abfragen

Hintergrund: Ich habe meinen lokalen Server mit meinem Remote-Server verbunden. Von meinem lokalen Server muss ich Daten von dem Remote-Server in meinen lokalen Server einfügen und dann die Tabelle auf meinem Remote-Server aktualisieren. Siehe Snippet für die genauen Details.

DECLARE @temp1 TABLE 
(LoginID INT PRIMARY KEY, 
UserID UNIQUEIDENTIFIER, 
Message NCHAR(1000)) 

INSERT INTO [My Local Server].[DB Name].dbo.Login 
(LoginID, UserID, Message) 
OUTPUT INSERTED.LoginID, INSERTED.UserID, INSERTED.Message INTO @temp1 
SELECT LoginID, UserID, Message 
FROM [Remote Server].[Remote DB Name].dbo.Login2 
WHERE Date IS NULL 

UPDATE [Remote Server].[Remote DB Name].dbo.Login2 
SET Date = GETDATE() 
FROM [Remote Server].[Remote DB Name].dbo.Login2 AS z 
WHERE EXISTS (SELECT 1 FROM @temp1 AS x WHERE z.Date IS NULL AND x.LoginID = z.LoginID) 

EDIT:

Darüber hinaus ist es trotzdem kann ich komprimieren/zip wobei die Daten hin und her geschickt?

Antwort

2

Ist das INSERT oder das UPDATE der Täter, oder sind beide schlecht?

Sie bringen die Zeilen mit NULL-Werten für Date vom Remoteserver und senden diese Werte dann erneut in der UPDATE-Anweisung. Sie könnten möglicherweise Datenverkehr speichern, indem Sie die aktualisierten Zeilen auswählen und lokal einfügen. Es sieht aus wie Sie dies tun könnten (sorry, kein MS SQL Server zur Verfügung zu testen gegen) mit den Worten

INSERT INTO [My Local Server].[DB Name].dbo.Login 
(LoginID, UserID, Message) 
SELECT * 
FROM 
    UPDATE [Remote Server].[Remote DB Name].dbo.Login2 
    SET Date = GETDATE() 
    OUTPUT LoginID, UserID, Message 
    WHERE Date IS NULL 

die MSDN Siehe INSERT docs und OUTPUT docs für weitere Einzelheiten.

Oder vielleicht OUTPUT INTO ist der Weg zu gehen:

UPDATE [Remote Server].[Remote DB Name].dbo.Login2 
SET Date = GETDATE() 
OUTPUT LoginID, UserID, Message 
INTO [My Local Server].[DB Name].dbo.Login (LoginID, UserID, Message) 
WHERE Date IS NULL 
+0

Sorry, vergessen zu erwähnen. Der INSERT ist erträglich. Es ist das Update, das langsam ist. Du hast recht, ich möchte den Traffic reduzieren. Leider kann ich dein Skript nicht testen, da ich jetzt gerade ins Büro gehe. Aber danke für deinen Beitrag. Ich werde es morgen versuchen und meine Ergebnisse veröffentlichen. – super9

+0

Ursprünglich ziehen Sie Zeilen mit dem Datum IS NULL vom Remote-Server, aber Sie aktualisieren dann die Date-Spalte für Zeilen, für die DateCollected IS NULL ist. Das bedeutet, dass Sie möglicherweise lokal eine andere Gruppe von Zeilen einfügen als Sie aktualisieren. Ist das absichtlich? –

+0

OH Lieber, DateCollected war ein Tippfehler meinerseits. Es sollte Datum sein. Also, um Ihre Frage zu beantworten, ist es die gleiche Menge von Daten, die ich einfügen und AKTUALISIEREN – super9

0

Es scheint, dass das Update die gesamte entfernte Tabelle zu ziehen, hat, die Datensätze scannen und einen verschachtelten Blick nach oben in die @ temp1 zu tun, das Schiff Zurück die Aktualisierungen. Es ist nur eine Vermutung, ohne zusätzliche Informationen. Sie sollten sich den tatsächlichen Ausführungsplan ansehen und verfolgen, wo sich die Zeit befindet. Auch die Verwendung von STATISTICS IO ON könnte helfen.

Das ist wirklich nur ein Schuss im Dunkeln, aber vielleicht können Sie ein statt der VORHANDEN versuchen beitreten: diese

WITH cte_remote AS (
    SELECT z.Date 
    FROM [Remote Server].[Remote DB Name].dbo.Login2 AS z 
    JOIN @temp1 AS x ON z.DateCollected IS NULL AND x.LoginID = z.LoginID) 
UPDATE cte_remote 
    SET Date = GETDATE(); 
+1

Nun, ich habe das Problem irgendwie umgangen. Ich führe keine Remote-SPs aus, die meine Remote-Tabelle aktualisieren, anstatt verteilte Abfragen zu verwenden. VIEL VIEL effizienter. Danke für deinen Vorschlag trotzdem! – super9