2017-09-06 3 views
0

Ich habe einen Verbindungsserver, von dem ich Daten abrufen muss. Ich schließe mich einem Tisch an, von dem ich sehr wenige Reihen erwarte. Die Abfrage befindet sich unten und scheint alle Zeilen an den ursprünglichen Server zurückzugeben, um die Sortierung dort durchzuführen.Wie Sie die Zeilen auf dem Remote/Verbindungsserver begrenzen

Ich bin auf der Suche nach einer Möglichkeit, die Abfrage auf dem Zielcomputer mit einem Abfragehinweis oder etwas anderes zu filtern.

Abfrage

INSERT INTO #DealerHierarchy(DealerId, Level) 
SELECT cd.ParentId, cd.Level 
FROM [dbo].[AssignedDealer] ad 
JOIN [nlsdb].[nls].[dbo].[vw_parentDealers] cd ON cd.RootId = ad.DealerId 
WHERE ad.UserId = @userId 
AND ad.IsActive = 1 
AND (@DealerId IS NULL OR ad.DealerId = @DealerId) 

Wenn ich die folgende Zeile hinzufügen, so scheint es zu ändern und die lokale Abfrage in eine separate temporäre Tabelle Auszug zurückschicken nur die benötigten Zeilen

and cd.RootId = 72311 

ich versucht habe, , und wählen Sie dann aus der Sicht WHERE DealerId IN (select from temp table), aber es läuft immer noch langsam. Das Hinzufügen des REMOTE-Hinweises in dem JOIN führt auch nichts aus.

Abfrage-Plan: https://www.brentozar.com/pastetheplan/?id=r1iazaaFZ

Zeitcode auf den Verbindungsserver auf Verbindungsserver

declare @p1 int 
set @p1=7 
exec sp_prepexec @p1 output,N'@P1 numeric(10)',N'SELECT "Tbl1007"."ParentId" "Col1010","Tbl1007"."Level" "Col1011" FROM "nls"."dbo"."vw_parentDealers" "Tbl1007" WHERE @P1="Tbl1007"."RootId"',72311 
select @p1 

Schneller Code ausgeführt

ausgeführt

declare @p1 int 
set @p1=10 
exec sp_prepexec @p1 output,NULL,N'SELECT "Tbl1007"."ParentId" "Col1010","Tbl1007"."Level" "Col1011" FROM "nls"."dbo"."vw_parentDealers" "Tbl1007" WHERE "Tbl1007"."RootId"=(72311.)' 
select @p1 
+0

glaube ich, Set RowCount = 25 wird erreichen, was Sie nach. Tun Sie dies, bevor Sie Ihre Abfrage ausführen. (Zurücksetzen auf 0, um alle zurückzugeben.) –

+0

@JayWheeler Es ist möglich, dass die Abfrage mehr als 25 Zeilen zurückgibt. In diesem Fall scheint diese Lösung Datenintegritätsprobleme zu verursachen –

+0

@JayWheeler Auch das schien keinen Einfluss auf die Performance. Es dauerte immer noch 450ms zu laufen –

Antwort

0

Sie eine bestimmte Abfrage auf die ausgeführt werden soll erzwingen entfernte Datenbank mit OPENQUERY. OPENQUERY akzeptiert keinen Parameter, daher können Sie ihn dynamisch machen, indem Sie ihn weiter in EXEC umschließen.

Beispiel

DECLARE @SearchString NVARCHAR = ... 
DECLARE @OpenQueryString NVARCHAR = 'SELECT * FROM OPENQUERY(remotedb, ''' + @SearchString + ''')' 
EXEC (@OpenQueryString) 
Verwandte Themen