Li-postgres: bloat, pg_repack le lithibelo tse chechisitsoeng

Li-postgres: bloat, pg_repack le lithibelo tse chechisitsoeng

Phello ea bloat litafoleng le li-index e tsebahala haholo 'me ha e fumanehe feela ho Postgres. Ho na le mekhoa ea ho sebetsana le eona ka ntle ho lebokose, joalo ka VACUUM FULL kapa CLUSTER, empa li notlela litafole nakong ea ts'ebetso 'me ka hona li ke ke tsa sebelisoa kamehla.

Sengoliloeng se tla ba le khopolo e nyane mabapi le hore na bloat e etsahala joang, hore na u ka e loants'a joang, mabapi le lithibelo tse chechisitsoeng le mathata ao ba a tlisang ts'ebelisong ea katoloso ea pg_repack.

Sengoliloeng sena se ngotsoe ho latela puo ya ka ho PgConf.Russia 2020.

Ke hobane'ng ha bloat e hlaha?

Postgres e ipapisitse le mofuta oa mefuta e mengata (MVCC). Taba ea eona ke hore mola o mong le o mong o ka har'a tafole o ka ba le liphetolelo tse 'maloa, athe litšebelisano ha li bone tse fetang e' ngoe ea liphetolelo tsena, empa ha ho joalo. Sena se lumella litšebelisano tse 'maloa ho sebetsa ka nako e le' ngoe 'me ha li na tšusumetso ho tse ling.

Ho hlakile hore liphetolelo tsena kaofela li hloka ho bolokoa. Postgres e sebetsa le leqephe la memori ka leqephe mme leqephe ke palo e tlase ea data e ka baloang ho tsoa ho disk kapa ho ngoloa. A re shebeng mohlala o monyenyane ho utloisisa hore na sena se etsahala joang.

Ha re re re na le tafole eo re ekelitseng lirekoto tse 'maloa ho eona. Lintlha tse ncha li hlahile leqepheng la pele la faele moo tafole e bolokiloeng teng. Tsena ke mefuta e teng ea mela e fumanehang bakeng sa lipehelo tse ling ka mor'a boitlamo (bakeng sa ho nolofatsa, re tla nka hore boemo ba ho itšehla thajana ke Read Committed).

Li-postgres: bloat, pg_repack le lithibelo tse chechisitsoeng

Ka mor'a moo, re ntlafalitse e 'ngoe ea likenyo, kahoo ra tšoaea mofuta oa khale hore ha o sa sebetsa.

Li-postgres: bloat, pg_repack le lithibelo tse chechisitsoeng

Mohato ka mohato, ho ntlafatsa le ho hlakola liphetolelo tsa mela, re ile ra qetella re e-na le leqephe leo hoo e ka bang halofo ea data e leng "litšila". Lintlha tsena ha li bonahale tšebetsong efe kapa efe.

Li-postgres: bloat, pg_repack le lithibelo tse chechisitsoeng

Postgres e na le mochine VACUUM, e hloekisang liphetolelo tsa khale le ho fana ka sebaka sa data e ncha. Empa haeba e sa hlophisoa ka mokhoa o mabifi kapa e phathahane ka ho sebetsa litafoleng tse ling, joale "data ea litšila" e sala, 'me re tlameha ho sebelisa maqephe a eketsehileng bakeng sa data e ncha.

Kahoo mohlaleng oa rona, ka nako e itseng tafoleng e tla ba le maqephe a mane, empa halofo ea eona e tla ba le data e phelang. Ka lebaka leo, ha re kena tafoleng, re tla bala lintlha tse ngata ho feta kamoo ho hlokahalang.

Li-postgres: bloat, pg_repack le lithibelo tse chechisitsoeng

Leha VACUUM joale e ka hlakola mefuta eohle ea mela e sa sebetseng, boemo bo ke ke ba ntlafala haholo. Re tla ba le sebaka sa mahala maqepheng kapa maqepheng kaofela bakeng sa mela e mecha, empa re ntse re tla bala lintlha tse ngata ho feta kamoo ho hlokahalang.
Ka tsela, haeba leqephe le se nang letho (la bobeli mohlaleng oa rona) le ne le le qetellong ea faele, joale VACUUM e tla khona ho e fokotsa. Empa joale o bohareng, kahoo ha ho letho le ka etsoang ka eena.

Li-postgres: bloat, pg_repack le lithibelo tse chechisitsoeng

Ha palo ea maqephe a joalo a se nang letho kapa a fokolang haholo e e-ba kholo, e bitsoang bloat, e qala ho ama ts'ebetso.

Ntho e 'ngoe le e' ngoe e hlalositsoeng ka holimo ke mekhoa ea ho hlaha ha bloat litafoleng. Ho li-index sena se etsahala ka tsela e ts'oanang.

Ke na le bloat?

Ho na le litsela tse 'maloa tsa ho tseba hore na u na le bloat. Mohopolo oa pele ke ho sebelisa lipalo-palo tsa ka hare tsa Postgres, tse nang le tlhaiso-leseling e mabapi le palo ea mela e litafoleng, palo ea mela e "phelang", joalo-joalo. U ka fumana mefuta e mengata ea mangolo a seng a lokisitsoe inthaneteng. Re ile ra nka e le motheo mongolo ho tsoa ho Litsebi tsa PostgreSQL, tse ka lekola litafole tsa bloat hammoho le li-index tsa toast le bloat btree. Boiphihlelo ba rona, phoso ea eona ke 10-20%.

Tsela e 'ngoe ke ho sebelisa katoloso pgstattuple, e u lumellang hore u shebe ka har'a maqephe 'me u fumane boleng bo hakantsoeng le bo nepahetseng ba bloat. Empa tabeng ea bobeli, u tla tlameha ho hlahloba tafole eohle.

Re nka boleng bo bonyenyane ba bloat, ho fihlela ho 20%, bo amohelehang. E ka nkoa e le analogue ea fillfactor bakeng sa litafole и indices. Ho 50% le ho feta, mathata a ts'ebetso a ka qala.

Mekhoa ea ho loantša bloat

Postgres e na le mekhoa e mengata ea ho sebetsana le bloat ka ntle ho lebokose, empa ha se kamehla e loketseng motho e mong le e mong.

Lokisa AUTOVACUUM hore bloat e se ke ea etsahala. Kapa ka nepo, ho e boloka e le boemong bo amohelehang ho uena. Sena se bonahala e le keletso ea "kapotene", empa ha e le hantle sena ha se kamehla se leng bonolo ho se finyella. Ka mohlala, u na le tsoelo-pele e sebetsang ka liphetoho tse tloaelehileng ho schema ea data, kapa mofuta o mong oa ho falla ha data o ntse o etsahala. Ka lebaka leo, profil ea hau ea mojaro e ka fetoha khafetsa mme e tla fapana ho ea ka tafole ho ea ho tafole. Sena se bolela hore o hloka ho sebetsa pele hanyane mme o fetole AUTOVACUUM ho boemo bo fetohang ba tafole ka 'ngoe. Empa ho hlakile hore sena ha se bonolo ho se etsa.

Lebaka le leng le tloaelehileng leo ka lona AUTOVACUUM e sa khoneng ho tsamaisana le litafole ke hobane ho na le litšebelisano tsa nako e telele tse thibelang ho hloekisa boitsebiso bo fumanehang ho litšebelisano tseo. Khothaletso mona e boetse e hlakile - tlosa litšebelisano tse "lepeletseng" 'me u fokotse nako ea litšebelisano tse sebetsang. Empa haeba mojaro oa kopo ea hau e le motsoako oa OLAP le OLTP, ka nako e le 'ngoe u ka ba le lintlafatso tse ngata khafetsa le lipotso tse khutšoane, hammoho le ts'ebetso ea nako e telele - mohlala, ho aha tlaleho. Boemong bo joalo, ho bohlokoa ho nahana ka ho jala mojaro ho pholletsa le metheo e fapaneng, e tla lumella ho hlophisoa hantle ha e 'ngoe le e' ngoe ea tsona.

Mohlala o mong - esita le haeba profil e le homogeneous, empa database e tlas'a mojaro o phahameng haholo, joale esita le AUTOVACUUM e mabifi ka ho fetisisa e ka 'na ea se ke ea sebetsana ka katleho,' me bloat e tla etsahala. Ho lekanya (tse otlolohileng kapa tse rapameng) ke eona feela tharollo.

Seo u lokelang ho se etsa boemong boo u thehileng AUTOVACUUM, empa bloat e ntse e tsoela pele ho hōla.

sehlopha SEHLOKO LE PHETHA e tsosolosa litaba tsa litafole le li-index, 'me e siea feela lintlha tse nepahetseng ho tsona. Ho felisa bloat, e sebetsa ka mokhoa o phethahetseng, empa nakong ea ts'ebetso ea eona ho ts'oaroa senotlolo se ikhethileng tafoleng (AccessExclusiveLock), se ke keng sa lumella ho etsa lipotso tafoleng ena, esita le ho khetha. Haeba u ka khona ho emisa tšebeletso ea hau kapa karolo ea eona ka nako e itseng (ho tloha metsotso e mashome ho ea ho lihora tse 'maloa ho itšetlehile ka boholo ba database le hardware ea hau), joale khetho ena ke eona e molemo ka ho fetisisa. Ka bomalimabe, ha re na nako ea ho tsamaisa VACUUM FULL nakong ea tlhokomelo e reriloeng, kahoo mokhoa ona ha o re loketse.

sehlopha SEKATLO E tsosolosa litaba tsa litafole ka tsela e ts'oanang le VACUUM FULL, empa e u lumella ho hlakisa index ho latela hore na data e tla laeloa joang ka disk (empa nakong e tlang taelo ha e tiisetsoe bakeng sa mela e mecha). Maemong a mang, sena ke ts'ebeliso e ntle bakeng sa lipotso tse 'maloa - ka ho bala lirekoto tse ngata ka index. Bothata ba taelo bo tšoana le ba VACUUM FULL - e notlela tafole nakong ea ts'ebetso.

sehlopha REINDEX e ts'oanang le tse peli tse fetileng, empa e aha bocha index e itseng kapa li-index tsohle tsa tafole. Liloko li fokola hanyenyane: ShareLock tafoleng (e thibela liphetoho, empa e lumella khetho) le AccessExclusiveLock ho index e ntseng e tsosolosoa (e thibela lipotso ho sebelisa index ena). Leha ho le joalo, phetolelong ea 12 ea Postgres parameter e ile ea hlaha NTSANE, e u lumellang hore u hahe index ntle le ho thibela ho eketsa, ho fetola, kapa ho hlakoloa ha lirekoto ka nako e le 'ngoe.

Liphetolelong tsa pejana tsa Postgres, o ka fumana sephetho se ts'oanang le REINDEX CONCURRENTLY u sebelisa BOPA INDEX NAKOANA. E u lumella ho etsa index ntle le ho notlela ka thata (ShareUpdateExclusiveLock, e sa sitiseng lipotso tse tšoanang), ebe u kenya index ea khale sebaka ka e ncha ebe u hlakola index ea khale. Sena se o lumella ho tlosa index bloat ntle le ho kena-kenana le ts'ebeliso ea hau. Ke habohlokoa ho nahana hore ha ho tsosolosoa li-index ho tla ba le mojaro o eketsehileng ho disk subsystem.

Kahoo, haeba bakeng sa li-index ho na le litsela tsa ho felisa bloat "ka fofa," ha ho na litafole. Mona ke moo li-extensions tse fapaneng tsa kantle li kenang tšebetsong: pg_repack (eo pele e neng e le pg_reorg), pgcompact, pgcompacttable le ba bang. Sehloohong sena, nke ke ka li bapisa mme ke tla bua feela ka pg_repack, eo, ka mor'a phetoho e itseng, re e sebelisang.

Kamoo pg_repack e sebetsang kateng

Li-postgres: bloat, pg_repack le lithibelo tse chechisitsoeng
A re re re na le tafole e tloaelehileng ka ho feletseng - e nang le li-index, lithibelo le, ka bomalimabe, ka bloat. Mohato oa pele oa pg_repack ke ho theha tafole ea log ho boloka data mabapi le liphetoho tsohle ha e ntse e sebetsa. Moqapi o tla pheta liphetoho tsena bakeng sa kenyelletso e 'ngoe le e 'ngoe, ho ntlafatsa le ho hlakola. Joale tafole e bōptjoa, e tšoanang le ea pele ka sebopeho, empa ntle le li-index le lithibelo, e le hore u se ke ua liehisa mokhoa oa ho kenya data.

Ka mor'a moo, pg_repack e fetisetsa data ho tloha tafoleng ea khale ho ea tafoleng e ncha, ka ho iketsetsa mela eohle e sa lokelang, ebe e etsa li-index bakeng sa tafole e ncha. Nakong ea ts'ebetso ea ts'ebetso ena kaofela, liphetoho li bokellana tafoleng ea log.

Mohato o latelang ke ho fetisetsa liphetoho tafoleng e ncha. Ho falla ho etsoa ka makhetlo a 'maloa,' me ha ho na le litlhaloso tse ka tlaase ho 20 tse setseng tafoleng ea log, pg_repack e fumana senotlolo se matla, e fallisa lintlha tsa morao-rao, 'me e nkela tafole ea khale sebaka ka e ncha ka har'a litafole tsa tsamaiso ea Postgres. Ena ke eona feela nako e khutšoane haholo eo u ke keng ua khona ho sebetsa le tafole. Ka mor'a sena, tafole ea khale le tafole e nang le li-logs lia tlosoa 'me sebaka se lokolloa tsamaisong ea lifaele. Ts'ebetso e felile.

Ntho e 'ngoe le e' ngoe e shebahala e le ntle ka khopolo, empa ho etsahala'ng ka ts'ebetso? Re ile ra leka pg_repack ntle le mojaro le tlas'a mojaro, 'me ra hlahloba ts'ebetso ea eona haeba e ema pele ho nako (ka mantsoe a mang, re sebelisa Ctrl + C). Liteko tsohle li ne li le ntle.

Re ile ra ea lebenkeleng la lijo - 'me tsohle ha lia ka tsa tsamaea kamoo re neng re lebeletse kateng.

Li-pancake tsa pele tse rekisoang

Sehlopheng sa pele re fumane phoso mabapi le tlolo ea thibelo e ikhethang:

$ ./pg_repack -t tablename -o id
INFO: repacking table "tablename"
ERROR: query failed: 
    ERROR: duplicate key value violates unique constraint "index_16508"
DETAIL:  Key (id, index)=(100500, 42) already exists.

Moeli ona o ne o e-na le index ea mabitso e iketselitsoeng ka boits'oaro_16508 - e entsoe ke pg_repack. Ho ipapisitsoe le litšoaneleho tse kenyellelitsoeng sebopehong sa eona, re ile ra khetha tšitiso ea "rona" e lumellanang le eona. Bothata bo ile ba fetoha hore ona ha se moeli o tloaelehileng ka ho felletseng, empa o chechisitsoe morao (tšitiso e chechisetsoang morao), ke. netefatso ea eona e etsoa hamorao ho feta taelo ea sql, e lebisang liphellong tse sa lebelloang.

Lithibelo tse chechisetsoang morao: hobaneng li hlokahala le hore na li sebetsa joang

Khopolo e nyane mabapi le lithibelo tse chechiselitsoeng morao.
A re nahaneng ka mohlala o bonolo: re na le buka ea litafole-tafole ea likoloi tse nang le litšobotsi tse peli - lebitso le taelo ea koloi bukeng ea libuka.
Li-postgres: bloat, pg_repack le lithibelo tse chechisitsoeng

create table cars
(
  name text constraint pk_cars primary key,
  ord integer not null constraint uk_cars unique
);



Ha re re re ne re hloka ho fapanyetsana koloi ea pele le ea bobeli. Tharollo e tobileng ke ho ntlafatsa boleng ba pele ho ea bobeli, 'me ea bobeli ho ea pele:

begin;
  update cars set ord = 2 where name = 'audi';
  update cars set ord = 1 where name = 'bmw';
commit;

Empa ha re tsamaisa khoutu ena, re lebelletse tlolo ea lithibelo hobane tatellano ea litekanyetso tse tafoleng e ikhethile:

[23305] ERROR: duplicate key value violates unique constraint “uk_cars”
Detail: Key (ord)=(2) already exists.

Nka e etsa joang ka tsela e fapaneng? Khetho ea pele: eketsa phallo e 'ngoe ea boleng ho taelo e tiisitsoeng hore e ke ke ea ba teng tafoleng, mohlala "-1". Lenaneong, sena se bitsoa "ho fapanyetsana boleng ba mefuta e 'meli ho ea ho ea boraro." Bothata bo le bong feela ba mokhoa ona ke ntlafatso e eketsehileng.

Khetho ea bobeli: Hlophisa tafole ho sebelisa mofuta oa lintlha tse phaphametseng bakeng sa boleng ba odara ho fapana le linomoro. Joale, ha u ntlafatsa boleng ho tloha ho 1, mohlala, ho ea ho 2.5, ho kena ha pele ho tla "ema" ka ho toba pakeng tsa bobeli le ba boraro. Tharollo ena e sebetsa, empa ho na le mefokolo e 'meli. Taba ea pele, e ke ke ea u sebeletsa haeba boleng bo sebelisoa kae-kae sebopehong. Taba ea bobeli, ho ipapisitse le ho nepahala ha mofuta oa data, o tla ba le palo e lekanyelitsoeng ea tse kentsoeng pele o bala hape boleng ba lirekoto tsohle.

Khetho ea boraro: etsa hore thibelo e chechisoe e le hore e hlahlojoe feela ka nako ea boitlamo:

create table cars
(
  name text constraint pk_cars primary key,
  ord integer not null constraint uk_cars unique deferrable initially deferred
);

Kaha mabaka a kopo ea rona ea pele a netefatsa hore litekanyetso tsohle li ikhethile ka nako ea boitlamo, e tla atleha.

Mohlala o boletsoeng ka holimo, ehlile, o entsoe haholo, empa o senola mohopolo. Ts'ebelisong ea rona, re sebelisa lithibelo tse chechisitsoeng ho kenya tšebetsong mabaka a ikarabellang bakeng sa ho rarolla likhohlano ha basebelisi ka nako e le 'ngoe ba sebetsa le lintho tsa widget tse arolelanoang botong. Ho sebelisa lithibelo tse joalo ho re lumella ho etsa hore khoutu ea kopo e be bonolo haholoanyane.

Ka kakaretso, ho ipapisitse le mofuta oa tšitiso, Postgres e na le maemo a mararo a granularity bakeng sa ho a hlahloba: mola, transaction, le maemo a polelo.
Li-postgres: bloat, pg_repack le lithibelo tse chechisitsoeng
Source: begriffs

CHECK le NOT NULL li lula li hlahlojoa maemong a mela; bakeng sa lithibelo tse ling, joalo ka ha ho bonoa tafoleng, ho na le likhetho tse fapaneng. O ka bala ho feta mona.

Ho akaretsa ka bokhuts'oane, lithibelo tse chechisetsoang morao maemong a 'maloa li fana ka khoutu e baloang haholoanyane le litaelo tse fokolang. Leha ho le joalo, o tlameha ho lefa bakeng sa sena ka ho thatafatsa mokhoa oa ho lokisa liphoso, ho tloha ha phoso e etsahala le nako eo u e fumanang ka eona e arohane ka nako. Bothata bo bong bo ka bang teng ke hore mohlophisi a kanna a se khone ho etsa moralo o nepahetseng ka linako tsohle haeba kopo e kenyelletsa tšitiso e chechisitsoeng.

Ntlafatso ea pg_repack

Re koahetse hore na lithibelo tse chechisitsoeng ke life, empa li amana joang le bothata ba rona? Ha re hopole phoso eo re e fumaneng pejana:

$ ./pg_repack -t tablename -o id
INFO: repacking table "tablename"
ERROR: query failed: 
    ERROR: duplicate key value violates unique constraint "index_16508"
DETAIL:  Key (id, index)=(100500, 42) already exists.

E etsahala ha data e kopitsoa ho tloha tafoleng ea log ho ea tafoleng e ncha. Sena se bonahala se makatsa hobane... data e ka har'a tafole ea log e entsoe hammoho le data e teng tafoleng ea mohloli. Haeba ba khotsofatsa lithibelo tsa tafole ea pele, ba ka tlola lithibelo tse tšoanang joang ho e ncha?

Ha ho ntse ho le joalo, motso oa bothata o teng mohatong o fetileng oa pg_repack, o hlahisang li-index feela, empa eseng lithibelo: tafole ea khale e ne e e-na le tšitiso e ikhethang, 'me e ncha e entse index e ikhethang ho e-na le hoo.

Li-postgres: bloat, pg_repack le lithibelo tse chechisitsoeng

Ke habohlokoa ho hlokomela mona hore haeba thibelo e tloaelehile 'me e sa chechisoe morao, joale index e ikhethang e entsoeng ho e-na le hoo e lekana le thibelo ena, hobane Litšitiso tse ikhethang ho Postgres li kengoa ts'ebetsong ka ho theha index e ikhethang. Empa tabeng ea thibelo e chechisitsoeng, boitšoaro ha bo tšoane, hobane index e ke ke ea chechisoa 'me e lula e hlahlojoa nakong eo taelo ea sql e etsoang.

Ka hona, mohloli oa bothata o teng "ho lieha" ha cheke: tafoleng ea pele e etsahala ka nako ea boitlamo, 'me tafoleng e ncha ka nako eo taelo ea sql e etsoang. Sena se bolela hore re hloka ho etsa bonnete ba hore licheke li etsoa ka mokhoa o ts'oanang maemong ana ka bobeli: e kanna ea lieha, kapa hang hang.

Joale re ne re e-na le maikutlo afe?

Etsa index e ts'oanang le deferred

Mohopolo oa pele ke ho etsa licheke ka bobeli ka mokhoa oa hang-hang. Sena se ka hlahisa lithibelo tse 'maloa tse fosahetseng, empa haeba ho na le tse fokolang tsa tsona, sena ha sea lokela ho ama mosebetsi oa basebelisi, kaha likhohlano tse joalo ke boemo bo tloaelehileng ho bona. Li etsahala, ka mohlala, ha basebelisi ba babeli ba qala ho hlophisa widget e tšoanang ka nako e le 'ngoe,' me mofani oa mosebedisi oa bobeli ha a na nako ea ho fumana tlhahisoleseding eo widget e seng e thibetsoe ho e hlophisa ke mosebedisi oa pele. Boemong bo joalo, seva e hana mosebelisi oa bobeli, mme moreki oa eona o khutlisa liphetoho ebe o thibela widget. Nakoana hamorao, ha mosebelisi oa pele a qeta ho hlophisa, oa bobeli o tla fumana leseli la hore widget ha e sa thibeloa mme e tla khona ho pheta ketso ea bona.

Li-postgres: bloat, pg_repack le lithibelo tse chechisitsoeng

Ho etsa bonnete ba hore licheke li lula li le maemong a sa chechisoeng morao, re thehile index e ncha e ts'oanang le tšitiso ea pele e chechisitsoeng:

CREATE UNIQUE INDEX CONCURRENTLY uk_tablename__immediate ON tablename (id, index);
-- run pg_repack
DROP INDEX CONCURRENTLY uk_tablename__immediate;

Sebakeng sa teko, re fumane liphoso tse 'maloa feela tse neng li lebelletsoe. Katleho! Re ile ra matha pg_repack hape ka tlhahiso mme ra fumana liphoso tse 5 sehlopheng sa pele ka hora ea mosebetsi. Sena ke sephetho se amohelehang. Leha ho le joalo, e se e le sehlopheng sa bobeli palo ea liphoso e eketsehile haholo mme re ile ra tlameha ho emisa pg_repack.

Ke hobane'ng ha e etsahetse? Monyetla oa hore phoso e etsahale e itšetlehile ka hore na ke basebelisi ba bakae ba sebetsang ka li-widget tse tšoanang ka nako e le 'ngoe. Kamoo ho bonahalang kateng, ka nako eo ho ne ho e-na le liphetoho tse fokolang haholo tsa tlhōlisano le data e bolokiloeng sehlopheng sa pele ho feta ho tse ling, i.e. re ne re mpa re le "lehlohonolo".

Mohopolo ha oa ka oa sebetsa. Ka nako eo, re bone litharollo tse ling tse peli: ngola khoutu ea rona ea kopo hape ho fana ka lithibelo tse chechisitsoeng, kapa "ruta" pg_repack ho sebetsa le tsona. Re khethile ea bobeli.

Kenya li-index tafoleng e ncha ka litšitiso tse chechisitsoeng ho tsoa tafoleng ea mantlha

Morero oa ntlafatso o ne o hlakile - haeba tafole ea mantlha e na le tšitiso e chechisitsoeng, joale bakeng sa e ncha o hloka ho theha tšitiso e joalo, eseng index.

Ho leka liphetoho tsa rona, re ngotse tlhahlobo e bonolo:

  • tafole e nang le tšitiso e chechisitsoeng le rekoto e le 'ngoe;
  • kenya data ho loop e thulanang le rekoto e teng;
  • etsa ntlafatso - data ha e sa na likhohlano;
  • etsa liphetoho.

create table test_table
(
  id serial,
  val int,
  constraint uk_test_table__val unique (val) deferrable initially deferred 
);

INSERT INTO test_table (val) VALUES (0);
FOR i IN 1..10000 LOOP
  BEGIN
    INSERT INTO test_table VALUES (0) RETURNING id INTO v_id;
    UPDATE test_table set val = i where id = v_id;
    COMMIT;
  END;
END LOOP;

Phetolelo ea mantlha ea pg_repack e ne e lula e soahlamana ketsong ea pele, mofuta o fetotsoeng o ne o sebetsa ntle le liphoso. E kholo.

Re ea tlhahisong hape re fumana phoso ka nako e ts'oanang ea ho kopitsa data ho tloha tafoleng ea log ho ea ho e ncha:

$ ./pg_repack -t tablename -o id
INFO: repacking table "tablename"
ERROR: query failed: 
    ERROR: duplicate key value violates unique constraint "index_16508"
DETAIL:  Key (id, index)=(100500, 42) already exists.

Boemo ba khale: ntho e 'ngoe le e' ngoe e sebetsa libakeng tsa liteko, empa eseng tlhahiso?!

APPLY_COUNT le mateano a lihlopha tse peli

Re ile ra qala ho sekaseka khoutu ka ho toba mola ka mola 'me ra fumana ntlha ea bohlokoa: data e fetisoa ho tloha tafoleng ea log ho ea ho e ncha ka li-batch, APPLY_COUNT kamehla e bontšitse boholo ba batch:

for (;;)
{
num = apply_log(connection, table, APPLY_COUNT);

if (num > MIN_TUPLES_BEFORE_SWITCH)
     continue;  /* there might be still some tuples, repeat. */
...
}

Bothata ke hore data e tsoang ts'ebetsong ea pele, moo ts'ebetso e 'maloa e neng e ka tlōla thibelo, ha e fetisetsoa, ​​e ka qetella e fihlile mateanong a lihlopha tse peli - halofo ea litaelo e tla etsoa sehlopheng sa pele, le halofo e' ngoe. ea bobeli. 'Me mona, ho itšetlehile ka mahlohonolo a hau: haeba lihlopha li sa tlōle letho sehlopheng sa pele, joale ntho e' ngoe le e 'ngoe e lokile, empa haeba e etsa joalo, phoso e etsahala.

APPLY_COUNT e lekana le lirekoto tse 1000, e leng se hlalosang hore na ke hobane'ng ha liteko tsa rona li atlehile - ha lia akaretsa taba ea "batch junction". Re sebelisitse litaelo tse peli - kenya le ho ntlafatsa, kahoo litšebelisano tse 500 tsa litaelo tse peli li ne li lula li behiloe ka bongata 'me ha rea ​​ka ra ba le mathata. Kamora ho kenya ntlafatso ea bobeli, phetoho ea rona e ile ea emisa ho sebetsa:

FOR i IN 1..10000 LOOP
  BEGIN
    INSERT INTO test_table VALUES (1) RETURNING id INTO v_id;
    UPDATE test_table set val = i where id = v_id;
    UPDATE test_table set val = i where id = v_id; -- one more update
    COMMIT;
  END;
END LOOP;

Kahoo, mosebetsi o latelang ke ho etsa bonnete ba hore data e tsoang tafoleng ea pele, e ileng ea fetoloa ts'ebetsong e le 'ngoe, e qetella e le tafoleng e ncha hape ka hare ho ts'ebetso e le' ngoe.

Ho hana ho betha

Mme hape re bile le ditharollo tse pedi. Taba ea pele: a re tloheleng ka ho felletseng ho arola ka li-batches ebe re fetisetsa data ts'ebetsong e le 'ngoe. Monyetla oa tharollo ena e ne e le bonolo - liphetoho tse hlokahalang tsa khoutu li ne li fokola (ka tsela, liphetolelong tsa khale pg_reorg e sebetsa hantle joalo). Empa ho na le bothata - re theha khoebo ea nako e telele, 'me sena, joalokaha ho boletsoe pejana, ke tšokelo ea ho hlaha ha bloat e ncha.

Tharollo ea bobeli e rarahane haholoanyane, empa mohlomong e nepahetse ho feta: theha kholumo ka har'a tafole ea log e nang le sesupo sa transaction e kentseng data tafoleng. Joale, ha re kopitsa data, re ka e hlophisa ka tšobotsi ena 'me ra etsa bonnete ba hore liphetoho tse amanang le tsona li fetisetsoa hammoho. Sehlopha se tla thehoa ho tsoa litšebelisanong tse 'maloa (kapa e le' ngoe e kholo) 'me boholo ba eona bo tla fapana ho itšetlehile ka hore na boitsebiso bo bongata bo fetotsoe joang litšebelisanong tsena. Ke habohlokoa ho hlokomela hore kaha data e tsoang litšebelisanong tse fapaneng e kena tafoleng ea log ka tatellano e sa tloaelehang, ho ke ke ha hlola ho khoneha ho e bala ka tatellano, joalokaha e ne e le pele. seqscan bakeng sa kopo e 'ngoe le e' ngoe ka ho sefa ka tx_id e theko e boima haholo, index ea hlokahala, empa e tla fokotsa mokhoa ona ka lebaka la ho e ntlafatsa. Ka kakaretso, joalo ka kamehla, o hloka ho tela ntho e itseng.

Kahoo, re ile ra etsa qeto ea ho qala ka khetho ea pele, kaha e bonolo haholoanyane. Ntlha ea pele, ho ne ho hlokahala ho utloisisa hore na khoebo e telele e ne e tla ba bothata ba sebele. Kaha phetisetso e kholo ea data ho tloha tafoleng ea khale ho ea ho e ncha e boetse e etsahala ka nako e le 'ngoe ea nako e telele, potso e fetotsoe ho "re tla eketsa khoebo ee bokae?" Nako ea khoebo ea pele e itšetlehile haholo ka boholo ba tafole. Nako ea e ncha e itšetlehile ka hore na ho na le liphetoho tse kae tse bokellang tafoleng nakong ea ho fetisoa ha data, i.e. ka boima ba moroalo. Ts'ebetso ea pg_repack e etsahetse nakong ea mojaro o fokolang oa lits'ebeletso, mme palo ea liphetoho e ne e le nyane haholo ha e bapisoa le boholo ba tafole. Re ile ra etsa qeto ea hore re ka hlokomoloha nako ea transaction e ncha (bakeng sa ho bapisa, ka karolelano ke hora ea 1 le metsotso e 2-3).

Liteko li ne li le ntle. Qala tlhahiso hape. Bakeng sa ho hlaka, mona ke setšoantšo se nang le boholo ba e 'ngoe ea li-database ka mor'a ho sebetsa:

Li-postgres: bloat, pg_repack le lithibelo tse chechisitsoeng

Kaha re ne re khotsofetse ka ho feletseng ka tharollo ena, ha rea ​​ka ra leka ho kenya ts'ebetsong ea bobeli, empa re ntse re nahana ka monyetla oa ho buisana ka eona le bahlahisi ba katoloso. Phetolelo ea rona ea hona joale, ka bomalimabe, ha e e-s'o lokele ho hatisoa, kaha re rarolotse bothata feela ka lithibelo tse ikhethileng, 'me bakeng sa patch e feletseng ho hlokahala ho fana ka tšehetso bakeng sa mefuta e meng. Re tšepa hore re tla khona ho etsa sena nakong e tlang.

Mohlomong u na le potso, ke hobane'ng ha re bile re kenya letsoho paleng ee ka phetoho ea pg_repack, 'me ka mohlala, ha rea ​​ka ra sebelisa li-analogues tsa eona? Ka nako e 'ngoe re ile ra boela ra nahana ka sena, empa phihlelo e ntle ea ho e sebelisa pejana, litafoleng ntle le lithibelo tse chechisitsoeng, e ile ea re susumelletsa ho leka ho utloisisa moelelo oa bothata le ho bo lokisa. Ho phaella moo, ho sebelisa litharollo tse ling ho boetse ho hloka nako ea ho etsa liteko, kahoo re ile ra etsa qeto ea hore re tla leka pele ho lokisa bothata ho eona, 'me haeba re hlokomela hore re ke ke ra etsa sena ka nako e lekaneng, joale re tla qala ho sheba li-analogues. .

fumanoeng ke

Seo re ka se khothaletsang ho latela boiphihlelo ba rona:

  1. Ela hloko ho ruruha ha hao. Ho ipapisitsoe le data ea ho beha leihlo, o ka utloisisa hore na autovacuum e hlophisitsoe hantle hakae.
  2. Fetola AUTOVACUUM ho boloka bloat e le maemong a amohelehang.
  3. Haeba bloat e ntse e hōla 'me u ke ke ua e hlōla u sebelisa lisebelisoa tse ka ntle ho lebokose, u se ke ua tšaba ho sebelisa lisebelisoa tsa ka ntle. Ntho e ka sehloohong ke ho hlahloba ntho e 'ngoe le e' ngoe hantle.
  4. Se ke oa tšaba ho fetola litharollo tsa kantle hore li lumellane le litlhoko tsa hau - ka linako tse ling sena se ka sebetsa le ho ba bonolo ho feta ho fetola khoutu ea hau.

Source: www.habr.com

Eketsa ka tlhaloso