2009-09-01 12 views
9

Ho più database su una singola istanza di SQL Server 2005. Ho creato un sinonimo su un database per accedere a una tabella su un altro database e quando si scrivono le mie query, mi piacerebbe utilizzare un indice specifico, tuttavia, quando si valuta il piano di esecuzione, non sembra utilizzarlo. Se scrivo la query per accedere esplicitamente al database, funziona, ma non riesco a farlo funzionare usando un sinonimo. Per esempio:Tabella SQL Server Sinonimi con indici

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) 

non cede lo stesso piano di esecuzione come

select * 
from testdb_synonym with (index(testindex)) 

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

Si tratta di una limitazione con Sinonimi o c'è qualcosa di specifico che devo fare per ottenere questo lavoro?

+1

Potresti pubblicare i piani sottostanti per entrambe le domande? Basta eseguire 'SET SHOWPLAN_TEXT ON GO SELECT ...' – Quassnoi

+0

Ho aggiornato la descrizione per includere il piano di esecuzione ... –

risposta

1

Ho testato la stessa cosa e sembra che Query Optimizer ignori tale suggerimento quando viene eseguito tramite un sinonimo. I dettagli sono che ho fatto un select * contro una tabella arbitraria con un suggerimento indice per usare un indice non cluster. Senza il sinonimo, fa un bookmark lookup/nested loop join. Con esso, esegue una scansione della tabella. Dal momento che non ci sono opzioni sulla sintassi del sinonimo create, posso solo supporre che l'hint dell'indice sia ignorato. Nessun dettaglio in BOL sul perché. Lo scriverei come "feature".

+0

Speravo che non fosse il caso ... È stato pubblicizzato come una caratteristica di aliasing con parte del beneficio di questo per semplificare la notazione dei punti.Posso capire se stava andando contro un server remoto, ma se si tratta di un server locale, speravo che sarebbe stato abbastanza intelligente da sfruttare i vantaggi intrinseci. –

0

Avete bisogno del suggerimento nel vostro caso? Le raccomandazioni degli Stati membri sono di evitare i suggerimenti sugli indici se è possibile a causa del fatto che potrebbe invalidare un piano più ottimizzato. Anche se è ottimizzato oggi potrebbe essere inefficienti domani a causa del carico di dati ecc.

Ho provato a utilizzare un sinonimo senza il suggerimento in SQL Server 2008 e ho ottenuto lo stesso piano di esecuzione con il sinonimo come con il nome completo (database.schema.table).

Ho persino provato a utilizzare il sinonimo con un suggerimento indice e ho forzato con successo un indice non cluster seek (e una chiave di ricerca per ottenere il resto dei dati), e ottengo lo stesso piano di esecuzione con nome completo.

Le statistiche sono aggiornate? Avete un indice selettivo o SQL Server pensa che sia più efficiente usare una scansione della tabella.

1

WITH INDEX suggerimenti per i sinonimi sembrano ignorati.

CREATE SYNONYM syn_master FOR master 

SELECT * 
FROM syn_master WITH (INDEX (wow_i_can_write_everything_here)) 

compilato ed eseguito allright, nonostante il fatto che non ho un indice di nome wow_i_can_write_everything_here nel mio schema.

+0

Non è più vero per SQL Server 2008 R2. BTW: stai creando un sinonimo del master DB, non penso che funzionerebbe (seleziona * dal master ??). –

5

Si tratta di un bug che Microsoft ha fissato: vedi MS KB 963684

In Microsoft SQL Server 2005, è creare un sinonimo per un tavolo. Esegui una query sul sinonimo. La query utilizza l'hint INDEX optimizer per forzare un indice. Se si esamina il piano di esecuzione generato per la query, è possibile trovare il piano di esecuzione non utilizzare l'indice forzato.