auf local (a SQL Server 2008 R2), ich habe ein Synonym syn_view1
zum verknüpften Server verweist genannt remoteserver.remotedb.dbo.view1
Performance-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!
Vorschlag zum Erstellen einer Prozedur auf dem Remote-Server. –
@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? –
Ja und ja. Und Sie könnten ein Synonym für den Namen der gespeicherten Prozedur anstelle der Ansicht erstellen. –