2014-07-26 18 views
6

sto cercando di eseguire il seguente comando per forzare un aggiornamento per utilizzare un indice non cluster:SQL Server - Come suggerire un indice su un comando di aggiornamento?

UPDATE Flights 
SET Airtime=5555678 
WHERE Distance=10000 
OPTION (TABLE HINT(Flights, INDEX (DistanceIndex))) 

... ed è erroring:

Msg 8724, livello 16, stato 1, riga 75
Impossibile eseguire la query. La funzione TABLE HINT della funzione TABLE HINT non può essere specificata nella tabella o nella funzione OPENROWSET.

Non riesco a trovare alcun consiglio chiaro su come la sintassi dovrebbe essere formata correttamente all'interno dell'istruzione TABLE HINT.

Per favore qualcuno può consigliare dove sto andando male?

risposta

7

Prova seguente:

UPDATE F 
SET F.Airtime=5555678 
FROM Flights F WITH (INDEX (DistanceIndex)) 
WHERE F.Distance=10000 

o

UPDATE Flights 
SET Airtime=5555678 
FROM Flights -- this line is added to your initial query 
WHERE Distance=10000 
OPTION (TABLE HINT(Flights, INDEX (DistanceIndex))) 
+0

molte grazie per i vostri commenti. Entrambi i metodi sopra hanno funzionato per me, con un impatto identico sui piani di esecuzione. Cordiali saluti, Jon – Jon295087

4

@ di i-una risposta è corretta e il metodo consigliato.

È inoltre possibile utilizzare

UPDATE F 
SET Airtime = 5555678 
FROM Flights F 
WHERE Distance = 10000 
OPTION (TABLE HINT(F, INDEX (DistanceIndex))) 

But the documentation states

Si consiglia di utilizzare l'INDEX, FORCESCAN o un tavolo FORCESEEK suggerimento come un suggerimento interrogazione solo nel contesto di una guida di piano.

+0

@ MartinSmith- molte grazie per i vostri commenti. Apprezzo che questo approccio si scagli contro le migliori pratiche: mi interessava solo notare la differenza di prestazioni nell'operazione se potevo forzare l'uso di un indice secondario [meno efficiente]. Leggo ulteriormente l'uso di FORCESCAN e FORCESEEK, poiché non ho esaminato questi approcci. Cordiali saluti, Jon – Jon295087