PostgreSQL Crea indice contemporaneamente

PostgreSQL Crea indice contemporaneamente
A molti utenti piace utilizzare PostgreSQL perché consente di eseguire più operazioni contemporaneamente. Tuttavia, diversi scenari richiedono che Postgres blchi di bloccare un'operazione fino a quando quella in esecuzione non viene completata prima di eseguire un altro.

Postgres si basa su diversi blocchi per garantire che tutte le transazioni possano eseguire come previsto. La transazione che prima ottiene un blocco deve essere completata. A meno che non venga effettuato un rollback o un commit, un'altra transazione non può andare avanti a causa del blocco. Il nostro obiettivo oggi è capire come creare indici contemporaneamente per evitare il blocco.

Come funziona il blocco

Prima di immergersi nella creazione di indici contemporaneamente, vale la pena capire come Postgres implementa i blocchi e vedendo come influenzano la transazione a meno che tu non sappia come gestirli.

In questo caso, creiamo una tabella e iniziamo una transazione per modificare la tabella per aggiungere una nuova colonna. Dalla seguente immagine, possiamo vedere che una volta che la transazione alter riceve il blocco come prima transazione, il comando Select non risponde nella seconda shell PSQL.

Questo caso si verifica perché la prima transazione emette un blocco. Ti imbatterai in un caso simile quando non riesci a indicizzare contemporaneamente, come vedremo nella sezione successiva.


Tuttavia, quando si emette un comando di rollback alla prima transazione, possiamo immediatamente notare che il blocco viene rilasciato. Ora, la seconda transazione può procedere ininterrottamente.

Ecco come funzionano le serrature sui tavoli. Blocca le transazioni di lettura e scrittura quando viene eseguito un comando DDL. Con questa comprensione, possiamo passare alla creazione di indici contemporaneamente.

Come utilizzare PostgreSQL per creare un indice contemporaneamente

Quando si creano indici su PostgreSQL, l'operazione può bloccare rapidamente tutte le altre transazioni e portare a perdite. Durante l'indicizzazione di una tabella, Postgres lo blocca contro le operazioni di scrittura, come le operazioni di aggiornamento e alter, fino a quando la build dell'indice non completa.

La transazione indice potrebbe richiedere ore o minuti lunghi, a seconda della dimensione del database. Bloccare altre transazioni in un ambiente di produzione significa che il sistema può essere reso inutilizzabile fino al completamento della costruzione dell'indice. Se hai uno scenario del genere, la soluzione migliore è quella di creare indici contemporaneamente, che eliminerà i blocchi.

L'indicizzazione garantisce contemporaneamente che una transazione non blocchi altre transazioni. Pertanto, le normali transazioni possono verificarsi nel mezzo di un processo di costruzione. Quando si aggiunge contemporaneamente durante l'indicizzazione, PostgreSQL esegue la scansione della tabella indicizzata e attende che tutte le transazioni terminano. Pertanto, l'indicizzazione richiede contemporaneamente ma garantisce che non si verifichino ritardi in un ambiente di produzione. Vediamo un esempio di indicizzazione normale per capire come il blocco può causare il caos in un ambiente di produzione.


Qui, abbiamo una tabella chiamata "Dettagli" in cui abbiamo acceduto alla nostra shell di Postgres. Supponiamo di voler creare un indice "btree" su una colonna. Possiamo eseguire il seguente comando:

Il nostro indice viene creato con successo perché abbiamo a che fare con un tavolo piccolo.

Tuttavia, lo stesso comando potrebbe richiedere ore per eseguire se ti trovi in ​​un ambiente di produzione dal vivo. Se apri un'altra shell PSQL e provi a scrivere sulla stessa tabella, la shell non risponderà fino a quando l'indicizzazione non completa. Se qualcuno cerca di aggiornare, inserire o eseguire un'altra operazione di scrittura, verranno bloccati.

Tale scenario può essere fissato indicizzando la stessa tabella contemporaneamente. Di seguito è la sintassi per creare un indice contemporaneamente:

Crea indice contemporaneamente indice-nome su tabella-name (colonna)


Se dovessimo ripetere lo stesso indice che abbiamo fatto prima ma, in questo caso, contemporaneamente, il nostro nuovo comando sarebbe il seguente:

In questo caso, se l'indicizzazione richiede più tempo e apriamo un'altra shell per eseguire un'operazione di scrittura nella tabella che stiamo indicizzando, non potremmo ottenere alcun errore di blocco poiché la build indice viene eseguita contemporaneamente.

Puoi anche creare un "indice concorrente univoco" aggiungendo la parola chiave "univoca". L'indicizzazione univoca elimina la ridondanza e aumenta gli errori ogni volta che rileva un valore di colonna ridondante.


Ecco un esempio di indicizzazione simultanea univoca:

Quando si visualizza la tabella dell'indice, noterai che l'indicizzazione si è verificata correttamente e puoi vedere quale colonna ha l'indicizzazione univoca.

# \ d Table-nome;

Conclusione

La creazione di un indice senza un approccio simultaneo porta al blocco e al blocco delle transazioni. Tuttavia, quando si indica contemporaneamente, la build indice completa senza impedire che si verifichino altre transazioni. Questo post ti aiuta a capire come funziona il blocco quando si lavora con le tabelle in Postgres. Inoltre, abbiamo spiegato come creare un indice contemporaneamente per evitare il blocco quando lavoriamo con PostgreSQL.