2010-02-01 8 views
6

Dato l'istruzione SQL:SQL Server 'In' Dichiarazione posizione ordine per le prestazioni

SELECT * 
FROM MY_TABLE 
WHERE SomeNumberField in (0,99999) 

Se posso garantire che la maggior parte di righe in MY_TABLE hanno SomeNumberField insieme a 99999, e può proiettare che questo rimarrà il caso indefinately, è meglio scrivere query precedente in questo modo:

SELECT * 
FROM MY_TABLE 
WHERE SomeNumberField in (99999,0) 

risposta

4

Se si dispone di un indice su SomeNumberField, allora questa affermazione sarà o semplicemente diviso in due scansioni gamma sull'indice, o trasformati come TABLE SCAN/CLUSTERED INDEX SCAN con un filtro.

Quest'ultimo è più probabile, a condizione che la maggior parte dei file hanno SomeNumberField = 999999

Le scansioni gamma verranno sempre eseguite nell'ordine dell'indice, indipendentemente dalle costanti ordine nella IN predicato.

Il tempo di confronto del filtro è trascurabile rispetto al tempo necessario per recuperare le pagine di dati.

1

questo tipo di ottimizzazione può essere eseguita automaticamente dal programma di ottimizzazione SQL condizione di raccogliere alcune statistiche che vengono utilizzati da l'ottimizzatore. È possibile utilizzare gli strumenti forniti dal fornitore del database per questa attività. Per il server SQL fare riferimento al seguente articolo su MSDN: http://msdn.microsoft.com/en-us/library/cc966419.aspx

Problemi correlati