2009-09-01 15 views
9

Mam wiele baz danych na jednej instancji SQL Server 2005. Stworzyłem synonim w jednej bazie danych, aby uzyskać dostęp do tabeli w innej bazie danych i podczas pisania moich zapytań, chciałbym wykorzystać konkretny indeks przy ocenie planu wykonania wydaje się jednak, że go nie używa. Jeśli piszę zapytanie, aby uzyskać jawnie dostęp do bazy danych, działa, ale nie mogę sprawić, by działało, używając synonimu. Na przykład:Nazwy synonimów SQL Server z indeksami

select * 
from testdb..testtable with (index(testindex)) 

|--Nested Loops(Inner Join, OUTER REFERENCES:([testdb].[dbo].[testtable].[id])) 
    |--Index Scan(OBJECT:([testdb].[dbo].[testtable].[testindex])) 
    |--Clustered Index Seek(OBJECT:([testdb].[dbo].[testtable].[PK_testtable]), SEEK:([testdb].[dbo].[testtable].[id]=[testdb].[dbo].[testtable].[id]) LOOKUP ORDERED FORWARD) 

nie daje taki sam plan wykonania jako

select * 
from testdb_synonym with (index(testindex)) 

|--Clustered Index Scan(OBJECT:([testdb].[dbo].[testtable].[PK_testtable])) 

Czy to ograniczenie z Synonimy czy jest tam coś konkretnego, co należy zrobić, aby to działało?

+1

Czy możesz przesłać plany dotyczące obu zapytań? Po prostu uruchom 'SET SHOWPLAN_TEXT ON GO SELECT ...' – Quassnoi

+0

Zaktualizowałem opis, aby uwzględnić plan wykonania ... –

Odpowiedz

1

Przetestowałem to samo i wygląda na to, że optymalizator zapytań ignoruje tę podpowiedź, gdy robi się to za pomocą synonimu. Szczegóły są takie, że wybrałem opcję * w odniesieniu do dowolnej tabeli z podpowiedzią indeksu, aby użyć indeksu nieklastrowego. Bez synonimu wykonuje on odnośnik do zakładki/zagnieżdżone sprzężenie w pętli. Dzięki niemu skanuje stół. Ponieważ nie ma opcji na składni synonimów, mogę tylko założyć, że wskazówka indeksu jest ignorowana. Brak informacji w BOL, dlaczego? Powiedziałbym to jako "cechę".

+0

Miałem nadzieję, że tak nie będzie ... Zostało reklamowane jako funkcja aliasingu z częścią z korzyścią dla uproszczenia zapisu kropkowego.Rozumiem, że działo się to na serwerze zdalnym, ale jeśli jest to serwer lokalny, miałem nadzieję, że będzie on wystarczająco inteligentny, aby wykorzystać nieodłączne korzyści. –

0

Potrzebujesz podpowiedzi w swojej sprawie? Zalecenia MS to unikanie wskazówek do indeksu, jeśli jest to możliwe, ponieważ może to unieważnić bardziej zoptymalizowany plan. Nawet jeśli jest zoptymalizowany dzisiaj, może być nieefektywny jutro ze względu na ładowanie danych itp.

Próbowałem użyć synonimu bez podpowiedzi w SQL Server 2008 i otrzymałem taki sam plan wykonania z synonimem, jak z pełną nazwą (database.schema.table).

Próbowałem nawet użyć synonimu z podpowiedzią indeksu i pomyślnie wymusiłem wyszukiwanie w nie klastrowanym indeksie (i wyszukiwanie klucza, aby uzyskać pozostałe dane) i otrzymałem taki sam plan wykonania z pełną nazwą.

Czy Twoje statystyki są aktualizowane? Czy masz wskaźnik selektywny lub serwer SQL uważa, że ​​bardziej efektywne jest korzystanie ze skanowania tabeli.

1

WITH INDEX Wskazówki wydają się być ignorowane w przypadku synonimów.

CREATE SYNONYM syn_master FOR master 

SELECT * 
FROM syn_master WITH (INDEX (wow_i_can_write_everything_here)) 

kompiluje i działa w porządku, mimo że nie mają indeks o nazwie wow_i_can_write_everything_here w moim schemacie.

+0

Nie jest już prawdą w przypadku SQL Server 2008 R2. BTW: tworzysz synonim do głównego DB, nie sądzę, by to działało (wybierz * z master ??). –

5

Jest to błąd, że Microsoft mają stałe: patrz MS KB 963684

W programie Microsoft SQL Server 2005, utworzyć synonim na stolik. Uruchomiłeś zapytanie dotyczące synonimu. Zapytanie wykorzystuje wskazówkę optymalizatora INDEX do wymuszenia indeksu na . Jeśli przeanalizujesz plan wykonania wygenerowany dla zapytania , możesz znaleźć plan wykonania, który nie wymaga użycia wymuszonego indeksu.