2013-12-18 6 views
6

Ho semplice query:NON SQL nella dichiarazione dei dati non è recuperato utilizzando Indice

SELECT * FROM MH.APPOINTMENT WHERE DOCTOR_INC_ID = 1391791151 

Quando esamino il piano di esecuzione, vedo che i dati vengono recuperati utilizzando indice

Tuttavia la seguente query:

SELECT * FROM MH.APPOINTMENT WHERE DOCTOR_INC_ID NOT IN (1391791151) 

non beneficia del nostro indice. Stiamo usando Oracle 11g Release2. Qualsiasi suggerimento è benvenuto. Grazie

+0

Che tipo di RDBMS stai utilizzando? La risposta dipende da questo. –

+0

Oracle 11 g release 2 – cgon

risposta

7

Semplicemente non pagherà per utilizzare l'indice per questo tipo di query - non è abbastanza selettivo. Se si prevede che la query recuperi una riga (o un piccolo numero di righe rispetto alla dimensione della tabella, diciamo 1%), è possibile trovare i valori molto rapidamente prima cercando un indice e quindi restituendo le righe associate dall'effettivo tavolo. Ma se si prevede che la query restituisca il 99% delle righe, non ha senso cercarle in un idex e quindi recuperare le righe associate: è troppo lavoro. Invece il motore va dritto per la scansione del tavolo.

+0

Può sembrare diverso quando si utilizza un indice bitmap. Tuttavia, sono utili solo se i valori sono ** non ** selettivi –

15

Quando vivi negli Stati Uniti, chiedi "New York" e "Washington", identificherai facilmente la posizione. Perché, sono indicizzati nella tua memoria. Dove-come, quando richiesto per tutte le città tranne "New York", dovrai comunque recuperare tutte le città dalla tua memoria, il che ovviamente non è così semplice come in passato !!!

Può sembrare divertente, ma questo è il concetto di scansione indice e scansione tabella completa.

+0

+1 per una buona spiegazione – MinhD

+0

esempio davvero bello ... – SriniV