PostgreSQL opprette indeks samtidig

PostgreSQL opprette indeks samtidig
Mange brukere liker å bruke PostgreSQL fordi det tillater å kjøre flere operasjoner samtidig. Imidlertid krever forskjellige scenarier at postgres skal blokkere en operasjon til den som kjører er fullført før vi kjører en annen.

Postgres er avhengig av forskjellige låser for å garantere at alle transaksjoner kan kjøres som forventet. Transaksjonen som først oppnår en lås må fullføres. Med mindre en tilbakeføring eller forpliktelse blir gjort, kan ikke en annen transaksjon gå frem på grunn av låsen. Vårt fokus i dag er å forstå hvordan man lager indekser samtidig for å unngå å låse.

Hvordan fungerer låsing

Før du dykker til å lage indekser samtidig, er det verdt å forstå hvordan postgres implementerer låser og ser hvordan de påvirker transaksjonen med mindre du vet hvordan du skal takle dem.

For denne saken oppretter vi en tabell og setter i gang en transaksjon for å endre tabellen for å legge til en ny kolonne. Fra følgende bilde kan vi se at når alter -transaksjonen får tak i låsen som den første transaksjonen, unnlater Select -kommandoen å svare i det andre PSQL -skallet.

Denne saken oppstår fordi den første transaksjonen gir en lås. Du vil støte på en lignende sak når du ikke klarer å indeksere samtidig, som vi vil se i den senere delen.


Men når du utsteder en rullekommando til den første transaksjonen, kan vi umiddelbart merke at låsen blir utgitt. Nå kan den andre transaksjonen fortsette uavbrutt.

Slik fungerer låser på bord. Blokker leser og skriver transaksjoner når en DDL -kommando utføres. Med den forståelsen kan vi gå videre til å lage indekser samtidig.

Hvordan bruke PostgreSQL for å lage en indeks samtidig

Når du oppretter indekser på PostgreSQL, kan operasjonen raskt blokkere alle andre transaksjoner og kan føre til tap. Når du indekserer en tabell, låser Postgres det mot skriveoperasjonene, for eksempel oppdatering og endre operasjoner, til indeksbyggingen er fullført.

Indekstransaksjonen kan ta timer eller lange minutter, avhengig av databasestørrelse. Å låse ut andre transaksjoner i et produksjonsmiljø betyr at systemet kan gjøres ubrukelig til indeksbygget er fullført. Hvis du har et slikt scenario, er den beste løsningen å lage indekser samtidig, noe som vil gjøre unna låser.

Indeksering sikrer samtidig at en transaksjon ikke vil blokkere andre transaksjoner. Dermed kan normale transaksjoner oppstå midt i en byggeprosess. Når du legger til samtidig når indeksering, skanner PostgreSQL den indekserte tabellen og venter på at alle transaksjoner skal avsluttes. Dermed tar indeksering samtidig lengre tid, men sikrer at det ikke oppstår forsinkelser i et produksjonsmiljø. La oss se et eksempel på normal indeksering for å forstå hvordan låsing kan forårsake kaos i et produksjonsmiljø.


Her har vi en tabell som heter “Detaljer” der vi fikk tilgang til på Postgres Shell. Anta at vi ønsker å opprette en "Btree" -indeks på en kolonne. Vi kan utføre følgende kommando:

Indeksen vår er vellykket opprettet fordi vi har å gjøre med et lite bord.

Imidlertid kan den samme kommandoen ta timer å utføre hvis du er i et levende produksjonsmiljø. Hvis du åpner et annet PSQL -skall og prøver å skrive til samme tabell, vil ikke skallet svare før indekseringen er fullført. Hvis noen prøver å oppdatere, sette inn eller utføre en annen skriveoperasjon, vil de bli låst ut.

Et slikt scenario kan fikses ved å indeksere den samme tabellen samtidig. Følgende er syntaks for å lage en indeks samtidig:

Opprett indeks samtidig indeksnavn på tabellnavn (kolonnavn)


Hvis vi skal gjenta den samme indeksen som vi gjorde tidligere, men i dette tilfellet, samtidig, ville vår nye kommando være som følger:

I dette tilfellet, hvis indekseringen tar lengre tid og vi åpner et annet skall for å utføre en skriveoperasjon til tabellen som vi indekserer, kunne vi ikke få noen låsfeil siden indeksbygget er gjort samtidig.

Du kan også opprette en "unik samtidig indeks" ved å legge til det "unike" nøkkelordet. Unik indeksering eliminerer redundans og reiser feil når den oppdager en overflødig kolonneverdi.


Her er et eksempel på unik samtidig indeksering:

Når du ser indekstabellen, vil du merke at indekseringen skjedde vellykket, og du kan se hvilken kolonne som har den unike indekseringen.

# \ d tabellnavn;

Konklusjon

Å opprette en indeks uten en samtidig tilnærming fører til låsing og blokkering av transaksjoner. Når du indekser samtidig, vil indeksbygget imidlertid fullføre uten å forhindre at andre transaksjoner oppstår. Dette innlegget hjelper deg å forstå hvordan låsing fungerer når du jobber med tabeller i Postgres. Videre forklarte vi hvordan vi oppretter en indeks samtidig for å unngå låsing når vi jobber med PostgreSQL.