SQL server-Tabellensynonyme mit Indizes

Ich habe mehrere databaseen auf einer einzigen Instanz von SQL server 2005. Ich habe ein Synonym auf einer database erstellt, um auf eine Tabelle auf einer anderen database zuzugreifen und beim Schreiben meiner Abfragen möchte ich einen bestimmten Index verwenden, allerdings bei der Auswertung Ausführungsplan, scheint es nicht zu verwenden. Wenn ich die Abfrage schreibe, um auf die database explizit zuzugreifen, funktioniert es, aber ich kann es nicht scheinen, es mit einem Synonym zu arbeiten. Beispielsweise:

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) 

ergibt nicht denselben Ausführungsplan wie

 select * from testdb_synonym with (index(testindex)) |--Clustered Index Scan(OBJECT:([testdb].[dbo].[testtable].[PK_testtable])) 

Ist das eine Einschränkung mit Synonymen oder gibt es etwas Besonderes, das ich tun muss, um das zu arbeiten?

Dies ist ein Fehler, den Microsoft behoben hat: siehe MS KB 963684

In Microsoft SQL server 2005 erstellen Sie ein Synonym für eine Tabelle. Sie führen eine Abfrage gegen das Synonym aus. Die Abfrage verwendet den INDEX-Optimierer-Hinweis, um einen Index zu erzwingen. Wenn Sie den Ausführungsplan untersuchen, der für die Abfrage generiert wird, können Sie den Ausführungsplan nicht mit dem erzwungenen Index verwenden.

Ich habe das Gleiche getestet und es scheint, dass der Abfrage-Optimierer diesen Hinweis ignoriert, wenn er über ein Synonym getan wird. Die Details haben ich eine Auswahl * gegen eine beliebige Tabelle mit einem Index-Hinweis, um einen nicht gruppierten Index zu verwenden. Ohne Synonym gibt es ein Lesezeichen-Lookup / verschachtelte Loop-Join. Mit ihm tippt ein Tabellenscan. Da es keine Optionen auf der Synonyme der Synonyme gibt, kann ich nur annehmen, dass der Indexhinweis ignoriert wird. Keine Details in BOL, warum. Ich würde es als "Feature" kreieren.

WITH INDEX Hinweise scheint für Synonyme ignoriert zu werden.

 CREATE SYNONYM syn_master FOR master SELECT * FROM syn_master WITH (INDEX (wow_i_can_write_everything_here)) 

kompiliert und läuft allright trotz der Tatsache, dass ich keinen Index namens wow_i_can_write_everything_here in meinem Schema habe.

Brauchen Sie den Hinweis in Ihrem Fall? MS-Empfehlungen ist es, Index-Hinweise zu vermeiden, wenn es möglich ist, aufgrund der Tatsache, dass ein mehr optimierte Plan ungültig werden kann. Auch wenn es heute optimiert ist, kann es morgen aufgrund von databelastung inefficiens sein.

Ich habe versucht, ein Synonym ohne den Hinweis in SQL server 2008 zu verwenden und bekam den gleichen Ausführungsplan mit dem Synonym wie mit dem voll qualifizierten Namen (database.schema.table).

Ich habe sogar versucht, das Synonym mit einem Index-Tipp zu verwenden und erfolgreich gezwungen eine nicht gruppierte Index suchen (und eine Schlüssel-search, um den Rest der data zu bekommen), und ich bekomme den gleichen Ausführungsplan mit voll qualifizierten Namen.

Sind Ihre statisitics aktualisiert? Haben Sie einen selektiven Index oder SQL server denken, dass es effizienter ist, einen Tabellenscan zu verwenden.