Postgres: bloat, pg_repack ma fa'agata fa'atuai

Postgres: bloat, pg_repack ma fa'agata fa'atuai

O le aʻafiaga o le faʻafefe i luga o laulau ma faʻasino igoa e lauiloa lautele ma o loʻo i ai e le gata i Postgres. E i ai auala e taulimaina ai i fafo atu o le atigipusa, pei o le VACUUM FULL poʻo le CLUSTER, ae latou te lokaina laulau i le taimi o le taotoga ma o le mea lea e le mafai ona faʻaaoga i taimi uma.

O le tusiga o le a aofia ai sina aʻoaʻoga e uiga i le faʻafefea ona tupu, pe faʻafefea ona e faʻafefe, e uiga i faʻalavelave tolopo ma faʻafitauli latou te aumaia i le faʻaogaina o le faʻaopoopoga pg_repack.

O lenei tusiga ua tusia e faavae i luga la'u tautalaga i le PgConf.Russia 2020.

Aisea e tupu ai le fula?

Postgres e faʻavae i luga o se faʻataʻitaʻiga tele-version (MVCC). O lona uiga o le laina ta'itasi i le laulau e mafai ona tele ni fa'aliliuga, a'o fefa'ataua'iga e le sili atu ma le tasi o nei fa'aliliuga, ae le o le mea e tasi. O lenei mea e mafai ai e le tele o fefaʻatauaiga ona galulue faʻatasi ma toetoe a leai se aʻafiaga o le tasi i le isi.

E manino lava, o nei lomiga uma e tatau ona teuina. E galue Postgres ma le manatua itulau i le itulau ma o le itulau o le aofaʻi aupito maualalo lea o faʻamaumauga e mafai ona faitau mai le disk pe tusitusi. Sei o tatou vaavaai i se faataitaiga laitiiti e malamalama ai pe faapefea ona tupu lenei mea.

Se'i faapea ua i ai sau laulau ua faaopoopo i ai nisi faamaumauga. O faʻamatalaga fou ua faʻaalia i le itulau muamua o le faila o loʻo teuina ai le laulau. O fa'amatalaga ola ia o laina o lo'o avanoa mo isi fefa'ataua'iga pe a mae'a se ta'utinoga (mo le fa'afaigofie, o le a tatou fa'apea o le tulaga tu'ufua o le Read Committed).

Postgres: bloat, pg_repack ma fa'agata fa'atuai

Ona matou fa'afouina lea o se tasi o fa'amaumauga, ma fa'ailogaina ai le fa'asologa tuai o le tuai.

Postgres: bloat, pg_repack ma fa'agata fa'atuai

Laasaga i lea laʻasaga, faʻafouina ma tape laina laina, matou faʻaiʻu i se itulau e tusa ma le afa o faʻamaumauga o le " lapisi ". O nei faʻamatalaga e le o vaʻaia e soʻo se fefaʻatauaiga.

Postgres: bloat, pg_repack ma fa'agata fa'atuai

Postgres ei ai se masini VACUUM, lea e fa'amamāina ai fa'aliliuga tuai ma avanoa mo fa'amaumauga fou. Ae afai e le o faʻatulagaina faʻamalosi pe pisi e galue i isi laulau, ona tumau lea o "faʻamatalaga lapisi", ma e tatau ona tatou faʻaogaina itulau faaopoopo mo faʻamatalaga fou.

O lea la i la tatou faʻataʻitaʻiga, i se taimi i le taimi o le laulau e aofia ai itulau e fa, ae naʻo le afa o le a aofia ai faʻamatalaga ola. O le iʻuga, pe a oʻo i le laulau, o le a matou faitauina le tele o faʻamatalaga nai lo le manaʻomia.

Postgres: bloat, pg_repack ma fa'agata fa'atuai

E tusa lava pe tape nei e le VACUUM fa'asologa o laina e le talafeagai, e le fa'aleleia tele le tulaga. O le a matou maua avanoa avanoa i itulau poʻo itulau atoa mo laina fou, ae o le a matou faitauina pea faʻamatalaga nai lo le manaʻomia.
Ile auala, afai o se itulau avanoa atoa (o le lona lua i la matou faʻataʻitaʻiga) o loʻo i le pito o le faila, ona mafai lea e le VACUUM ona tipi. Ae o lea ua i ai o ia i le ogatotonu, o lea e leai se mea e mafai ona faia ia te ia.

Postgres: bloat, pg_repack ma fa'agata fa'atuai

A o'o ina tele le numera o ia itulau gaogao po'o le tele o itulau, lea e ta'ua o le bloat, e amata ona afaina ai le faatinoga.

O mea uma o loʻo faʻamatalaina i luga o le faʻainisinia o le tupu mai o le fulafula i luga o laulau. I fa'asinomaga e tupu tele lenei mea i le auala lava e tasi.

Po'o ou fula?

E tele auala e iloa ai pe o iai lou fula. O le manatu muamua o le faʻaaogaina o fuainumera Postgres i totonu, o loʻo i ai faʻamatalaga lata mai e uiga i le numera o laina i luga o laulau, numera o laina "ola", ma isi. E mafai ona e mauaina le tele o fesuiaiga o tusitusiga saunia i luga ole Initaneti. Sa matou faia o se faavae tusitusiga mai le PostgreSQL Experts, lea e mafai ona iloilo laulau fa'ato'a fa'atasi ai ma fa'ailoga toast ma bloat btree. I lo matou poto masani, o lona sese o le 10-20%.

O le isi auala o le faʻaaogaina o le faʻaopoopoga pgstattuple, lea e mafai ai ona e vaʻavaʻai i totonu o itulau ma maua uma se faʻatusatusaga ma se tau saʻo. Ae i le tulaga lona lua, e tatau ona e suʻeina le laulau atoa.

Matou te mafaufau i se tau faʻafefe itiiti, e oʻo atu i le 20%, talia. E mafai ona manatu o se analogue o fillfactor mo laulau и faasino igoa. I le 50% ma luga atu, e ono amata faʻafitauli faʻatinoga.

Auala e foia ai le fulafula

Postgres e tele auala e foia ai le fulafula mai le pusa, ae e le o taimi uma e fetaui mo tagata uma.

Fa'atulaga le AUTOVACUUM ina ia le tupu le fula. Pe sili atu le sa'o, ia tausia i se tulaga e te taliaina. E foliga mai o se fautuaga a le "kapeteni", ae o le mea moni e le faigofie i taimi uma ona ausia. Mo se fa'ata'ita'iga, o lo'o i ai sau atina'e malosi ma suiga masani i le fa'asologa o fa'amaumauga, po'o se ituaiga o femalaga'iga fa'amatalaga o lo'o faia. O le i'uga, e ono suia so'o lau fa'amatalaga o uta ma e masani lava ona fesuisuia'i mai lea laulau i lea laulau. O lona uiga e tatau ona e galue pea i luma ma fetuutuunai le AUTOVACUUM i le suiga o talaaga o laulau taitasi. Ae e manino lava e le faigofie ona fai.

O le isi mafuaaga masani e le mafai ai e le AUTOVACUUM ona o gatasi ma laulau ona o loʻo i ai ni fefaʻatauaiga umi e taofia ai mai le faʻamamaina o faʻamaumauga o loʻo avanoa mo na fefaʻatauaiga. O le fautuaga iinei o loʻo manino foi - faʻaumatia fefaʻatauaiga "tautau" ma faʻaitiitia le taimi o fefaʻatauaiga faʻamalosi. Ae afai o le uta i luga o lau talosaga o se hybrid ole OLAP ma le OLTP, ona mafai lea ona e maua i le taimi lava e tasi le tele o faʻafouga masani ma fesili pupuu, faʻapea foʻi ma gaioiga umi - mo se faʻataʻitaʻiga, fausiaina o se lipoti. I se tulaga faapena, e taua le mafaufau e uiga i le faʻasalalauina o le uta i luga o faʻavae eseese, lea o le a mafai ai ona sili atu le faʻaogaina o latou taʻitasi.

O le isi faʻataʻitaʻiga - e tusa lava pe tutusa le faʻamatalaga, ae o le database o loʻo i lalo o se uta maualuga, e oʻo lava i le AUTOVACUUM sili ona malosi e le mafai ona faʻafetaui, ma o le a tupu. Fua (tutusa pe faalava) na o le pau lea o le fofo.

O le a le mea e fai i se tulaga ua e setiina le AUTOVACUUM, ae o loʻo faʻaauau pea le tupu.

au VACUUM TUMU toe fausia mea o lo'o i totonu o laulau ma fa'asino igoa ma tu'u ai na'o fa'amatalaga talafeagai i totonu. Ina ia faʻaumatia le fulafula, e galue lelei, ae i le taimi o lona faʻatinoina o se loka faʻapitoa i luga o le laulau e puʻeina (AccessExclusiveLock), lea e le faʻatagaina ai le faʻatinoina o fesili i luga o lenei laulau, e oʻo lava i le filifilia. Afai e mafai ona e gafatia e taofi lau auaunaga poʻo se vaega mo sina taimi (mai le sefulu minute i le tele o itula e faʻatatau i le tele o faʻamaumauga ma au meafaigaluega), ona sili lea o lenei filifiliga. Ae paga lea, e leai so matou taimi e tamoe ai VACUUM FULL i le taimi o le tausiga faʻatulagaina, o lea e le talafeagai lenei metotia mo i matou.

au CLUSTER Toe faʻaleleia mea o loʻo i totonu o laulau i le auala lava e tasi e pei o le VACUUM FULL, ae faʻatagaina oe e faʻamaonia se faasino igoa e tusa ai ma faʻamaumauga o le a faʻatonuina faaletino i luga o le disk (ae i le lumanaʻi e le faʻamaonia le faʻatonuga mo laina fou). I nisi tulaga, o se fa'atonuga lelei lea mo le tele o fesili - fa'atasi ai ma le faitauina o fa'amaumauga e tele i fa'asinomaga. O le le lelei o le poloaiga e tutusa ma le VACUUM FULL - e lokaina le laulau i le taimi o le taotoga.

au REINDEX e tutusa ma le lua muamua, ae toe fausia se faasino igoa po o faasino igoa uma o le laulau. Loka e fai si vaivai: ShareLock i luga o le laulau (puipuia suiga, ae mafai ona filifili) ma AccessExclusiveLock i luga o le faasino igoa ua toe fausia (poloka fesili e faaaoga ai le faasino igoa). Ae ui i lea, i le 12th version o Postgres na faʻaalia ai se parakalafa FAATATAU, lea e mafai ai ona e toe fausia le faasino igoa e aunoa ma le polokaina o faʻaopoopoga faʻatasi, suiga, poʻo le tapeina o faʻamaumauga.

I lomiga muamua o Postgres, e mafai ona e ausia se taunuuga tutusa ma REINDEX CONCURRENTLY faʻaaogaina FAIA FA'AVAE FA'ATAU. E mafai ai ona e fatuina se faasino igoa e aunoa ma le lokaina (ShareUpdateExclusiveLock, lea e le faʻalavelave i fesili tutusa), ona sui lea o le faasino igoa tuai i se mea fou ma tape le faʻailoga tuai. O lenei mea e mafai ai e oe ona faʻaumatia index bloat e aunoa ma le faʻalavelave i lau talosaga. E taua le mafaufau pe a toe fausia fa'asino igoa o le ai ai se uta fa'aopoopo i luga o le disk subsystem.

O le mea lea, afai mo faʻamatalaga o loʻo i ai auala e faʻaumatia ai le fulafula "i luga o le lele," ona leai lea o se laulau. O le mea lea e amata ai le tele o faʻaopoopoga fafo: pg_repack (muamua pg_reorg), pgcompact, pgcompacttable ma isi. I lenei tusiga, o le a ou le faʻatusatusaina i latou ma o le a naʻo le talanoa e uiga i pg_repack, lea, pe a maeʻa ni suiga, matou te faʻaogaina i matou lava.

Auala e galue ai pg_repack

Postgres: bloat, pg_repack ma fa'agata fa'atuai
Fa'apea o lo'o i ai sau laulau masani - fa'atasi ai ma fa'ailoga, tapula'a ma, o le mea e leaga ai, o lo'o fa'apupulaina. O le laasaga muamua o le pg_repack o le fatuina lea o se laulau ogalaau e teu ai faʻamatalaga e uiga i suiga uma aʻo taʻavale. O le fa'aoso o le a toe faia nei suiga mo fa'aofi uma, fa'afouina ma tape. Ona faia lea o se laulau, e tutusa ma le muamua i le fausaga, ae leai ni faʻasinomaga ma tapulaʻa, ina ia aua neʻi faʻagesegese le faagasologa o le faʻaofiina o faʻamaumauga.

Le isi, pg_repack fa'aliliuina fa'amaumauga mai le laulau tuai i le laulau fou, fa'amama fa'amama uma laina le talafeagai, ona fa'atupu ai lea o fa'asino igoa mo le laulau fou. I le taimi o le faʻatinoina o nei gaioiga uma, o suiga e faʻaputu i le laulau ogalaau.

O le isi laasaga o le tuʻuina atu lea o suiga i le laulau fou. O le femalagaiga e faia i luga o le tele o faʻamatalaga, ma a itiiti ifo i le 20 faʻamaumauga o loʻo totoe i le laulau ogalaau, e maua e pg_repack se loka malosi, faʻafeiloaʻi faʻamatalaga lata mai, ma suia le laulau tuai i le laulau fou i le Postgres system tables. E na'o le pau lea o le taimi e le mafai ai ona e galue ma le laulau. A maeʻa lenei mea, o le laulau tuai ma le laulau faʻatasi ai ma ogalaau e tape ma avanoa avanoa i le faila faila. Ua maea le faagasologa.

E foliga lelei mea uma i le teori, ae o le a le mea e tupu i le faʻatinoga? Na matou faʻataʻitaʻiina le pg_repack e aunoa ma se uta ma lalo o le uta, ma siaki lona faʻagaioiga i le tulaga o le taofi vave (i se isi faaupuga, faʻaaoga Ctrl + C). Sa lelei su'ega uma.

Na matou o i le faleoloa meaai - ona leʻi alu lea o mea uma e pei ona matou faʻamoemoeina.

Fa'atau muamua panikeke

I luga o le fuifui muamua na matou maua se mea sese e uiga i le solia o se faʻalavelave tulaga ese:

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

O lenei tapula'a sa i ai se igoa fa'a-autometi index_16508 - na faia e pg_repack. Faʻavae i luga o uiga o loʻo aofia ai i lona tuufaatasiga, na matou fuafuaina "lo matou" faʻalavelave e fetaui ma ia. O le faʻafitauli na faʻaalia e le o se tapulaʻa masani masani, ae o se faʻatuai (fa'agata fa'atuai), i.e. o lona faʻamaoniga e faia mulimuli ane nai lo le sql poloaiga, lea e oʻo atu ai i taunuuga e leʻi mafaufauina.

Fa'agata fa'atuai: aisea e mana'omia ai ma pe fa'apefea ona latou galulue

Se manatu itiiti e uiga i tapula'a tolopoina.
Seʻi o tatou mafaufau i se faʻataʻitaʻiga faigofie: o loʻo i ai se tusi faʻataʻitaʻiga o taʻavale e lua uiga - o le igoa ma le faʻatonuga o le taavale i le lisi.
Postgres: bloat, pg_repack ma fa'agata fa'atuai

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



Fa'apea e mana'omia ona sui le ta'avale muamua ma le lua. O le fofo tuusaʻo o le faʻafouina o le tau muamua i le lona lua, ma le lona lua i le muamua:

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

Ae a matou faʻatautaia lenei tulafono, matou te faʻamoemoeina se faʻalavelave faʻalavelave ona o le faʻasologa o tau i le laulau e tulaga ese:

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

E mafai faapefea ona ou faia ese? Filifiliga muamua: faʻaopoopo se faʻaopoopoga o mea e sui ai se faʻatonuga e mautinoa e le o iai i le laulau, mo se faʻataʻitaʻiga "-1". I polokalame, e taʻua lea o le "fetufaaiga o tau o suiga e lua i le tolu." Pau lava le faʻaletonu o lenei metotia o le faʻafouga faaopoopo.

Filifiliga lona lua: Toe fa'atulaga le laulau e fa'aoga ai se ituaiga fa'amatalaga mata'utia mo le tau o le fa'atonu nai lo numera. Ma, pe a faʻafouina le tau mai le 1, mo se faʻataʻitaʻiga, i le 2.5, o le faʻamatalaga muamua o le a otometi lava "tu" i le va o le lona lua ma le tolu. E aoga lenei fofo, ae e lua tapulaa. Muamua, o le a le aoga mo oe pe a faʻaaogaina le tau i se mea i totonu o le atinaʻe. Lona lua, faʻalagolago i le saʻo o le ituaiga faʻamatalaga, o le ae maua se numera faʻatapulaʻa o faʻapipiʻi faʻapipiʻi aʻo leʻi toe faʻatatauina tau o faʻamaumauga uma.

Filifiliga lona tolu: fai le fa'agata fa'atuai ina ia siaki na'o le taimi o le ta'utinoga:

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

Talu ai o le faʻatatau o la matou talosaga muamua e faʻamautinoa ai o tulaga taua uma e tulaga ese i le taimi o le tautinoga, o le a manuia.

O le faʻataʻitaʻiga o loʻo talanoaina i luga, o le mea moni, e matua gaosia lava, ae faʻaalia ai le manatu. I la matou talosaga, matou te faʻaogaina tapulaʻa faʻatuai e faʻatino ai manatu e nafa ma le foia o feteʻenaʻiga pe a galulue tagata faʻaoga i le taimi e tasi ma mea faʻasoa widget i luga o le laupapa. O le fa'aogaina o ia tapula'a e mafai ai ona tatou fa'afaigofie teisi le fa'ailoga tusi.

I se tulaga lautele, faʻalagolago i le ituaiga o faʻalavelave, Postgres e tolu laʻasaga o granularity mo le siakiina o latou: laina, fefaʻatauaiga, ma faʻamatalaga tulaga.
Postgres: bloat, pg_repack ma fa'agata fa'atuai
puna: begriffs

CHECK ma NOT NULL e siaki i taimi uma i le laina tulaga; mo isi tapulaʻa, e pei ona mafai ona vaʻaia mai le laulau, e eseese filifiliga. E mafai ona e faitau atili iinei.

I se aotelega faapuupuu, o faʻalavelave faʻatuai i le tele o tulaga e maua ai le tele o tulafono e mafai ona faitau ma faʻaitiitia le faʻatonuga. Ae ui i lea, e tatau ona e totogia lenei mea e ala i le faʻalavelaveina o le faʻagasologa o le debugging, talu ai o le taimi e tupu ai le mea sese ma le taimi e te iloa ai e vavae ese i le taimi. O le isi fa'afitauli e ono le mafai e le tagata fa'atulagaina ona fausia se fuafuaga sili ona lelei pe afai o le talosaga e aofia ai se fa'agata fa'atuai.

Fa'aleleia o le pg_repack

Ua uma ona matou talanoaina po o le a le tapula'a ua tolopoina, ae fa'afefea ona fa'atatau i lo matou fa'afitauli? Tatou manatua le mea sese na tatou mauaina muamua:

$ ./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 tupu pe a kopiina faʻamaumauga mai se laulau faʻamau i se laulau fou. E ese lenei mea ona... o fa'amaumauga i totonu o le laulau ogalaau o lo'o tu'uina fa'atasi ma fa'amaumauga i le laulau fa'apogai. Afai latou te faʻamalieina le faʻatumauina o le laulau muamua, e faʻafefea ona latou solia ia lava faʻalavelave i le laulau fou?

E pei ona aliali mai, o le aʻa o le faʻafitauli o loʻo taoto i le laasaga muamua o le pg_repack, lea e fatuina ai na o faʻasinomaga, ae le o faʻalavelave: o le laulau tuai na i ai se faʻalavelave tulaga ese, ma o le mea fou na fausia ai se faʻailoga tulaga ese nai lo.

Postgres: bloat, pg_repack ma fa'agata fa'atuai

E taua le maitauina iinei afai o le faʻalavelave e masani ma e le tolopoina, o le faʻailoga tulaga ese na faia nai lo le tutusa ma lenei faʻalavelave, aua O faʻalavelave faʻapitoa i Postgres e faʻatinoina e ala i le fatuina o se faʻailoga tulaga ese. Ae i le tulaga o se faʻalavelave faʻatuai, e le tutusa le amio, aua e le mafai ona tolopoina le faʻasino ma e siakiina i taimi uma i le taimi e faʻatino ai le poloaiga sql.

O le mea lea, o le ute o le faʻafitauli o loʻo taoto i le "faʻatuai" o le siaki: i le laulau muamua e tupu i le taimi o le taʻutinoga, ma i le laulau fou i le taimi e faʻatino ai le poloaiga sql. O lona uiga e tatau ona tatou mautinoa o siaki e faia tutusa i tulaga uma e lua: pe tuai i taimi uma, poʻo taimi uma lava.

O a la ni o tatou manatu?

Fausia se faasino igoa e pei o le tolopoina

O le manatu muamua o le faia o siaki uma e lua i se faiga vave. E mafai ona fa'atupuina ni fa'atapula'a lelei sese, ae afai e to'aitiiti, e le tatau ona a'afia ai galuega a tagata fa'aoga, ona o ia fete'ena'iga o se tulaga masani mo i latou. E tupu, mo se faʻataʻitaʻiga, pe a amata e tagata e toʻalua ona faʻataʻitaʻia le widget lava e tasi i le taimi e tasi, ma le tagata o tausia o le tagata faʻaoga lona lua e leai se taimi e maua ai faʻamatalaga ua uma ona poloka le widget mo le faʻasaʻoina e le tagata muamua. I se tulaga faapena, e teena e le server le tagata faʻaoga lona lua, ma toe faʻafoʻi e le tagata o tausia suiga ma poloka le widget. I se taimi mulimuli ane, pe a maeʻa e le tagata muamua ona faʻataʻitaʻia, o le a maua e le lona lua faʻamatalaga e le o toe poloka le widget ma o le a mafai ona toe faia a latou gaioiga.

Postgres: bloat, pg_repack ma fa'agata fa'atuai

Ina ia mautinoa o siaki o loʻo i ai i taimi uma e le tolopoina, na matou faia se faʻailoga fou e tutusa ma le faʻatapulaʻaina muamua:

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

I le si'osi'omaga o su'ega, na o ni nai mea sese na fa'amoemoeina na matou maua. Manuia! Na matou toe tamoe i le pg_repack i le gaosiga ma maua 5 mea sese i le fuifui muamua i le itula o galuega. O se taunuuga e taliaina. Ae ui i lea, ua uma ona i luga o le fuifui lona lua o le numera o mea sese na matua faateleina ma e tatau ona matou taofi pg_repack.

Aisea na tupu ai? Ole fa'alavelave e tupu se mea sese e fa'alagolago ile to'afia o tagata fa'aoga o lo'o galulue fa'atasi ma widget i le taimi e tasi. E foliga mai, i lena taimi sa i ai le itiiti ifo o suiga tauvaga ma faʻamaumauga o loʻo teuina i luga o le fuifui muamua nai lo isi, i.e. sa na o matou "manuia".

Sa le aoga le manatu. I lena taimi, na matou vaʻai i isi fofo e lua: toe tusi a matou code talosaga e faʻateʻa ai faʻalavelave faʻatuai, poʻo le "aʻoaʻo" pg_repack e galulue ma i latou. Sa matou filifilia le lona lua.

Suia fa'asino igoa i le laulau fou i tapula'a tuai mai le laulau muamua

O le faʻamoemoega o le toe iloiloga na manino - pe a fai o le laulau muamua o loʻo i ai se faʻalavelave tolopo, ona mo le mea fou e te manaʻomia le faia o se faʻalavelave, ae le o se faʻasino.

Ina ia faʻataʻitaʻi a matou suiga, matou tusia se suʻega faigofie:

  • laulau fa'atasi ai ma se fa'agata fa'atuai ma tasi fa'amaumauga;
  • fa'aofi fa'amaumauga i se matasele e fete'ena'i ma se fa'amaumauga o iai;
  • fai se fa'afouga - e le toe fete'ena'i fa'amaumauga;
  • faia suiga.

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;

O le uluai lomiga o le pg_repack e masani ona paʻu i luga o le faʻaofi muamua, o le suiga suiga na galue e aunoa ma ni mea sese. Matagofie.

Matou te alu i le gaosiga ma toe maua se mea sese i le laʻasaga tutusa o le kopiina o faʻamaumauga mai le laulau ogalaau i se mea fou:

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

Tulaga masani: mea uma e galue i siosiomaga suʻega, ae le o le gaosiga?!

APPLY_COUNT ma le sooga o vaega e lua

Na amata ona matou suʻesuʻeina le faʻailoga i lea laina ma lea laina ma maua ai se mea taua: o faʻamaumauga e faʻafeiloaʻi mai le laulau ogalaau i se mea fou i vaega, o le APPLY_COUNT tumau e faʻaalia ai le tele o le vaega:

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

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

O le faʻafitauli o le faʻamatalaga mai le uluai fefaʻatauaiga, lea e mafai ai e le tele o gaioiga ona solia le faʻalavelave, pe a faʻafeiloaʻi, e mafai ona iu i le vaeluaga o vaega e lua - o le afa o poloaiga o le a faia i le vaega muamua, ma le isi afa i le lona lua. Ma o iinei, e faalagolago i lau laki: afai e le solia e 'au se mea i le vaega muamua, ona lelei lea o mea uma, ae afai latou te faia, e tupu se mea sese.

APPLY_COUNT e tutusa ma le 1000 fa'amaumauga, o lo'o fa'amatalaina ai le mafua'aga na manuia ai a matou su'ega - latou te le'i aofia ai le mataupu o le "vaega tu'ufa'atasi". Na matou faʻaogaina ni faʻatonuga se lua - faʻapipiʻi ma faʻafouina, o le mea tonu lava e 500 fefaʻatauaiga o tulafono e lua na tuʻuina i taimi uma i se vaega ma matou te leʻi oʻo i ni faʻafitauli. Ina ua uma ona faʻaopoopo le faʻafouga lona lua, na le toe galue le matou faʻatonuga:

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;

O lea la, o le isi galuega o le faʻamautinoa o faʻamaumauga mai le laulau muamua, lea na suia i se tasi fefaʻatauaiga, e iu i le laulau fou i totonu o le tasi fefaʻatauaiga.

Tete'e mai le fa'aputuga

Ma toe lua foi a matou fofo. Muamua: se'i tatou lafoa'i atoa le vaeluaga i vaega ma fa'aliliu fa'amaumauga i se tasi fefa'ataua'iga. O le lelei o lenei fofo o lona faigofie - o suiga tulafono manaʻomia e laʻititi (i le ala, i faʻasologa tuai pg_reorg sa galue tutusa). Ae o loʻo i ai se faʻafitauli - o loʻo matou faia se fefaʻatauaiga umi, ma o lenei, e pei ona taʻua muamua, o se faʻamataʻu i le tulaʻi mai o se fou fou.

O le fofo lona lua e sili atu ona lavelave, ae atonu e sili atu le saʻo: fatuina se koluma i le laulau ogalaau ma le faʻamatalaga o le fefaʻatauaiga na faʻaopoopoina faʻamatalaga i le laulau. Ma, a matou kopiina faʻamaumauga, e mafai ona matou faʻavasegaina i lenei uiga ma faʻamautinoa o loʻo faʻafeiloaʻi faʻatasi suiga. Ole vaega ole a fau mai le tele o fefa'atauaiga (po'o le tasi tele) ma o lona tele o le a eseese e fa'atatau i le tele o fa'amaumauga na suia i nei fefa'atauaiga. E taua le maitauina talu ai o faʻamatalaga mai fefaʻatauaiga eseese e ulufale atu i le laulau ogalaau i se faasologa faʻafuaseʻi, o le a le toe mafai ona faitau faʻasolosolo, e pei ona i ai muamua. seqscan mo talosaga taʻitasi ma le faʻamamaina e le tx_id e taugata tele, e manaʻomia se faʻasinomaga, ae o le a faʻagesegese foi le auala ona o le maualuga o le faʻafouina. I se tulaga lautele, e pei lava o taimi uma, e tatau ona e ositaulagaina se mea.

O lea, na matou filifili e amata i le filifiliga muamua, aua e faigofie. Muamua, sa tatau ona malamalama pe o se fefaʻatauaiga umi o se faʻafitauli moni. Talu ai ona o le fesiitaiga autu o faʻamatalaga mai le laulau tuai i le mea fou e tupu foi i se tasi o fefaʻatauaiga umi, o le fesili na suia i le "o le a le tele o le a tatou faʻateleina lenei fefaʻatauaiga?" Ole umi ole fefa'ataua'iga muamua e fa'atatau ile tele ole laulau. O le umi o se mea fou e faʻalagolago i le tele o suiga e faʻaputuina i le laulau i le taimi o le fesiitaiga o faʻamatalaga, i.e. i luga o le malosi o le uta. O le pg_repack run na tupu i le taimi o le laʻititi o le uta o auaunaga, ma o le tele o suiga na faʻatauvaʻa laʻititi pe a faʻatusatusa i le uluaʻi lapoʻa o le laulau. Na matou filifili e mafai ona matou le amanaiaina le taimi o se fefaʻatauaiga fou (mo faʻatusatusaga, i le averesi o le 1 itula ma le 2-3 minute).

Sa lelei su'ega. Fa'alauiloa ile gaosiga fo'i. Mo le manino, o se ata lenei ma le tele o se tasi o faʻamaumauga pe a uma ona taʻavale:

Postgres: bloat, pg_repack ma fa'agata fa'atuai

Talu ai na matou matua faamalieina i lenei fofo, matou te leʻi taumafai e faʻatino le lona lua, ae o loʻo matou mafaufau i le avanoa e talanoaina ai ma le au atinaʻe faʻaopoopoga. O le matou toe iloiloga o loʻo i ai nei, o le mea e leaga ai, e leʻi sauni mo le lolomiina, talu ai na matou foia le faʻafitauli i faʻatapulaʻa faʻatapulaʻaina faʻatapulaʻaina, ma mo se patch atoatoa e tatau ona tuʻuina atu le lagolago mo isi ituaiga. Matou te faʻamoemoe e mafai ona faia lenei mea i le lumanaʻi.

Masalo e iai sau fesili, aisea na matou aʻafia ai i lenei tala i le suiga o le pg_repack, ma e leʻi faʻaaogaina ana analogues, mo se faʻataʻitaʻiga? I se taimi na matou mafaufau ai foi i lenei mea, ae o le aafiaga lelei o le faʻaaogaina muamua, i luga o laulau e aunoa ma le tolopoina o faʻalavelave, na faʻaosofia ai i matou e taumafai e malamalama i le aano o le faʻafitauli ma faʻaleleia. E le gata i lea, o le faʻaaogaina o isi fofo e manaʻomia ai foi le taimi e faia ai suʻega, o lea na matou filifili ai o le a matou taumafai muamua e foia le faʻafitauli i totonu, ma afai matou te iloa e le mafai ona matou faia lenei mea i se taimi talafeagai, ona amata lea ona matou vaʻavaʻai i analogues. .

sailiiliga

O mea e mafai ona matou fautuaina e faʻatatau i lo matou lava poto masani:

  1. Mataʻituina lou faʻafefe. Faʻavae i luga o faʻamatalaga mataʻituina, e mafai ona e malamalama i le lelei o le faʻaogaina o le autovacuum.
  2. Fetuuna'i le AUTOVACUUM e fa'atumauina ai le fula i se tulaga talafeagai.
  3. Afai o loʻo faʻatupu pea le fulafula ma e le mafai ona e faʻatoʻilaloina i le faʻaaogaina o meafaigaluega i fafo atu o le pusa, aua le fefe e faʻaoga faʻaopoopoga fafo. O le mea autu o le suʻeina lelei o mea uma.
  4. Aua e te fefe e sui fofo i fafo e fetaui ma ou manaʻoga - o nisi taimi e mafai ona sili atu le aoga ma sili atu ona faigofie nai lo le suia o lau lava code.

puna: www.habr.com

Faaopoopo i ai se faamatalaga