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ührtdeclare @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
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.) –
@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 –
@JayWheeler Auch das schien keinen Einfluss auf die Performance. Es dauerte immer noch 450ms zu laufen –