11

auf local (a SQL Server 2008 R2), ich habe ein Synonym syn_view1 zum verknüpften Server verweist genannt remoteserver.remotedb.dbo.view1Performance-Effekt der Synonyme über einen Verbindungsserver in SQL Server

Diese langsame Abfrage dauert 20 Sekunden läuft .

select e.column1, e.column2 
from syn_view1 e 
where e.column3 = 'xxx' 
    and e.column4 = 'yyy' 
order by e.column1 

Diese FAST Abfrage dauert 1 Sekunde zu laufen.

select e.column1, e.column2 
from remoteserver.remotedb.dbo.view1 e 
where e.column3 = 'xxx' 
    and e.column4 = 'yyy' 
order by e.column1 

Der einzige Unterschied in den zwei Abfragen ist wirklich das Vorhandensein des Synonyms. Offensichtlich wirkt sich das Synonym auf die Leistung der Abfrage aus.

Die Planausführung für die langsame Abfrage ist:

Plan    Cost % Subtree cost 
4 SELECT 
I/O cost: 0.000000 CPU cost: 0.000000 Executes: 0 
Cost: 0.000000     0.00 3.3521 
    3 Filter 
    I/O cost: 0.000000 CPU cost: 0.008800 Executes: 1 
    Cost: 0.008800    0.26 3.3521 
     2 Compute Scalar 
     I/O cost: 0.000000 CPU cost: 3.343333 Executes: 1 
     Cost: 0.000000   0.00 3.3433 
      1 Remote Query 
      I/O cost: 0.000000 CPU cost: 3.343333 Executes: 1 
      Cost: 3.343333  99.74 3.3433 

Und für die FAST-Abfrage:

Plan   Cost % Subtree cost 
3 SELECT 
I/O cost: 0.000000 CPU cost: 0.000000 Executes: 0 
Cost: 0.000000    0.00 0.1974 
    2 Compute Scalar 
    I/O cost: 0.000000 CPU cost: 0.197447 Executes: 1 
    Cost: 0.000000   0.00 0.1974 
     1 Remote Query 
     I/O cost: 0.000000 CPU cost: 0.197447 Executes: 1 
     Cost: 0.197447  100.00 0.1974 

Mein Verständnis ist in der SLOW-Abfrage, dass der Server von der alle Daten abruft Remote-Server, wendet dann den Filter an (obwohl ohne Index), während der Server in der FAST-Abfrage die gefilterten Daten vom Remote-Server abruft und somit die Remote-Indizes verwendet.

Gibt es eine Möglichkeit, das Synonym zu verwenden, während es schnell ist? Vielleicht eine Einrichtung des Verbindungsservers? der lokale Datenbankserver?

Danke für die Hilfe!

+0

Vorschlag zum Erstellen einer Prozedur auf dem Remote-Server. –

+0

@AaronBertrand, was würde es ändern? Würden die Indizes verwendet werden?Könnte ich vermeiden, den vollständigen vollqualifizierten Namen des Verbindungsservers in meiner gespeicherten Prozedur anzugeben? –

+0

Ja und ja. Und Sie könnten ein Synonym für den Namen der gespeicherten Prozedur anstelle der Ansicht erstellen. –

Antwort

1

Die angenommene Antwort für this post auf dba.stacexchange.com stellt fest, dass Leistungsgotchas in Abfragen über Verbindungsserver aufgrund beschränkter Zugriffsrechte auf dem Verbindungsserver auftreten können, die Sichtbarkeit der Tabellenstatistik auf dem lokalen Server einschränkt. Dies kann sich auf den Abfrageplan und somit auf die Leistung auswirken.

Auszug:

Und das ist, warum ich unterschiedliche Ergebnisse bekommen. Beim Ausführen als sysadmin erhielt ich die vollständige Verteilungsstatistik, die anzeigte, dass es keine Zeilen mit der Auftrags-ID> 20000 gab und der Schätzwert eine Zeile war. (Denken Sie daran, dass der Optimierer niemals null Zeilen von Statistiken annimmt.) Wenn jedoch als einfacher Benutzer ausgeführt wird, ist DBCC SHOW_STATISTICS mit einem Berechtigungsfehler fehlgeschlagen. Dieser Fehler wurde nicht weitergegeben, stattdessen akzeptierte der Optimierer , dass keine Statistiken vorhanden waren und verwendete Standardwerte . Da es Kardinalitätsinformationen erhalten hat, hat es gelernt, dass die entfernte Tabelle 830 Zeilen hat, woher die Schätzung von 249 Zeilen.

+0

Ich kann sehen, wie Leistung einer Abfrage auf einem Verbindungsserver von vielen Problemen profitieren konnte, aber warum der Unterschied zwischen der Synonymabfrage und der verknüpften Tabelle; Letztlich gibt das Synonym die gleiche Verbindung, es sei denn, Sie vermuten, dass ein anderes Zugriffsrecht auf das Synonym selbst gesetzt sein könnte? – PhillipH

+1

@PhillipH: Offensichtlich * etwas * ist für das Synonym unterschiedlich; Diese Erklärung scheint ausreichend zu sein, um die beobachtete Leistungsverschlechterung zu verursachen, so dass es sich lohnt, sie auf dem entfernten Server zu überprüfen. –

2

Ich würde die Datendump ohne die Reihenfolge von in eine temporäre Tabelle auf lokalen Server. Dann würde ich aus der Tempentabelle mit der Reihenfolge nach auswählen. Order by ist fast immer der Mörder.

Verwandte Themen