Postgres: bloat, pg_repack me nga here kua whakaroa

Postgres: bloat, pg_repack me nga here kua whakaroa

Ko te painga o te pupuhi i runga i nga tepu me nga tohu e mohiotia nuitia ana, kei te noho noa i Postgres. He huarahi hei whakahaere i waho o te pouaka, penei i te VACUUM FULL, CLUSTER ranei, engari ka maukati nga tepu i te wa e mahi ana, na reira kaore e taea te whakamahi i nga wa katoa.

Kei roto i te tuhinga he ariā iti e pa ana ki te ahua o te pupuhi, me pehea e taea ai e koe te whawhai, mo nga here kua whakaroa me nga raru ka kawea mai e ratou ki te whakamahi i te toronga pg_repack.

Kua tuhia tenei tuhinga i runga i taku korero i PgConf.Russia 2020.

He aha te take ka puta te pupuhi?

Ko nga Postgres kei runga i te tauira maha-putanga (MVCC). Ko te mea nui he maha nga putanga o ia rarangi o te ripanga, engari karekau e kite i te kotahi o enei putanga, engari ehara i te mea kotahi. Ma tenei ka taea e te maha o nga whakawhitinga te mahi i te wa kotahi, karekau he paanga ki a raatau ano.

Ko te tikanga, me penapena enei putanga katoa. Ka mahi a Postgres me te wharangi mahara ma ia wharangi me te wharangi ko te iti rawa o nga raraunga ka taea te panui mai i te kōpae, te tuhi ranei. Kia titiro tatou ki tetahi tauira iti kia mohio ai me pehea te tupu o tenei.

Me kii he ripanga kua taapirihia e matou etahi rekoata. Kua puta nga raraunga hou ki te wharangi tuatahi o te konae kei te penapena te ripanga. He putanga ora enei o nga rarangi e waatea ana ki etahi atu whakawhitinga i muri i te tukunga (mo te ngawari, ka whakaarohia ko te taumata wehe ko te Panui Panui).

Postgres: bloat, pg_repack me nga here kua whakaroa

Ka whakahouhia e matou tetahi o nga whakaurunga, na reira ka tohuhia te putanga tawhito kua kore e tika.

Postgres: bloat, pg_repack me nga here kua whakaroa

Ma te hikoi, te whakahou me te whakakore i nga putanga rarangi, ka mutu he wharangi kei roto ko te haurua o nga raraunga he "parapara". Ko enei raraunga kaore e kitea ki tetahi tauwhitinga.

Postgres: bloat, pg_repack me nga here kua whakaroa

He tikanga a Postgres VACUUM, e horoi ana i nga putanga tawhito me te whai waahi mo nga raraunga hou. Engari ki te kore e tino whirihorahia, kei te pukumahi ranei ki te mahi i etahi atu ripanga, ka noho tonu "raraunga paru", me whakamahi etahi atu wharangi mo nga raraunga hou.

Na i roto i to maatau tauira, i etahi wa ka wha nga wharangi te ripanga, engari ko te haurua anake ka mau nga raraunga ora. Ko te mutunga, ka uru atu ki te ripanga, ka nui ake nga korero ka panuihia e maatau.

Postgres: bloat, pg_repack me nga here kua whakaroa

Ahakoa ka mukua e VACUUM nga momo rarangi haupae katoa, kaore e tino pai ake te ahuatanga. Ka whai waahi korekore i roto i nga wharangi, i nga wharangi katoa ranei mo nga rarangi hou, engari ka panui tonu tatou i nga raraunga nui atu i te mea e tika ana.
Ma te ara, mena he wharangi putea rawa (te tuarua o ta maatau tauira) kei te pito o te konae, katahi ka taea e VACUUM te kuti. Inaianei kei waenganui ia, no reira kaore e taea te mahi ki a ia.

Postgres: bloat, pg_repack me nga here kua whakaroa

Ka nui haere te maha o aua wharangi kau, he iti noa ranei, ka kiia ko te pupuhi, ka timata te pa ki te mahi.

Ko nga mea katoa e whakaahuatia ana i runga ake nei ko nga tikanga o te puta o te pupuhi i roto i nga ripanga. I roto i nga taurangi ka rite tonu tenei.

Kei te pupuhi ahau?

He maha nga huarahi ki te whakatau mehemea kei te pupuhi koe. Ko te whakaaro o te tuatahi ko te whakamahi i nga tatauranga o roto o Postgres, kei roto nga korero tata mo te maha o nga rarangi o nga ripanga, te maha o nga rarangi "ora", me etahi atu. I tangohia e matou hei turanga tuhinga mai i nga Tohunga PostgreSQL, ka taea te arotake i nga ripanga pupuhi me nga tohu toast me te pupuhi btree. I roto i to maatau wheako, ko tana hapa he 10-20%.

Ko tetahi atu huarahi ko te whakamahi i te toronga pgstattuple, ka taea e koe te titiro ki roto i nga wharangi me te whiwhi i te uara putunga tika me te uara. Engari i te keehi tuarua, me matawai koe i te tepu katoa.

Ka whakaarohia e matou he uara pupuhi iti, tae atu ki te 20%, ka whakaaetia. Ka taea te whakaaro hei orite mo te whakakii mo tepu и tohu. I te 50% me runga ake, ka timata pea nga raruraru mahi.

Nga huarahi ki te patu i te pupuhi

He maha nga huarahi a Postgres ki te whakatutuki i te pupuhi mai i te pouaka, engari kaore e pai mo te katoa.

Whirihorahia te AUTOVACUUM kia kore ai e pupuhi. He tika ake ranei, kia mau tonu ki te taumata e manakohia ana e koe. Ko te ahua tenei he tohutohu "kapene", engari ko te mea pono ehara tenei i te mea ngawari ki te whakatutuki. Hei tauira, he whanaketanga kaha koe me nga huringa auau ki te aronuinga raraunga, kei te haere ranei etahi momo hekenga raraunga. Ko te mutunga mai, ka rereke pea to kotaha kawenga, ka rere ke i te tepu ki te tepu. Ko te tikanga me mahi koe i mua tata tonu me te whakatika i te AUTOVACUUM ki te huringa o nga korero o ia ripanga. Engari ko te maarama ehara i te mea ngawari ki te mahi.

Ko tetahi atu take kaore e taea e AUTOVACUUM te pupuri i nga ripanga na te mea he roa nga tauwhitinga e aukati ana i te horoi i nga raraunga e waatea ana ki aua whakawhitinga. Ka kitea hoki te kupu tohutohu i konei - whakakorehia nga whakawhitinga "tarewa" me te whakaiti i te wa o nga whakawhitinga kaha. Engari mena he ranu te uta o to tono i te OLAP me te OLTP, katahi ka taea e koe te maha o nga whakahou me nga patai poto, me nga mahi mo te wa roa - hei tauira, te hanga purongo. I roto i tenei ahuatanga, he pai ki te whakaaro ki te hora i te kawenga ki runga i nga turanga rereke, ka pai ake te whakatikatika o ia waahanga.

Ko tetahi atu tauira - ahakoa he rite tonu te korero, engari kei raro te papaaarangi i te utaina nui rawa atu, katahi ka kore e taea e te AUTOVACUUM tino pukuriri, ka puta te pupuhi. Ko te whakatauine (poutū, whakapae ranei) te otinga anake.

He aha te mahi i roto i tetahi ahuatanga kua whakaturia e koe AUTOVACUUM, engari kei te tipu haere tonu te pupuhi.

rōpū KAUPAPA KIA ka hanga ano i nga ihirangi o nga ripanga me nga taupū ka waiho he raraunga whai take ki roto. Hei whakakore i te pupuhi, he pai te mahi, engari i te wa e mahia ana, ka mauhia he raka motuhake i runga i te teepu (AccessExclusiveLock), e kore e whakaae kia mahia nga patai ki runga i tenei ripanga, me te kowhiri. Mena ka taea e koe te whakamutu i to ratonga, i tetahi waahanga ranei mo etahi wa (mai i te tekau meneti ki te maha o nga haora i runga i te rahi o te papaaarangi me to taputapu), koinei te mea pai rawa atu. Kia aroha mai, karekau he taima ki te whakahaere i te VACUUM FULL i te wa o te tiaki kua whakaritea, no reira kaore tenei tikanga e pai mo tatou.

rōpū HE MAHI Ka hanga ano i nga ihirangi o nga ripanga kia rite ki te VACUUM FULL, engari ka taea e koe te tautuhi i tetahi taurangi e ai ki nga raraunga ka ota tinana ki runga i te kōpae (engari a muri ake nei kaore te ota e whakamanahia mo nga rarangi hou). I etahi ahuatanga, he pai te arotautanga mo te maha o nga patai - me te panui i nga rekoata maha ma te taurangi. Ko te ngoikoretanga o te whakahau he rite ki tera o VACUUM FULL - ka maukati te tepu i te wa e mahi ana.

rōpū REINDEX he rite ki nga mea e rua o mua, engari ka hanga ano he taurangi motuhake me nga tohu katoa o te ripanga. He iti ake te ngoikore o nga raka: ShareLock i runga i te teepu (ka aukati i nga whakarereketanga, engari ka taea te kowhiri) me te AccessExclusiveLock i runga i te taurangi ka hangaia ano (paraia nga patai ma te whakamahi i tenei taurangi). Heoi, i te putanga 12 o Postgres ka puta he tawhā HEI WHAKAARO, ka taea e koe te hanga ano i te taurangi me te kore e aukati i te taapiri, te whakarereke, te whakakore ranei i nga rekoata.

I nga putanga o mua o Postgres, ka taea e koe te whakatutuki i tetahi hua e rite ana ki a REINDEX CONCURRENTLY ma te whakamahi WAIHANGA I TE TAPU I TE WHAKAMAHI. Ka taea e koe te hanga i tetahi tohu me te kore e maukati (ShareUpdateExclusiveLock, e kore e pokanoa ki nga uiui whakarara), ka whakakapi i te taurangi tawhito me te mea hou ka mukua te taurangi tawhito. Ma tenei ka taea e koe te whakakore i te pupuhi tohu me te kore e pokanoa ki to tono. He mea nui ki te whakaaro ko te wa e hanga ana i nga tohu ka nui ake te uta ki runga i te puunaha-iti kōpae.

Na, ki te mea he huarahi hei whakakore i te pupuhi "i runga i te rere," karekau he papa mo nga tepu. Koinei te waahi ka uru mai nga momo toronga o waho: pg_repack (pg_reorg i mua), pgcompact, pgcompacttable me etahi atu. I roto i tenei tuhinga, kaore au e whakataurite i a raatau ka korero noa mo pg_repack, na, i muri i etahi whakarereketanga, ka whakamahia e matou.

Me pehea te pg_repack

Postgres: bloat, pg_repack me nga here kua whakaroa
Me kii he teepu tino noa - me nga tohu tohu, nga here, me te kino, me te pupuhi. Ko te mahi tuatahi o pg_repack ko te hanga i tetahi ripanga rangitaki hei penapena raraunga mo nga huringa katoa i te wa e rere ana. Ka tukuna e te keu enei huringa mo ia whakauru, whakahou me te muku. Na ka hangaia he tepu, he rite ki te mea taketake i roto i te hanganga, engari kaore he tohu me nga here, kia kore ai e whakaheke i te tukanga o te whakauru raraunga.

Panuku, ka whakawhitia e pg_repack nga raraunga mai i te ripanga tawhito ki te ripanga hou, ka tātari aunoa i nga rarangi koretake katoa, katahi ka hangaia he tohu mo te ripanga hou. I te wa e mahia ana enei mahi katoa, ka whakaemihia nga huringa ki te ripanga raarangi.

Ko te mahi e whai ake nei ko te whakawhiti i nga huringa ki te ripanga hou. Ka mahia te hekenga i runga i te maha o nga whitiwhitinga, a ka iti ake i te 20 nga urunga e toe ana ki te ripanga rangitaki, ka whiwhi a pg_repack i tetahi raka kaha, ka heke nga raraunga hou, ka whakakapi i te teepu tawhito me te mea hou kei roto i nga ripanga punaha Postgres. Koinei anake te wa poto ka kore e taea e koe te mahi me te tepu. I muri i tenei, ka mukua te tepu tawhito me te teepu me nga rakau, ka waatea te waahi i roto i te punaha konae. Kua oti te tukanga.

He ahua pai nga mea katoa i roto i te ariā, engari he aha te mahi i roto i te mahi? I whakamatauria e matou te pg_repack me te kore e utaina, kei raro hoki i te utaina, me te tirotiro i tana mahi mena ka mutu te wa o mua (i etahi atu kupu, ma te whakamahi Ctrl+C). He pai nga whakamatautau katoa.

I haere matou ki te toa kai - katahi kare nga mea katoa i rite ki ta matou i tumanako ai.

Panekeke tuatahi kua hokona

I te tautau tuatahi i tae mai he hapa mo te takahi i tetahi herenga ahurei:

$ ./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.

He ingoa hanga-aunoa tenei here index_16508 - na pg_repack i hanga. I runga i nga huanga kei roto i tana hanganga, i whakatauhia e matou "to matou" herenga e rite ana ki a ia. Ko te raruraru i puta ko tenei ehara i te mea he here noa, engari he mea whakaroa (herenga whakaroa), i.e. Ko tana manatoko ka mahia i muri mai i te whakahau sql, ka puta nga hua ohorere.

Nga here kua whakaroa: he aha e hiahiatia ana me pehea te mahi

He ariā iti mo nga here whakaroa.
Ka whakaarohia he tauira ngawari: he pukapuka tohutoro tepu mo nga motuka e rua nga huanga - ko te ingoa me te raupapa o te motuka kei roto i te raarangi.
Postgres: bloat, pg_repack me nga here kua whakaroa

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



Me kii me huri tatou i nga motuka tuatahi me te tuarua. Ko te otinga ngawari ko te whakahou i te uara tuatahi ki te tuarua, me te tuarua ki te tuatahi:

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

Engari ka whakahaerehia e matou tenei waehere, ka tumanako matou he takahi here na te mea he ahurei te raupapa o nga uara o te ripanga:

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

Me pehea taku mahi rereke? Kōwhiringa tuatahi: tāpirihia he whakakapinga uara taapiri ki tetahi ota karekau e noho ki te ripanga, hei tauira "-1". I roto i te kaupapa, ka kiia tenei ko "te whakawhiti i nga uara o nga taurangi e rua ki te tuatoru." Ko te raru anake o tenei tikanga ko te whakahou taapiri.

Kōwhiringa tuarua: Hoahoa anōtia te ripanga hei whakamahi i te momo raraunga ira māngi mō te uara ota hei utu tauoti. Na, ka whakahouhia te uara mai i te 1, hei tauira, ki te 2.5, ka "tu" aunoa te urunga tuatahi i waenga i te tuarua me te tuatoru. Ka whai hua tenei otinga, engari e rua nga here. Tuatahi, kaore e pai ki a koe mena ka whakamahia te uara ki tetahi waahi o te atanga. Tuarua, i runga i te tika o te momo raraunga, he iti noa nga whakaurunga ka taea e koe i mua i te tatau i nga uara o nga rekoata katoa.

Kōwhiringa tuatoru: whakaroa te herenga kia tirohia i te wa o te tukunga:

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

I te mea ko te arorau o ta maatau tono tuatahi ka whakarite he ahurei nga uara katoa i te wa o te tuku, ka angitu.

Ko te tauira i korerohia i runga ake nei, he tino waihanga, engari e whakaatu ana i te whakaaro. I roto i ta maatau tono, ka whakamahia e matou nga here kua roa ki te whakatinana i te arorau hei whakatau i nga papā ina mahi nga kaiwhakamahi i te wa kotahi me nga taonga widget tiritahi i runga i te papa. Ma te whakamahi i enei here ka taea e maatau te hanga i te waehere tono kia ngawari ake.

I te nuinga o te waa, i runga i te momo herenga, e toru nga taumata o te panui a Postgres mo te tirotiro i a raatau: rarangi, tauwhitinga, me nga taumata whakapuaki.
Postgres: bloat, pg_repack me nga here kua whakaroa
Source: beriffs

CHECK me NOT NULL ka tirohia i nga wa katoa i te taumata haupae; mo etahi atu here, ka kitea mai i te ripanga, he rereke nga whiringa. Ka taea e koe te panui atu konei.

Hei whakarāpopoto poto, ko nga here kua whakaroa i roto i te maha o nga ahuatanga ka nui ake te panui me te iti ake o nga whakahau. Engari, me utu koe mo tenei ma te whakararu i te mahi patuiro, mai i te wa ka puta te hapa me te wa ka kitea e koe mo taua mea ka wehea i te waa. Ko tetahi atu raru pea ko te kore e taea e te kaiwhakariterite te hanga i tetahi mahere tino pai mena ka uru ki te tono he herea whakaroa.

Te whakapai ake i te pg_repack

Kua korerohia e matou he aha nga here kua roa, engari me pehea e pa ana ki to maatau raruraru? Kia maumahara tatou ki te hapa i riro mai i mua:

$ ./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.

Ka puta ina kapehia nga raraunga mai i te ripanga rangitaki ki tetahi ripanga hou. He ahua ke tenei na te mea... ko nga raraunga kei roto i te ripanga rangitaki ka mahia me nga raraunga kei te ripanga puna. Mēnā ka tutuki i a rātou ngā herenga o te ripanga taketake, me pehea e takahia ai ngā herenga o te ripanga hou?

I te mea ka puta mai, ko te putake o te raru kei roto i te taahiraa o mua o pg_repack, ka hangaia he tohu tohu anake, engari ehara i nga here: ko te tepu tawhito he herenga ahurei, a ko te mea hou i hanga he tohu motuhake.

Postgres: bloat, pg_repack me nga here kua whakaroa

He mea nui kia kite i konei mena he mea noa te herenga karekau e whakaroa, katahi ka rite te taurangi ahurei i hangaia hei utu mo tenei here, na te mea Ko nga here ahurei i roto i nga Postgres ka whakatinanahia ma te hanga i tetahi taurangi ahurei. Engari i roto i te take o te herenga whakaroa, kaore i te rite te whanonga, na te mea kaore e taea te whakaroa i te taurangi ka tirohia tonu i te wa e mahia ai te whakahau sql.

Na, ko te tino o te raruraru kei roto i te "roa" o te haki: i roto i te tepu taketake ka puta i te wa o te mahi, a, i te tepu hou i te wa e mahia ana te whakahau sql. Ko te tikanga me whakarite kia rite tonu nga mahi arowhai i roto i nga keehi e rua: ka whakaroa i nga wa katoa, i nga wa tonu ranei.

Na he aha nga whakaaro i a maatau?

Waihangatia he taupū rite ki te whakaroa

Ko te whakaaro tuatahi ko te mahi i nga arowhai e rua i roto i te aratau tonu. Ka puta pea he maha o nga here pai, engari mena he iti noa iho, kaua e pa ki nga mahi a nga kaiwhakamahi, na te mea he ahua noa enei pakanga mo ratou. Ka puta, hei tauira, ka timata nga kaiwhakamahi e rua ki te whakatika i te widget kotahi i te wa kotahi, a, kaore te kaihoko o te kaiwhakamahi tuarua e whai wa ki te whiwhi korero kua aukatihia te widget mo te whakatika e te kaiwhakamahi tuatahi. I roto i tenei ahuatanga, ka kore te kaimau i te kaiwhakamahi tuarua, a ka hurihia e tana kaihoko nga huringa me te aukati i te widget. I muri tata nei, ka oti te whakarereketanga o te kaiwhakamahi tuatahi, ka whiwhi te tuarua i nga korero kaore i te aukatihia te widget ka taea te whakahoki ano i a raatau mahi.

Postgres: bloat, pg_repack me nga here kua whakaroa

Hei whakarite kia noho tonu nga arowhai i roto i te aratau kore-whakaroa, i hangahia e matou he taurangi hou e rite ana ki te herenga whakaroa taketake:

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

I roto i te taiao whakamatautau, he iti noa nga hapa e tumanakohia ana. Angitu! I oma ano matou i te pg_repack i runga i te whakaputanga ka 5 nga hapa i te kahui tuatahi i roto i te haora mahi. He hua pai tenei. Heoi, kua piki ake te maha o nga hapa i runga i te roopu tuarua, me mutu te pg_repack.

He aha i tupu ai? Ko te tupono ka puta he hapa kei runga i te maha o nga kaiwhakamahi e mahi ana me nga widget kotahi i te wa kotahi. Ko te ahua, i taua wa he iti ake nga huringa whakataetae me nga raraunga i rongoa i runga i te roopu tuatahi i era atu, i.e. he "waimarie" noa matou.

Kare te whakaaro i whai hua. I tera wa, ka kite matou i etahi atu otinga e rua: tuhia ano ta matou waehere tono ki te whakakore i nga here kua roa, "whakaako" pg_repack ki te mahi tahi me ratou. I whiriwhiria e matou te tuarua.

Whakakapihia nga taupū i te ripanga hou me nga here kua roa mai i te ripanga taketake

Ko te kaupapa o te whakahounga i kitea - mena he herea to te ripanga taketake, na mo te mea hou me hanga e koe he here, kaua ko te taurangi.

Hei whakamatautau i o maatau huringa, i tuhia e matou he whakamatautau ngawari:

  • tepu me te herenga whakaroa me te rekoata kotahi;
  • kōkuhu raraunga ki roto i te kopikopiko e taupatupatu ana ki te rekoata o naianei;
  • mahia he whakahou - kua kore nga raraunga e taupatupatu;
  • mahia nga huringa.

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;

Ko te putanga taketake o pg_repack i pakaru tonu i te whakauru tuatahi, ka mahi te putanga whakarereke me te kore he. Nui.

Ka haere matou ki te whakaputa ka puta ano he hapa i te wa ano o te kape i nga raraunga mai i te ripanga rangitaki ki tetahi mea hou:

$ ./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.

Te ahuatanga tawhito: ka mahi nga mea katoa i roto i nga taiao whakamatautau, engari kaore i te hanga?!

APPLY_COUNT me te hononga o nga puranga e rua

I timata matou ki te wetewete i te waehere ma te raina ma te raina, ka kitea he waahi nui: ka whakawhitihia nga raraunga mai i te ripanga rangitaki ki tetahi mea hou i roto i nga roopu, ko te APPLY_COUNT tonu i tohu te rahi o te puranga:

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

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

Ko te raruraru ko nga raraunga mai i te tauwhitinga taketake, he maha nga mahi ka taea te takahi i te herenga, ka whakawhitia, ka mutu ki te hononga o nga roopu e rua - ko te haurua o nga whakahau ka mahia i te roopu tuatahi, me te haurua atu. i te tuarua. Na konei, i runga i to waimarie: ki te kore nga kapa e takahi i tetahi mea i te roopu tuatahi, ka pai nga mea katoa, engari ki te mahi, ka puta he hapa.

Ko te APPLY_COUNT he rite ki nga rekoata 1000, e whakamarama ana he aha i angitu ai a maatau whakamatautau - kaore i kapi te keehi o te "puanga roopu". E rua nga whakahau i whakamahia e matou - te whakauru me te whakahou, no reira 500 nga whakawhitinga o nga whakahau e rua i tukuna i nga wa katoa i roto i te puranga kaore matou i pa he raruraru. Whai muri i te taapiri i te whakahou tuarua, ka mutu ta maatau whakatika:

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;

Na, ko te mahi e whai ake nei ko te whakarite ko nga raraunga mai i te ripanga taketake, i whakarereketia i roto i te tauwhitinga kotahi, ka mutu ki te ripanga hou i roto ano i te tauwhitinga kotahi.

Te whakahē i te puranga

E rua ano nga otinga. Tuatahi: me whakarere rawa te wehewehe ki roto i nga roopu me te whakawhiti raraunga i roto i te tauwhitinga kotahi. Ko te painga o tenei otinga ko tona ngawari - he iti noa nga huringa waehere e hiahiatia ana (ma te ara, i nga waahanga tawhito pg_reorg i mahi pera). Engari he raruraru - kei te hangahia e matou he tauwhitinga roa, a ko tenei, pera i nga korero o mua, he riri mo te putanga o te pupuhi hou.

Ko te otinga tuarua he uaua ake, engari he tika ake pea: hangahia he pou i roto i te ripanga rangitaki me te tautohu o te tauwhitinga i taapiri raraunga ki te ripanga. Na, ka kapehia e matou nga raraunga, ka taea e matou te whakarōpū i tenei huanga me te whakarite kia whakawhiti tahi nga huringa e pa ana. Ka hangahia te puranga mai i te maha o nga whakawhitinga (he kotahi nui ranei) ka rereke te rahi i runga i te nui o nga raraunga i whakarerekehia i enei whakawhitinga. He mea nui kia mohiohia mai i te mea ka uru nga raraunga mai i nga whakawhitinga rereke ki te ripanga rangitaki i runga i te raupapa matapōkere, ka kore e taea te panui raupapa, pera i mua. Seqscan mo ia tono me te tātari ma te tx_id he utu nui, ka hiahiatia he taurangi, engari ka whakahekehia te tikanga na te nui o te whakahou. I te nuinga o te wa, ka hiahia koe ki te patu i tetahi mea.

Na, i whakatau matou ki te timata me te waahanga tuatahi, na te mea he maamaa ake. Tuatahi, he mea tika kia mohio mena he tino raruraru te whakawhitinga roa. I te mea ko te whakawhitinga matua o nga raraunga mai i te teepu tawhito ki te mea hou ka puta ano i roto i tetahi tauwhitinga roa, ka huri te patai ki te "pehea te nui o te whakanui i tenei tauwhitinga?" Ko te roanga o te tauwhitinga tuatahi e whakawhirinaki ana ki te rahi o te tepu. Ko te roanga o te mea hou e whakawhirinaki ana ki te maha o nga huringa ka kohia ki te ripanga i te wa o te whakawhiti raraunga, ara. i runga i te kaha o te kawenga. I puta te oma pg_repack i roto i te wa iti rawa te utaina o nga ratonga, a, he iti noa iho te rahi o nga huringa ka whakaritea ki te rahi taketake o te ripanga. I whakatauhia e maatau ka warewarehia te wa o te tauwhitinga hou (mo te whakataurite, i te toharite ko te 1 haora me te 2-3 meneti).

He pai nga whakamatautau. Whakarewa i runga i te hanga hoki. Mo te whakamarama, koinei te pikitia me te rahi o tetahi o nga papaa raraunga i muri i te whakahaerenga:

Postgres: bloat, pg_repack me nga here kua whakaroa

I te mea i tino makona matou ki tenei otinga, kaore matou i ngana ki te whakatinana i te tuarua, engari kei te whakaaro matou ki te korerorero me nga kaiwhakawhanake toronga. Ko ta maatau arotakenga o naianei, kaore ano kia reri mo te whakaputa, na te mea i whakatauhia e matou te raru me nga here whakaroa motuhake, a, mo te papaki tino tika me whakarato tautoko mo etahi atu momo. Ko te tumanako ka taea e matou te mahi a muri ake nei.

Tena pea he patai taau, he aha tatou i uru atu ai ki tenei korero me te whakarereketanga o pg_repack, a kaore, hei tauira, i whakamahi i ona tairitenga? I etahi wa i whakaaro ano matou mo tenei, engari ko te wheako pai o te whakamahi i mua, i runga i nga teepu kaore he herenga whakaroa, i akiaki i a maatau ki te ngana ki te mohio ki te kaupapa o te raru me te whakatika. I tua atu, ko te whakamahi i etahi atu otinga ka whai wa ano ki te whakahaere i nga whakamatautau, na reira i whakatau maatau ka ngana taatau ki te whakatika i te raru i roto, a mena ka mohio matou kaore e taea e taatau te mahi i tenei waa, katahi ka tiimata taatau ki te tirotiro .

kitenga

Ko nga mea ka taea e matou te taunaki i runga i o maatau ake wheako:

  1. Aroturuki i to pupuhi. I runga i nga raraunga aroturuki, ka taea e koe te mohio ki te pai o te whirihora o te miihini aunoa.
  2. Whakaritea AUTOVACUUM kia noho puku ki te taumata e whakaaetia ana.
  3. Mena kei te tipu tonu te pupuhi ka kore e taea e koe te wikitoria ma te whakamahi i nga taputapu o waho o te pouaka, kaua e wehi ki te whakamahi i nga toronga o waho. Ko te mea nui ko te whakamatautau pai i nga mea katoa.
  4. Kaua e mataku ki te whakarereke i nga otinga o waho kia rite ki o hiahia - i etahi wa ka pai ake tenei, ka ngawari ake i te whakarereke i to ake waehere.

Source: will.com

Tāpiri i te kōrero