Necessità di indici su chiavi esterne


30

Sto lottando con indici, chiavi primarie e chiavi esterne ... E la necessità di averle tutte.

Se ho due tabelle, entrambe hanno un numero intero come chiave primaria.
La prima tabella fa riferimento tramite un FK alla chiave primaria della seconda tabella.

  • Su entrambe le tabelle ho un indice chiave primaria nella colonna ID
  • Ho creato un vincolo FK sul table1.ref_fieldriferimento al PK della seconda tabella ( table2.id)
  • e ho aggiunto un indice su table1.ref_field

È questo il modo migliore per organizzare questi indici, chiavi primarie ed esterne?

Risposte:


30

Il tuo design è buono. Se si riscontra un problema di prestazioni (che non è possibile conoscere in fase di progettazione), è necessario creare un indice sulla colonna table1.ref_field, nello stesso ordine (ASC) della colonna table2.id. Ciò migliorerà le prestazioni sui join tra quelli a tabelle / colonne. Esiste un sovraccarico per la gestione di qualsiasi indice, quindi si desidera ponderare tale costo a vantaggio del miglioramento delle prestazioni.

PostgreSQL non crea automaticamente tali indici su colonne di chiavi esterne che fanno riferimento ad altre colonne, sfortunatamente, quindi devi farlo da solo.

Ecco una domanda StackOverflow sullo stesso argomento:

Postgres e indici su chiavi esterne e chiavi primarie

Ecco una query per determinare dove potresti trarre vantaggio dall'aggiunta di un tale indice:

Postgresql: indici su chiavi esterne


Non è sempre sfortunato: se non lo fai DELETEdalla tabella di riferimento, puoi risparmiare un sacco di I / O e CPU evitando di mantenere un indice inutilizzato. Penso che dovrebbe essere creato per impostazione predefinita, basta avere un'opzione per sopprimerne la creazione.
Craig Ringer,

Craig Ringer Non solo DELETE può avere un impatto su questo, se hai selezionato dalle tabelle partent a quelle secondarie, avrai anche problemi di prestazioni. Questa documentazione di Oracle spiega di più: asktom.oracle.com/pls/asktom/…
777Anon
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.