Domanda

Quali sono i diversi tipi di indici, quali sono i vantaggi di ciascuno?

Ho sentito parlare di indici di copertura e cluster, ce ne sono altri? Dove li useresti?

È stato utile?

Soluzione

  • Unico: garantisce valori univoci per la colonna (o il set di colonne) incluso nell'indice
  • Copertura: include tutte le colonne utilizzate in una particolare query (o insieme di query), consentendo al database di utilizzare solo l'indice e di non dover effettivamente guardare i dati della tabella per recuperare i risultati
  • Cluster: questo è il modo in cui i dati effettivi vengono ordinati sul disco, il che significa che se una query utilizza l'indice cluster per cercare i valori, non è necessario eseguire il passaggio aggiuntivo per cercare la riga della tabella effettiva per tutti i dati non inclusi nell'indice.

Altri suggerimenti

OdeToCode ha un buon articolo che copre le differenze di base

Come dice l'articolo:

  

Gli indici corretti sono fondamentali per il bene   prestazioni in grandi database.   A volte puoi compensare male   query scritta con un buon indice, ma   può essere difficile compensare i poveri   indicizzazione anche con le migliori query.

Anche vero ... Se avessi appena iniziato, mi concentrerei su indici cluster e compositi, dal momento che probabilmente saranno quelli che usi di più.

Aggiungerò un paio di tipi di indice

BITMAP - quando hai un numero molto basso di diversi valori possibili, molto veloce e non occupa molto spazio

PARTITIONED: consente di partizionare l'indice in base ad alcune proprietà generalmente vantaggiose su oggetti di database molto grandi per motivi di archiviazione o prestazioni.

Indici FUNZIONE / ESPRESSIONE: usati per pre-calcolare un valore basato sulla tabella e memorizzarlo nell'indice, un esempio molto semplice potrebbe essere un indice basato su lower () o una funzione di sottostringa.

PostgreSQL consente indici parziali, in cui sono indicizzate solo le righe che corrispondono a un predicato. Ad esempio, potresti voler indicizzare la tabella dei clienti solo per quei record che sono attivi. Questo potrebbe assomigliare a:

create index i on customers (id, name, whatever) where is_active is true;

Se il tuo indice è composto da più colonne e hai molti clienti inattivi, questa può essere una grande vittoria in termini di spazio (l'indice verrà archiviato in un numero inferiore di pagine del disco) e quindi le prestazioni. Per raggiungere l'indice è necessario, come minimo, specificare il predicato:

select name from customers where is_active is true;

La saggezza convenzionale suggerisce che la scelta dell'indice dovrebbe essere basata sulla cardinalità. Diranno,

  

Per una colonna bassa cardinalità come GENDER, utilizza bitmap. Per una alta cardinalità come LAST_NAME, usa b-tree.

Questo non è il caso di Oracle , dove la scelta dell'indice dovrebbe invece basarsi sul tipo di applicazione (OLTP vs. OLAP). Il DML su tabelle con indici bitmap può causare seri conflitti di blocco. D'altra parte, Oracle CBO può facilmente combinare più indici bitmap insieme e gli indici bitmap possono essere utilizzati per cercare valori null. Come regola generale:

  

Per un sistema OLTP con frequenti DML e query di routine, utilizzare btree. Per un sistema OLAP con query DML e ad hoc poco frequenti, utilizzare bitmap.

Non sono sicuro che ciò si applichi ad altri database, i commenti sono ben accetti. I seguenti articoli trattano ulteriormente l'argomento:

Diversi sistemi di database hanno nomi diversi per lo stesso tipo di indice, quindi fai attenzione. Ad esempio, ciò che SQL Server e Sybase chiamano "indice cluster" viene chiamato in Oracle una "tabella organizzata per indice".

Ti suggerisco di cercare nei blog di Jason Massie ( http://statisticsio.com/ ) e Brent Ozar ( http://www.brentozar.com/ ) per informazioni correlate. Hanno alcuni post sullo scenario della vita reale che si occupa degli indici.

Oracle ha varie combinazioni di b-tree, bitmap, partizionati e non partizionati, byte inverso, bitmap join e indici di dominio.

Ecco un link alla documentazione di 11gR1 sull'argomento: http://download.oracle.com/docs/cd/B28359_01/server.111/b28274/data_acc.htm#PFGRF004

  1. Unico
  2. cluster
  3. non cluster
  4. archivio colonne
  5. Indice con colonna inclusa
  6. l'indice viene calcolato colonna
  7. filtrato
  8. spaziale
  9. xml
  10. testo completo

SQL Server 2008 ha indici filtrati , simile agli indici parziali di PostgreSQL . Entrambi consentono di includere nell'indice solo le righe corrispondenti ai criteri specificati.

La sintassi è identica a PostgreSQL:

create index i on Customers(name) where is_alive = cast(1 as bit);

Per visualizzare i tipi di indici e le visite di significato: https://msdn.microsoft.com/en-us/library/ms175049.aspx

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