SQL Academy · Oppitunti

MVCC ja paisumisen syyt

Ymmärrä moniversioinen samanaikaisuudenhallinta, miksi kuolleita monisteita kertyy ja miten pitkät transaktiot aiheuttavat paisumista.

Oppitunti 1/414 vaihetta

MVCC ja paisumisen syyt on ilmainen SQL Academy-oppitunti CoddyKitissä. Tämä on oppitunti 1/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu SQL Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. SQL Academy-kurssilla on yhteensä 4 oppituntia.

Mikä MVCC on?

Multi-Version Concurrency Control eli moniversioinen rinnakkaisuudenhallinta. Lukitsemisen sijaan PostgreSQL säilyttää rivistä useita versioita. Lukijat näkevät yhdenmukaisen tilannevedoksen, ja kirjoittajat luovat uusia versioita estämättä lukijoita.

Miten UPDATE toimii

UPDATE ei muuta riviä paikallaan:

  1. Merkitse vanha riviversio ”kuolleeksi” tapahtumassa T
  2. Kirjoita uusi versio
  3. Muut tapahtumat näkevät sen version, jonka niiden tilannevedos sallii

Miksi paisumista syntyy

Kuolleita versioita kertyy. Taulukko kasvaa, vaikka rivimäärä pysyisi samana. Ilman siivousta kyselyt joutuvat käymään läpi yhä enemmän kuolleita rivejä.

Milloin VACUUM vapauttaa tilaa

VACUUM merkitsee kuolleet rivit uudelleenkäytettäviksi (taulukkotiedoston sisällä). Se EI pienennä tiedostoja, elleivät ne ole lopusta kokonaan tyhjiä. VACUUM FULL kirjoittaa taulukon uudelleen — vaatii yksinomaisen lukon ja on hidas.

Autovacuum

PostgreSQL suorittaa autovacuum-prosessia taustalla. Se käynnistyy, kun kuolleiden rivien määrä ylittää raja-arvon:

autovacuum_vacuum_threshold = 50
autovacuum_vacuum_scale_factor = 0.2
-- vacuum when dead_rows > 50 + 0.2 * total_rows

Paisumista aiheuttavat työkuormat

  • Runsas UPDATE-liikenne pienissä tai aktiivisesti käytetyissä taulukoissa
  • Suuret DELETE-erät (VACUUM tarvitaan tilan vapauttamiseen)
  • Pitkään kestävät tapahtumat estävät VACUUMia (ne pitävät tilannevedoksia avoinna)
  • Idle-in-transaction-istunnot kerryttävät kuolleita rivejä aktiivisesti käytettyihin taulukoihin

Paisumisen diagnosointi

pgstattuple-laajennus antaa tarkat luvut:

CREATE EXTENSION pgstattuple;

SELECT * FROM pgstattuple('orders');
-- table_len, tuple_count, dead_tuple_count, free_space, etc.

SELECT * FROM pgstatindex('orders_user_id_idx');

Pitkät tapahtumat estävät VACUUMia

VACUUM voi siivota vain rivit, jotka ovat vanhempia kuin vanhin aktiivinen tapahtuma. Neljä tuntia idle-in-transaction-tilassa oleva istunto tarkoittaa neljän tunnin ajan vapauttamattomia kuolleita rivejä.

SELECT pid, state, xact_start, NOW() - xact_start AS duration
FROM pg_stat_activity
WHERE state IN ('active', 'idle in transaction')
ORDER BY duration DESC NULLS LAST;

Ylivuotosuojaus

Tapahtumatunnukset ovat 32-bittisiä. Jos autovacuum ei pysy mukana, klusteria uhkaa ”wraparound”, ja se siirtyy varmistustilaan (pakotettu VACUUM). Valvokaa seuraavaa:

SELECT datname, age(datfrozenxid) FROM pg_database
ORDER BY age(datfrozenxid) DESC;

Looginen poisto ≠ fyysinen poisto

DELETE merkitsee rivit kuolleiksi; tila voidaan ottaa uudelleen käyttöön vasta VACUUMin avulla. Ilman VACUUMia tehdyt massapoistot jättävät jälkeensä valtavia kuolleiden rivien alueita.

HOT-päivitykset

Jos päivitätte vain indeksoimattomia sarakkeita ja samalla sivulla on vapaa paikka, PostgreSQL tekee HOT- (Heap-Only Tuple) -päivityksen — indeksiä ei tarvitse muuttaa, ja paisumista syntyy vähemmän.

Paisumisen vähentäminen

  • Pidä transaktiot lyhyinä
  • Vältä laajoja UPDATE-lauseita indeksoiduissa sarakkeissa (HOT ei voi toimia)
  • Säädä autovacuum aggressiivisesti kuumille tauluille
  • Käytä pg_repackia taulun uudelleenkirjoittamiseen ilman pitkiä lukituksia

Kertaus

MVCC mahdollistaa samanaikaisuuden, mutta sen seurauksena kuolleita rivejä kertyy.

  • VACUUM puhdistaa kuolleet rivit
  • Autovacuum on välttämätön — älkää poistako sitä käytöstä
  • Pitkät transaktiot estävät puhdistuksen
  • Diagnosoi tilanne pgstattuplella

Pikatarkistus

Miksi UPDATE ei pienennä taulua, vaikka vain yksi sarake muuttuu?

Aloita maksutta

Opi SQL tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
46
Oppitunnit
183

Usein kysytyt kysymykset

Onko oppitunti ”MVCC ja paisumisen syyt” ilmainen?

Kyllä – oppitunnin ”MVCC ja paisumisen syyt” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko SQL Academy-kurssin, päivitä CoddyKit PROhon. SQL Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”MVCC ja paisumisen syyt”?

Ymmärrä moniversioinen samanaikaisuudenhallinta, miksi kuolleita monisteita kertyy ja miten pitkät transaktiot aiheuttavat paisumista. Harjoittelet SQL Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni SQL Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin SQL Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 1/4.

Kuinka kauan ”MVCC ja paisumisen syyt”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä SQL Academy-oppitunnilla?

Kyllä. Jokainen SQL Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. MVCC ja paisumisen syyt
  2. VACUUM, autovacuum, vacuum_cost_delay
  3. ANALYZE ja pg_statistic
  4. Vain indeksin lukevat skannaukset ja näkyvyyskartta
← Takaisin: SQL Academy