PostgreSQL crea automaticamente indici su chiavi primarie e vincoli univoci, ma non sul lato di riferimento delle relazioni di chiavi esterne.
Quando Pg crea un indice implicito emetterà un NOTICE
-level messaggio che puoi vedere in psql
e/o i log di sistema, così puoi vedere quando succede. Gli indici creati automaticamente sono visibili in \d
output anche per una tabella.
La documentazione sugli indici univoci dice:
PostgreSQL crea automaticamente un indice per ogni vincolo univoco e vincolo della chiave primaria per imporre l'unicità. Pertanto, non è necessario creare un indice in modo esplicito per le colonne della chiave primaria.
e la documentazione sui vincoli dice:
Poiché un DELETE di una riga dalla tabella di riferimento o un UPDATE di una colonna referenziata richiederà una scansione della tabella di riferimento per le righe corrispondenti al vecchio valore, è spesso una buona idea indicizzare le colonne di riferimento. Poiché ciò non è sempre necessario e sono disponibili molte scelte su come indicizzare, la dichiarazione di un vincolo di chiave esterna non crea automaticamente un indice sulle colonne di riferimento.
Quindi devi creare tu stesso indici sulle chiavi esterne se li vuoi.
Nota che se utilizzi chiavi primarie-estere, come 2 FK come PK in una tabella da M a N, avrai un indice sulla PK e probabilmente non avrai bisogno di creare indici aggiuntivi.
Sebbene di solito sia una buona idea creare un indice su (o includendo) le colonne della chiave esterna del lato di riferimento, non è necessario. Ogni indice che aggiungi rallenta leggermente le operazioni DML, quindi paghi un costo di performance su ogni INSERT
, UPDATE
o DELETE
. Se l'indice viene utilizzato raramente, potrebbe non valerne la pena.