C'è un modo in cui posso capire il modo migliore per sapere quali indici creare per una tabella?
WHERE
clausole.
C'è un modo in cui posso capire il modo migliore per sapere quali indici creare per una tabella?
WHERE
clausole.
Risposte:
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.)
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.
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).
Vi sono due opzioni.
La risposta per farlo da soli è piuttosto esaurientemente documentata qui. Quindi diamo un'occhiata a qualcos'altro.
Pghero potrebbe essere in grado di aiutarti se desideri una consulenza automatica.
Detto questo ha alcune carenze.
WHERE
e ORDER BY
, no JOINS
.Guarda questo video per ulteriori informazioni .