2012-08-28 12 views
6

Ho letto in molti libri e articoli SQL che la selettività è un fattore importante nella creazione dell'indice. Se una colonna ha una bassa selettività, una ricerca indice fa più male che bene. Ma nessuno degli articoli spiega perché. Qualcuno può spiegare perché è così, o fornire un link a un articolo pertinente?Ruolo della selettività nella scansione indice/ricerca

risposta

7

Dall'articolo SimpleTalk da Robert Sheldon: 14 SQL Server Indexing Questions You Were Too Shy To Ask

Il rapporto dei valori unici all'interno di una colonna chiave viene indicato come indice selettività. Più i valori sono univoci, maggiore è la selettività, , il che significa che un indice univoco ha la massima selettività possibile. Il motore di query ama le colonne chiave altamente selettive, specialmente se le colonne fanno riferimento nella clausola WHERE delle query di esecuzione di frequente . Maggiore è la selettività, più velocemente il motore di query può ridurre la dimensione del set di risultati. Il rovescio della medaglia, ovviamente, è che una colonna con relativamente pochi valori unici raramente è un buon candidato da indicizzare.

controllare anche questi articoli:

Dall'articolo SqlServerCentral:

In generale, un indice non cluster dovrebbe essere selettiva. Vale a dire, i valori nella colonna dovrebbero essere abbastanza unici e le query che filtrano su di esso dovrebbero restituire piccole parti della tabella.

La ragione di questo è che le ricerche chiave/RID sono operazioni costose e se un indice non cluster deve essere utilizzato per valutare una query deve essere coprendo o sufficientemente selettivi che i costi delle ricerche non sono ritenuto troppo alto

Se SQL considera l'indice (o il sottoinsieme delle chiavi di indice che la query sarebbe sollecitare con) non sufficientemente selettivi, allora è molto probabile che l'indice viene ignorato e la query eseguita come un indice cluster (tabella) scansione.

È importante notare che questo non si applica solo alla colonna principale. Esistono scenari in cui una colonna molto non selezionabile può essere utilizzata come colonna principale, con le altre colonne dell'indice che rendono abbastanza selettiva da essere utilizzata.

+0

Siete i benvenuti, assicuratevi di testare prima di entrare in produzione per evitare i tempi di fermo e quindi i visi arrabbiati degli utenti;) – Yaroslav

2

provo a scrivere una spiegazione molto semplice (in base alla mia attuale conoscenza di SQL Server):

Se un indice ha una bassa selettività significa che per lo stesso valore percentuale maggiore del totale righe sono trovato.(come 200 dalle 500 righe ha lo stesso valore sull'indice)

Di solito se l'indice non contiene tutte le informazioni sulla colonna di ciò che serve, allora sta usando un puntatore, dove trovare la riga fisicamente che è collegato a quella "voce" sull'indice. Quindi in un secondo momento il motore deve leggere quella riga.

Così come si vede una ricerca come questa utilizzando due passaggi. E qui arriva la selettività:

Altri risultati si ottengono grazie alla bassa selettività più doppio lavoro che il motore deve fare. Quindi ci sono alcuni casi a causa di questo fatto in cui anche una scansione della tabella è più efficiente di una ricerca indice con selettività molto bassa.

+0

Ma il numero di risultati è maggiore anche per la scansione delle tabelle. Almeno in caso di ricerca indice, il salto alla porzione del blocco dati contenente i record simili è più veloce. – SexyBeast

+1

Ma con la scansione di una tabella stai leggendo una volta, non una specie di due volte. E devi calcolare il tempo di "headmove" negli harddrives non ssd che è il più costoso dell'intero processo. –

Problemi correlati