Come faccio a sapere quali indici creare per una tabella?


33

C'è un modo in cui posso capire il modo migliore per sapere quali indici creare per una tabella?


11
C'è. Prova ad usare-the-index-luke.com per esempio.
dezso

La risposta che ho visto di più è che dovresti indicizzare le chiavi e le colonne primarie che usi nelle WHEREclausole.
Oskar Persson,

Per favore, non farlo. Una chiave primaria definisce come i dati sono fisicamente ordinati nella tabella e ha le sue considerazioni. Devi selezionare la chiave primaria con molta attenzione poiché viene utilizzata anche in tutti gli altri indici. Fare riferimento a: sqlskills.com/blogs/kimberly/…
Ali Razeghi,

4
@AliRazeghi That (ordinamento fisico) è vero in alcuni DBMS (in determinate circostanze) e non in altri. Ad esempio, non vero in PostgreSQL.
dezso

Voto di backup!
Ali Razeghi,

Risposte:


29

Brevi regole empiriche. (Alcuni di questi vengono creati automaticamente, ma possono eventualmente essere eliminati manualmente in un secondo momento, a seconda dei dbms. Non dare per scontato che lavorerai sempre su PostgreSQL.)

  • Indicizza ogni chiave primaria.
  • Indicizza ogni chiave esterna.
  • Indicizza ogni colonna utilizzata in una clausola JOIN.
  • Indicizza ogni colonna utilizzata in una clausola WHERE.
  • Studia la tua documentazione per apprendere le opzioni di indicizzazione "esoterica" ​​supportate dal tuo dbms.

Ogni chiave primaria significa che le chiavi primarie a più colonne dovrebbero avere un singolo indice che copre tutte le colonne. PostgreSQL creerà automaticamente questo indice se dichiari una chiave primaria multi-colonna.

Esistono molti casi in cui un singolo indice a più colonne offre prestazioni migliori rispetto a diversi indici a colonna singola. Monitora le query lente ed esegui i test per capire quale è quale.

Supponiamo che qualsiasi modifica all'indicizzazione migliorerà alcune attività del database e ne degraderà altre. Trovo utile disporre di una serie di istruzioni SQL che posso profilare prima e dopo aver apportato modifiche agli indici. Questo set include le istruzioni SELECT, INSERT, UPDATE e DELETE.

Non c'è sostituto per studiare i documenti per i tuoi particolari dbms.

  • CREA INDICE
  • Indici (notare in particolare le sezioni sulle espressioni di indicizzazione, sugli indici parziali e sull'esame dell'utilizzo degli indici)

14

Oltre a quanto già fornito da @Catcall , e per aggiungere un piccolo correttivo:

Di recente ho anche trattato alcune nozioni di base in questa risposta strettamente correlata su SO .

Finora le risposte sembrano indicare la necessità di creare indici su chiavi primarie, ma non è così in PostgreSQL (si applicano eccezioni parziali). Cito il manuale qui :

PostgreSQL crea automaticamente un indice univoco quando viene definito un vincolo univoco o chiave primaria per una tabella. L' indice copre le colonne che costituiscono la chiave primaria o il vincolo univoco (un indice a più colonne , se appropriato), ed è il meccanismo che applica il vincolo.

Enorme enfasi sulla mia.

Si potrebbe voler creare indici aggiuntivi per la seconda o successive colonne di un indice a più colonne, ma il primo è in genere coperto bene da un indice a più colonne - tranne quando colonne aggiuntive rendono l'indice molto più grande. Ne abbiamo discusso in dettaglio sotto questa domanda correlata:

Un indice composito è utile anche per le query sul primo campo?

Gli indici a più colonne , gli indici parziali e gli indici sulle espressioni sono strumenti particolarmente potenti in PostgreSQL. Da PostgreSQL 9.2 esistono anche scansioni solo indice , l'equivalente di "indici di copertura" in altri RDBMS. Questo non è un altro tipo di indice, ma una nuova funzionalità di RDBMS con tipi di indice esistenti.

Ogni indice comporta costi specifici , quindi non è possibile aggirare alcune conoscenze di base per ottimizzare realmente l'indicizzazione. Basta creare più indici può fare più male che bene. In particolare, gli indici possono impedire agli aggiornamenti HOT di migliorare le prestazioni.

In generale, le operazioni di scrittura ( DELETE, UPDATE) diventano più costose (ma possono anche trarne vantaggio!), Mentre le operazioni di lettura ( SELECT) generalmente ne beneficiano. Troppi indici possono esaurire la memoria cache in modo che anche le operazioni di lettura possano risentirne.

Infine, questa pagina Wiki di Postgres sugli strumenti di manutenzione degli indici offre strumenti per trovare indici duplicati o non utilizzati (tra le altre cose).


Se ricordo bene, l'indice automatico su PK viene creato anche su Oracle v.> = 10 e SQL Server> = 2008
EAmez

1

Vi sono due opzioni.

  1. Lo fai.
  2. La tecnologia lo fa.

La risposta per farlo da soli è piuttosto esaurientemente documentata qui. Quindi diamo un'occhiata a qualcos'altro.

Pghero

Pghero potrebbe essere in grado di aiutarti se desideri una consulenza automatica.

Detto questo ha alcune carenze.

  1. Funziona solo su WHEREe ORDER BY, no JOINS.
  2. Utilizza solo statistiche su percentuale NULL e valori distinti.

Guarda questo video per ulteriori informazioni .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.