Cosa succede quando si aggiunge un indice a una tabella esistente con una grande quantità di dati?


11

Ho una tabella che conterrà circa 15 milioni di record. Ora devo aggiungere un indice alla tabella.

L'aggiunta di un indice richiederà del tempo per aggiornare ogni voce della tabella.

Sono abbastanza confuso se l'aggiunta dell'indice causerà tempi di inattività.

Se sì, come posso superare i tempi di fermo?


Risposte:


10

Con plain CREATE INDEX, la tabella sarà bloccata per le scritture ma non per le letture.

Utilizzare CREATE INDEX CONCURRENTLYper evitare anche i blocchi di scrittura.

Dai documenti PostgreSQL suCREATE INDEX :

Quando viene utilizzata questa opzione, PostgreSQL costruirà l'indice senza prendere alcun blocco che impedisce inserimenti, aggiornamenti o eliminazioni simultanee sulla tabella; mentre una build di indice standard blocca le scritture (ma non le letture) sulla tabella fino a quando non viene eseguita. Esistono diversi avvertimenti da tenere presente quando si utilizza questa opzione: consultare la sezione Creazione simultanea di indici .

E più specificamente (come commentato @ypercube ):

PostgreSQL supporta la creazione di indici senza bloccare le scritture . Questo metodo viene invocato specificando l' CONCURRENTLYopzione di CREATE INDEX. Quando viene utilizzata questa opzione, PostgreSQL deve eseguire due scansioni della tabella e inoltre deve attendere tutte le transazioni esistenti che potrebbero potenzialmente utilizzare l'indice per terminare. Pertanto, questo metodo richiede più lavoro totale rispetto a una build di indice standard e richiede molto più tempo per il completamento. Tuttavia, poiché consente alle normali operazioni di continuare durante la creazione dell'indice, questo metodo è utile per aggiungere nuovi indici in un ambiente di produzione.

Enorme enfasi sulla mia.

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.