Domanda

Mi è stato detto e letto ovunque (ma nessuno ha osato spiegare il perché) che quando compongo un indice su più colonne dovrei mettere prima la colonna più selettiva, per ragioni di prestazioni.Perché?È un mito?

È stato utile?

Soluzione

  

I dovrebbe mettere al primo posto la colonna più selettivo

secondo Tom , colonna selettività non ha alcun impatto sulle prestazioni per le query che utilizzano tutte le colonne nell'indice (che influisce la capacità di Oracle di comprimere l'indice).

  

Non è la prima cosa, non è la cosa più importante. Certo, è una cosa da considerare, ma è relativamente lontano laggiù nel grande schema delle cose.

     

In alcuni casi strani, molto peculiari e anomale (come sopra con i dati realmente del tutto distorta), la selettività potrebbe facilmente importa tuttavia, sono

     

a) piuttosto raro   b) veramente dipende dai valori utilizzati in fase di esecuzione, come tutte le query inclinate sono

     

Quindi, in generale, un'occhiata alle domande che avete, cercare di minimizzare gli indici necessari sulla base di questo.

     

Il numero di valori distinti in una colonna in un indice concatenato non è rilevante se si considera   la posizione nell'indice.

Tuttavia, queste considerazioni dovrebbe venire secondo momento di decidere su ordine della colonna di indice. Ancora più importante è quello di garantire che l'indice può essere utile a molte domande, in modo da l'ordine delle colonne deve riflettere l'uso di tali colonne (o la sua mancanza) nelle clausole WHERE della query (per la ragione illustrata da AndreKR).

  

come si utilizza l'indice - che è ciò che è rilevante al momento di decidere

.

Tutte le altre cose sono uguali, mi sarebbe ancora mettere al primo posto la colonna più selettivo. Si sente solo a destra ...

Aggiornamento: Un'altra citazione da Tom (grazie a Milano per trovarlo).

  

In Oracle 5 (sì, la versione 5!), V'è stato un argomento per collocare il maggior numero di colonne selettivi primo   in un indice.

     

Da allora, non è vero che mettere le voci più esigenti prima nell'indice   renderà l'indice più piccolo o più efficiente. Sembra che lo farà, ma non lo farà.

     

Con index   compressione chiave, v'è un argomento convincente per andare nella direzione opposta in quanto può rendere l'indice   più piccoli. Tuttavia, dovrebbe essere guidato da come si utilizza l'indice, come affermato in precedenza.

Altri suggerimenti

È possibile omettere le colonne da destra a sinistra quando si utilizza un indice, vale a dire quando si dispone di un indice su col_a, col_b è possibile utilizzarlo in WHERE col_a = x ma non è possibile utilizzarlo in WHERE col_b = x.

Immaginate di avere un elenco telefonico che è allineati secondo i primi nomi e quindi dagli ultimi nomi.

Almeno in Europa e nomi degli Stati Uniti hanno una selettività molto inferiore a quello cognome, in modo da guardare il primo nome non sarebbe restringere il set di risultati molto, quindi ci sarebbe ancora molte pagine per verificare la corretta cognome.

L'ordinamento delle colonne nell'indice dovrebbe essere determinato dal vostre domande e non essere ogni considerazione di selettività. Se si dispone di un indice su (a, b, c), e la maggior parte delle singole domande di colonna sono contro la colonna C, seguita da una, poi metterli in ordine di c, a, b nella definizione di indice per la migliore efficienza . Oracle preferisce usare il bordo anteriore dell'indice per la query, ma può utilizzare altre colonne nell'indice in un percorso di accesso meno efficiente noto come skip-scan.

Più il tuo indice è selettivo, più veloce sarà la ricerca.

Immagina semplicemente una rubrica:puoi trovare qualcuno principalmente velocemente per cognome.Ma se hai molte persone con lo stesso cognome, durerai più tempo a cercare la persona guardando ogni volta il nome.

Quindi è necessario fornire innanzitutto le colonne più selettive per evitare il più possibile questo problema.

Inoltre, dovresti assicurarti che le tue query utilizzino correttamente questi "criteri di selettività".

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top