11

Na LocalServer (SQL Server 2008 R2), mam synonimem nazywa syn_view1 wskazując na serwerze połączonym remoteserver.remotedb.dbo.view1Wydajność efekt Synonimy na serwerze połączonym w programie SQL Server

Ten SLOW zapytanie trwa 20 sekund uruchomić .

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

Ten szybki zapytanie trwa 1 sekundy uruchomić.

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

Jedyna różnica w obu zapytaniach to w rzeczywistości obecność synonimu. Oczywiście, synonim ma wpływ na wydajność zapytania.

plan wykonania dla zapytania SLOW jest:

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 

A dla zapytania szybko:

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 

moim rozumieniu jest to, że w zapytaniu powolny, serwer pobiera wszystkie dane z zdalny serwer, następnie stosuje filtr (ale bez indeksu), podczas gdy w zapytaniu FAST serwer pobiera przefiltrowane dane ze zdalnego serwera, a więc używa zdalnych indeksów.

Czy jest jakiś sposób użycia synonimu podczas bycia szybkim? Może konfiguracja połączonego serwera? lokalny serwer bazy danych?

Dzięki za pomoc!

+0

Zalecamy utworzenie procedury na serwerze zdalnym. –

+0

@AaronBertrand, co by to zmieniło? Czy indeksy będą używane?Czy byłbym w stanie uniknąć podania pełnej, w pełni kwalifikowanej nazwy połączonego serwera w mojej procedurze przechowywanej? –

+0

Tak i tak. Można utworzyć synonim nazwy procedury składowanej zamiast widoku. –

Odpowiedz

1

Zaakceptowana odpowiedź na this post na stronie dba.stacexchange.com zwraca uwagę, że wydajność może wystąpić w zapytaniach dotyczących serwerów połączonych z powodu ograniczonych praw dostępu na połączonym serwerze, ograniczając widoczność statystyk tabel do lokalnego serwera. Może to wpłynąć na plan zapytania, a tym samym wydajność.

Fragment:

I dlatego mam różne wyniki. Po uruchomieniu jako sysadmin I uzyskał pełną statystykę dystrybucji, która wskazała, że ​​nie ma wierszy z identyfikatorem zamówienia> 20000, a szacunkowy był jeden wiersz. (Przypomnijmy, że optymalizator nigdy nie przyjmuje zerowych wierszy ze statystyk.) Ale gdy działa jako zwykły użytkownik, DBCC SHOW_STATISTICS nie powiodło się z błędem zezwolenia na . Ten błąd nie był propagowany, ale zamiast tego optymalizator zaakceptował brak statystyk i używał domyślnych założeń: . Ponieważ uzyskał on informacje o liczności, dowiedział się, że zdalna tabela ma 830 wierszy, z których wynika oszacowanie 249 wierszy.

+0

Widzę, jak wydajność zapytania na połączonym serwerze może wynikać z wielu problemów, ale dlaczego różnica między zapytaniem o synonim i połączoną tabelą; ostatecznie synonim daje takie samo połączenie, chyba że sugerujesz, że może być inne prawo dostępu ustawione na samym synonimie? – PhillipH

+1

@PhliplipH: Oczywiście * coś * jest inne dla synonimu; to wyjaśnienie wydaje się wystarczające, aby spowodować zauważalne pogorszenie wydajności, więc warto sprawdzić na zdalnym serwerze. –

2

chciałbym zrzucić dane bez kolejność przez do tabeli temp na serwerze lokalnym. Wtedy wybrałbym z tabeli tymczasowej z zamówieniem przez. Zamówienie przez prawie zawsze jest zabójcą.

Powiązane problemy