Ntlafatso e ngata ea lipotso tsa PostgreSQL. Kirill Borovikov (Tensor)

Tlaleho e hlahisa mekhoa e meng e lumellang hlokomela ts'ebetso ea lipotso tsa SQL ha ho na le limilione tsa tsona ka letsatsi, 'me ho na le li-server tse makholo tsa PostgreSQL tse behiloeng leihlo.

Ke litharollo life tsa tekheniki tse re lumellang ho sebetsana ka katleho le bongata bo joalo ba tlhahisoleseling, 'me see se nolofatsa bophelo ba moqapi ea tloaelehileng joang?


Ke mang ea thahasellang? tlhahlobo ea mathata a khethehileng le mekhoa e fapaneng ea ho ntlafatsa Lipotso tsa SQL le ho rarolla mathata a tloaelehileng a DBA ho PostgreSQL - le uena u ka khona bala letoto la lihlooho ka taba ena.

Ntlafatso e ngata ea lipotso tsa PostgreSQL. Kirill Borovikov (Tensor)
Lebitso la ka ke Kirill Borovikov, ke emela Khampani ea Tensor. Haholo-holo, ke sebetsa ka thata ho sebetsa le datha tsa k'hamphani ea rona.

Kajeno ke tla u bolella kamoo re ntlafatsang lipotso kateng, ha u sa hloke ho "khetholla" ts'ebetso ea potso e le 'ngoe, empa ho rarolla bothata ka bongata. Ha ho na le limilione tsa likopo, 'me u hloka ho fumana tse ling mekhoa ea ho rarolla mathata bothata bona bo boholo.

Ka kakaretso, Tensor bakeng sa milione ea bareki ba rona e VLSI ke sesebelisoa sa rona: marang-rang a mekhatlo ea sechaba, litharollo tsa puisano ea video, bakeng sa phallo ea litokomane tsa ka hare le tsa ka ntle, mekhoa ea likarabello bakeng sa likarabello le matlo a polokelo, ... Ke hore, "mega-combine" e joalo bakeng sa tsamaiso e kopanetsoeng ea khoebo, eo ho eona ho nang le tse fetang 100 tse fapaneng. merero ea ka hare.

Ho netefatsa hore kaofela ha tsona li sebetsa le ho ntlafala ka mokhoa o tloaelehileng, re na le litsi tsa ntlafatso tse 10 naheng ka bophara, tse nang le tse ling ho tsona 1000 bahlahisi.

Re ntse re sebetsa le PostgreSQL ho tloha 2008 mme re bokelletse palo e kholo ea seo re se sebetsanang - data ea bareki, lipalo-palo, tlhahlobo, data ho tsoa lits'ebetsong tsa tlhahisoleseling tsa kantle - ho feta 400TB. Ho na le li-server tse ka bang 250 tlhahisong feela, 'me ka kakaretso ho na le li-server tse ka bang 1000 tsa database tseo re li behang leihlo.

Ntlafatso e ngata ea lipotso tsa PostgreSQL. Kirill Borovikov (Tensor)

SQL ke puo ea phatlalatso. Ha u hlalose "kamoo" ntho e lokelang ho sebetsa kateng, empa "seo" seo u batlang ho se finyella. DBMS e tseba hamolemo ho etsa JOIN - mokhoa oa ho hokahanya litafole tsa hau, ke maemo afe a lokelang ho beoa, ho tla feta eng ka index, ke eng e ke keng ea ...

Li-DBMS tse ling li amohela likeletso: "Che, kopanya litafole tsena tse peli meleng e joalo," empa PostgreSQL e ke ke ea etsa sena. Bona ke boemo bo hlokolosi ba bahlahisi ba etelletseng pele: "Re ka mpa ra phethela potso e ntlafatsang ho e-na le ho lumella bahlahisi ho sebelisa malebela a mofuta o itseng."

Empa, leha taba ea hore PostgreSQL ha e lumelle "kantle" ho itaola, e lumella ka botlalo bona se etsahalang ka hare ho yenaha o botsa potso ea hau, le moo e nang le mathata.

Ntlafatso e ngata ea lipotso tsa PostgreSQL. Kirill Borovikov (Tensor)

Ka kakaretso, ke mathata afe a khale ao mohlahisi [ea DBA] a atisang ho tla le 'ona? “Mona re phethile kopo, mme tsohle li lieha ho rona, ntho e 'ngoe le e 'ngoe e leketlile, ho na le ho hong ho etsahalang... Mofuta o mong oa mathata!"

Mabaka a batla a tšoana kamehla:

  • algorithm e sa sebetseng ea ho botsa
    Moqapi: "Hona joale ke mo fa litafole tse 10 ho SQL ka JOIN ..." - mme o lebeletse hore maemo a hae a tla "hlakoloa" ka mohlolo 'me o tla fumana ntho e' ngoe le e 'ngoe kapele. Empa mehlolo ha e etsahale, 'me tsamaiso leha e le efe e nang le phapang e joalo (litafole tse 10 ho FROM e le' ngoe) kamehla e fana ka mofuta o itseng oa phoso. [sehlooho]
  • lipalo tse sa lokelang
    Ntlha ena e bohlokoa haholo bakeng sa PostgreSQL, ha u "tšollela" dataset e kholo ho seva, etsa kopo, 'me e "sexcanits" tablet ea hau. Hobane maobane ho ne ho e-na le litlaleho tsa 10 ho eona, 'me kajeno ho na le limilione tse 10, empa PostgreSQL ha e e-s'o tsebe sena,' me re hloka ho e bolella ka eona. [sehlooho]
  • "plug" ho lisebelisoa
    O kentse polokelongtshedimosetso e kgolo e tletseng haholo ho seva e fokolang e se nang disk, memori kapa processor e lekaneng. 'Me ke eona feela ... Kae-kae ho na le siling ea ts'ebetso ka holimo eo u ke keng ua hlola u qhoma.
  • thibela
    Ena ke ntlha e thata, empa e bohlokoa haholo bakeng sa lipotso tse fapaneng tsa ho fetola (INSERT, UPDATE, DELETE) - ena ke sehlooho se arohaneng.

Ho fumana leano

... Mme bakeng sa tse ding tsohle re hloka leano! Re hloka ho bona se etsahalang ka har'a seva.

Ntlafatso e ngata ea lipotso tsa PostgreSQL. Kirill Borovikov (Tensor)

Morero oa ts'ebetso ea lipotso bakeng sa PostgreSQL ke sefate sa algorithm ea ho botsa lipotso ka boemeli ba mongolo. Hantle-ntle ke algorithm eo, ka lebaka la tlhahlobo ea moralo, e fumanoeng e sebetsa ka ho fetisisa.

Node e 'ngoe le e' ngoe ea sefate ke ts'ebetso: ho khutlisa data ho tloha tafoleng kapa index, ho haha ​​​​bitmap, ho kopanya litafole tse peli, ho kopanya, ho fapanyetsana, kapa ho se kenye likhetho. Ho etsa potso ho kenyelletsa ho tsamaea ka har'a li-node tsa sefate sena.

Ho fumana moralo oa potso, tsela e bonolo ka ho fetisisa ke ho phethahatsa polelo EXPLAIN. Ho fumana litšobotsi tsohle tsa 'nete, ke hore, ho etsa potso motheong - EXPLAIN (ANALYZE, BUFFERS) SELECT ....

Karolo e mpe: ha u e matha, e etsahala "mona le hona joale", kahoo e loketse feela ho lokisa bothata ba sebakeng seo. Haeba u nka seva e laetsoeng haholo e tlas'a phallo e matla ea liphetoho tsa data, 'me u bona: "Oh! Mona re na le ts'ebetso e liehangho hloma liahelo kopo." Halofo ea hora, hora e fetileng - ha u ntse u matha 'me u fumana kopo ena ho tsoa ho li-log, u e khutlisetsa ho seva, dataset ea hau eohle le lipalo-palo li fetohile. U e tsamaisa ho e lokisa - 'me e sebetsa kapele! Mme ha o utlwisise hobaneng, hobaneng e ne e le joalo butle.

Ntlafatso e ngata ea lipotso tsa PostgreSQL. Kirill Borovikov (Tensor)

E le ho utloisisa se etsahetseng hantle nakong eo kopo e neng e etsoa ho seva, batho ba bohlale ba ngotse auto_explain module. E teng hoo e batlang e le likhatisong tsohle tse atileng haholo tsa PostgreSQL, 'me e ka kengoa tšebetsong feela faeleng ea config.

Haeba e hlokomela hore kopo e 'ngoe e nka nako e telele ho feta moeli oo u e laetseng, e etsa joalo "setšoantšo" sa moralo oa kopo ena 'me o li ngola hammoho ho log.

Ntlafatso e ngata ea lipotso tsa PostgreSQL. Kirill Borovikov (Tensor)

Ntho e 'ngoe le e 'ngoe e bonahala e le hantle hona joale, re ea lehong re bone moo ... [text footcloth]. Empa ha re na ho bua letho ka eona, ntle le taba ea hore ke leano le letle hobane ho nkile 11ms ho e phetha.

Ntho e 'ngoe le e' ngoe e bonahala e lokile - empa ha ho letho le hlakileng hore na ha e le hantle ho etsahetse'ng. Ntle le nako e akaretsang, ha re bone letho. Hobane ho sheba "konyana" e joalo ea mongolo o hlakileng hangata ha se pono.

Empa le haeba e sa totobala, le haeba e le tšitiso, ho na le mathata a bohlokoa haholo:

  • Node e bontša kakaretso ea lisebelisoa tsa subtree eohle tlasa hae. Ke hore, u ke ke ua fumana feela hore na ho sebelisitsoe nako e kae ho Index ena e khethehileng haeba ho na le boemo bo itseng ka tlas'a eona. Re tlameha ho sheba ka matla ho bona hore na ho na le "bana" le mefuta e fapaneng ea maemo, CTEs ka hare - le ho tlosa tsena tsohle "ka likelellong tsa rona".
  • Ntlha ea bobeli: nako e bontšitsoeng node ke nako ea ts'ebetso ea node e le 'ngoe. Haeba node ena e ne e etsoa ka lebaka la, ka mohlala, sekoti ka litlaleho tsa tafole ka makhetlo a 'maloa, joale palo ea li-loops-lipotoloho tsa node ena-e eketseha ka moralo. Empa nako ea ho bolaoa ha athomo ka boeona e lula e tšoana ho latela moralo. Ke hore, e le hore u utloisise hore na node ena e entsoe nako e kae ka kakaretso, u lokela ho atisa ntho e 'ngoe ka e' ngoe - hape, "hloohong ea hau."

Maemong a joalo, utloisisa "Lehokelo le fokolang ke mang?" hoo e ka bang ha ho kgonehe. Ka hona, esita le bahlahisi ka bobona ba ngola ka "manual" hore "Ho utloisisa moralo ke bonono bo lokelang ho ithutoa, boiphihlelo ...".

Empa re na le bahlahisi ba 1000, 'me u ke ke ua fetisetsa phihlelo ena ho e mong le e mong oa bona. Ke, uena, oa tseba, empa motho e mong mono ha a sa tseba. Mohlomong o tla ithuta, kapa mohlomong che, empa o hloka ho sebetsa hona joale - hona o ne a tla fumana phihlelo ee hokae?

Pontšo ea moralo

Ka hona, re ile ra hlokomela hore e le hore re sebetsane le mathata ana, rea hloka pono e ntle ya moralo. [sengoloa]

Ntlafatso e ngata ea lipotso tsa PostgreSQL. Kirill Borovikov (Tensor)

Re ile ra qala "ho pholletsa le 'maraka" - ha re shebeng Marang-rang ho bona hore na se teng.

Empa ho ile ha fumaneha hore ho na le litharollo tse fokolang haholo tse "phelang" tse ntseng li tsoela pele kapa tse fokolang - ha e le hantle, e le 'ngoe feela: explain.depesz.com ka Hubert Lubaczewski. Ha u kenya sebaka sa "feed" setšoantšo sa mongolo oa moralo, se u bontša tafole e nang le data e arotsoeng:

  • nako ea ho sebetsa ea node
  • nako eohle bakeng sa subtree eohle
  • palo ea lirekoto tse ileng tsa khutlisoa tse neng li lebelletsoe ho latela lipalo
  • mmele wa nodi ka bowona

Ts'ebeletso ena e boetse e na le bokhoni ba ho arolelana polokelo ea lihokelo. U ile ua lahlela leano la hao moo ’me ua re: “Lumela, Vasya, sehokelo ke sena, ho na le ho hong ho phoso moo.”

Ntlafatso e ngata ea lipotso tsa PostgreSQL. Kirill Borovikov (Tensor)

Empa ho boetse ho na le mathata a manyane.

Taba ea pele, palo e kholo ea "copy-paste". U nka sekotoana sa kota, u se khomaretse moo, hape, hape, hape.

Ea bobeli, ha ho tlhahlobo ea palo ea data e baloang - li-buffer tse tšoanang tse hlahisoang EXPLAIN (ANALYZE, BUFFERS), ha re e bone mona. Ha a tsebe ho li qhaqholla, ho li utloisisa le ho sebetsa le tsona. Ha u ntse u bala lintlha tse ngata 'me u hlokomela hore u ka' na ua sebelisa hampe disk le cache ea memori, tlhahisoleseding ena ke ea bohlokoa haholo.

Ntlha ea boraro e mpe ke nts'etsopele e fokolang haholo ea morero ona. Lits'ebetso li nyane haholo, ho molemo haeba hang ka mor'a likhoeli tse ling le tse ling tse tšeletseng, 'me khoutu e le Perl.

Ntlafatso e ngata ea lipotso tsa PostgreSQL. Kirill Borovikov (Tensor)

Empa sena ke "lipina" tsohle, re ka phela le sena ka tsela e itseng, empa ho na le ntho e le 'ngoe e ileng ea re khelosa haholo tšebeletsong ena. Tsena ke liphoso tlhahlobong ea Common Table Expression (CTE) le li-node tse fapaneng tse matla joalo ka InitPlan/SubPlan.

Haeba u lumela setšoantšo sena, ebe nako eohle ea polao ea node e 'ngoe le e' ngoe e kholo ho feta nako ea ho bolaea kopo kaofela. Ho bonolo - nako ea moloko oa CTE ena ha ea ka ea tlosoa ho node ea CTE Scan. Ka hona, ha re sa tseba karabo e nepahetseng ea hore na tlhahlobo ea CTE ka boeona e nkile nako e kae.

Ntlafatso e ngata ea lipotso tsa PostgreSQL. Kirill Borovikov (Tensor)

Eaba re elelloa hore e ne e le nako ea ho ngola ea rona - hurray! Moetsi e mong le e mong o re: "Joale re tla ngola ea rona, ho tla ba bonolo haholo!"

Re nkile stack e tloaelehileng bakeng sa lits'ebeletso tsa marang-rang: motheo o thehiloeng ho Node.js + Express, o sebelisitse Bootstrap le D3.js bakeng sa litšoantšo tse ntle. Mme litebello tsa rona li ne li nepahetse ka botlalo - re amohetse mohlala oa pele ka libeke tse 2:

  • tloaelo moralo parser
    Ke hore, joale re ka hlalosa moralo ofe kapa ofe ho tsoa ho o hlahisitsoeng ke PostgreSQL.
  • tlhahlobo e nepahetseng ea li-node tse matla - CTE Scan, InitPlan, SubPlan
  • tlhahlobo ea kabo ea li-buffers - moo maqephe a data a baloang ho tsoa mohopolong, ho tsoa ho cache ea lehae, moo ho tsoang ho disk
  • fumana ho hlaka
    E le hore u se ke ua "cheka" tsena tsohle ka har'a log, empa ho bona "sehokelo se fokolang" hang-hang setšoantšong.

Ntlafatso e ngata ea lipotso tsa PostgreSQL. Kirill Borovikov (Tensor)

Re na le ntho e kang ena, e kenyellelitsoeng ho totobatsa li-syntax. Empa hangata bahlahisi ba rona ha ba sa sebetsa ka kemelo e felletseng ea moralo, empa ka e khuts'oane. Ha e le hantle, re se re arolelitse linomoro tsohle ebe re li lahlela ka ho le letšehali le ka ho le letona, 'me bohareng re siile mola oa pele feela, ke mofuta ofe oa node: CTE Scan, moloko oa CTE kapa Seq Scan ho ea ka pontšo e itseng.

Ena ke boemeli bo khutsufalitsoeng boo re bo bitsang moralo template.

Ntlafatso e ngata ea lipotso tsa PostgreSQL. Kirill Borovikov (Tensor)

Ke eng hape e ka bang bonolo? Ho ka ba bonolo ho bona hore na ke karolo efe ea nako eohle ea rona e abetsoeng node - 'me u e "khomarele" ka thoko. chate ea pie.

Re supa node mme re bona - hoa etsahala hore Seq Scan e nkile nako e ka tlase ho kotara ea nako eohle, mme 3/4 e setseng e nkiloe ke CTE Scan. Tšabo! Ena ke molaetsa o monyane mabapi le "sekhahla sa mollo" sa CTE Scan haeba u e sebelisa ka mafolofolo lipotsong tsa hau. Ha li potlake haholo - li tlase le ho feta ho sekena tafoleng kamehla. [sengoloa] [sengoloa]

Empa hangata litšoantšo tse joalo li thahasellisa haholoanyane, li rarahane haholo, ha hang-hang re supa karolo 'me re bona, ka mohlala, hore nako e fetang halofo ea nako Seq Scan e "ja". Ho feta moo, ho ne ho e-na le mofuta o mong oa Filter ka hare, litlaleho tse ngata li ne li lahliloe ho ea ka eona ... U ka lahlela setšoantšo sena ka ho toba ho moqapi 'me u re: "Vasya, ntho e' ngoe le e 'ngoe e mpe mona bakeng sa hau! Nahana, bona - ho na le phoso!

Ntlafatso e ngata ea lipotso tsa PostgreSQL. Kirill Borovikov (Tensor)

Ka tlhaho, ho ne ho e-na le "li-rakes" tse amehang.

Ntho ea pele eo re e fumaneng ke bothata ba ho potoloha. Nako ea node ka 'ngoe ka morero e bontšoa ka ho nepahala ha 1 μs. 'Me ha palo ea li-node cycles e feta, mohlala, 1000 - ka mor'a ho bolaoa PostgreSQL e arotsoe "ka har'a ho nepahala", joale ha re bala ka morao re fumana nako eohle " kae-kae pakeng tsa 0.95ms le 1.05ms". Ha palo e ea ho li-microseconds, ho lokile, empa ha e se e le [milli] metsotsoana, u tlameha ho ela hloko boitsebiso bona ha u "tlolla" lisebelisoa ho li-node tsa "ke mang ea jang bokae".

Ntlafatso e ngata ea lipotso tsa PostgreSQL. Kirill Borovikov (Tensor)

Ntlha ea bobeli, e rarahaneng haholoanyane, ke kabo ea lisebelisoa (li-buffers) har'a li-node tse matla. Sena se re jelletse libeke tse 2 tsa pele tsa mohlala le libeke tse ling tse 4.

Ho bonolo haholo ho fumana bothata ba mofuta ona - re etsa CTE mme ho thoe re bala ho hong ho eona. Ebile, PostgreSQL e "bohlale" 'me e ke ke ea bala letho ka kotloloho moo. Ebe re nka tlaleho ea pele ho eona, 'me ho eona ea lekholo le la pele ho tloha ho CTE e tšoanang.

Ntlafatso e ngata ea lipotso tsa PostgreSQL. Kirill Borovikov (Tensor)

Re sheba moralo mme re utloisisa - hoa makatsa, re na le li-buffers tse 3 (maqephe a data) "tse jetsoeng" ho Seq Scan, 1 ho feta ho CTE Scan, le tse ling tse 2 ho CTE Scan ea bobeli. Ke hore, haeba re akaretsa ntho e 'ngoe le e' ngoe feela, re tla fumana 6, empa ho tloha letlapeng re bala 3 feela! CTE Scan ha e bale letho ho tsoa kae kapa kae, empa e sebetsa ka kotloloho le mohopolo oa ts'ebetso. Ke hore, ho hlakile hore ho na le ho hong ho phoso mona!

Ha e le hantle, hoa bonahala hore mona ke maqephe a 3 a data a neng a kōpiloe ho Seq Scan, pele 1 e ile ea kōpa 1st CTE Scan, eaba ea 2, le tse ling tse 2. Ke hore, kakaretso ea Maqephe a 3 a ne a baloa data, eseng 6.

Ntlafatso e ngata ea lipotso tsa PostgreSQL. Kirill Borovikov (Tensor)

'Me setšoantšo sena se ile sa re lebisa kutloisisong ea hore ts'ebetsong ea moralo ha e sa le sefate, empa e le mofuta o mong oa graph ea acyclic. 'Me re na le setšoantšo se kang sena, e le hore re utloisise "seo se hlahileng pele." Ke hore, mona re thehile CTE ho tloha pg_class, 'me ra e kopa habeli,' me hoo e ka bang nako eohle ea rona e ile ea qeta lekaleng ha re e kopa lekhetlo la bobeli. Ho hlakile hore ho bala ho kena ha 2 ho theko e boima haholo ho feta feela ho bala ho kena ha 101 ho tloha letlapeng.

Ntlafatso e ngata ea lipotso tsa PostgreSQL. Kirill Borovikov (Tensor)

Re ile ra hema ka nakoana. Ba ile ba re: “Joale, Neo, ua tseba kung fu! Hona joale boiphihlelo ba rona bo teng skrineng sa hau. Joale u ka e sebelisa. " [sengoloa]

Ho kopanya logong

Bahlahisi ba rona ba 1000 ba ile ba phefumoloha. Empa re ne re utloisisa hore re na le li-server tse makholo feela tsa "combat", 'me sena sohle sa "copy-paste" ho bahlahisi ha se bonolo ho hang. Re ile ra hlokomela hore re lokela ho e bokella ka borōna.

Ntlafatso e ngata ea lipotso tsa PostgreSQL. Kirill Borovikov (Tensor)

Ka kakaretso, ho na le module e tloaelehileng e ka bokellang lipalo-palo, leha ho le joalo, e boetse e hloka ho kenngoa ho config - sena. module pg_stat_statements. Empa o ne a sa re tšoanele.

Taba ea pele, e fana ka lipotso tse tšoanang ho sebelisa merero e fapaneng ka har'a database e le 'ngoe Li-QueryIds tse fapaneng. Ke hore, haeba u qala ho etsa joalo SET search_path = '01'; SELECT * FROM user LIMIT 1;'me joale SET search_path = '02'; le kopo e tšoanang, joale lipalo-palo tsa mojule ona li tla ba le lirekoto tse fapaneng, 'me nke ke ka khona ho bokella lipalo-palo tse akaretsang ka ho khetheha moelelong oa profil ena ea kopo, ntle le ho ela hloko merero.

Ntlha ea bobeli e ileng ea re sitisa ho e sebelisa ke tlhokeho ya merero. Ke hore, ha ho na moralo, ho na le kopo feela ka boeona. Re bona se neng se fokotseha, empa ha re utloisise hore na ke hobane'ng. 'Me mona re khutlela bothateng ba dataset e fetohang ka potlako.

'Me motsotso oa ho qetela - ho hloka "linnete". Ke hore, u ke ke ua sebetsana le mohlala o itseng oa ho botsa lipotso - ha ho na, ho na le lipalo-palo tse kopantsoeng feela. Le hoja ho ka khoneha ho sebetsana le sena, ho thata haholo.

Ntlafatso e ngata ea lipotso tsa PostgreSQL. Kirill Borovikov (Tensor)

Ka lebaka leo, re ile ra etsa qeto ea ho loantša copy-paste 'me ra qala ho ngola mokelli.

Moqokeleli o hokahanya ka SSH, o theha khokahanyo e sireletsehileng ho seva ka database e sebelisang setifikeiti, le tail -F "e khomarela" ho eona faeleng ea log. Kahoo sebokeng sena re fumana "seipone" se feletseng sa faele eohle ea log, eo seva e e hlahisang. Mojaro o ho seva ka boeona o fokola, hobane ha re arole letho moo, re mpa re bona sephethephethe.

Kaha re ne re se re qalile ho ngola sebopeho ho Node.js, re ile ra tsoela pele ho ngola mokelli ho eona. 'Me theknoloji ena e ikemetse, hobane ho bonolo haholo ho sebelisa JavaScript ho sebetsa le data e hlophisitsoeng e fokolang, e leng log. 'Me lisebelisoa tsa motheo tsa Node.js ka boeona e le sethala sa backend se u lumella ho sebetsa habonolo le ka mokhoa o bonolo le likhokahano tsa marang-rang,' me ka sebele ka melaetsa leha e le efe ea data.

Ka hona, re "otlolla" likhokahano tse peli: ea pele ho "mamela" logi ka boeona ebe re inkela eona, 'me ea bobeli ke ho botsa motheo nako le nako. "Empa log e bontša hore letšoao le nang le oid 123 le koetsoe," empa sena ha se bolele letho ho moqapi, 'me ho ka ba monate ho botsa database, "OID = 123 ke eng?" Ka hona, nako le nako re botsa motheo seo re sa se tsebeng ka rona.

Ntlafatso e ngata ea lipotso tsa PostgreSQL. Kirill Borovikov (Tensor)

"Ho na le ntho e le 'ngoe feela eo u sa kang ua e ela hloko, ho na le mofuta oa linotsi tse kang litlou! .." Re ile ra qala ho ntlafatsa tsamaiso ena ha re batla ho beha leihlo li-server tsa 10. Ea bohlokoa ka ho fetisisa kutloisisong ea rōna, moo mathata a mang a ileng a hlaha ao ho neng ho le thata ho sebetsana le ’ona. Empa nakong ea kotara ea pele, re ile ra fumana tse lekholo bakeng sa ho beha leihlo - hobane tsamaiso e ne e sebetsa, bohle ba e batla, bohle ba phutholohile.

Sena sohle se hloka ho kenyelletsoa, ​​​​phallo ea data e kholo ebile e sebetsa. Ha e le hantle, seo re se shebellang, seo re ka sebetsanang le sona, ke seo re se sebelisang. Re boetse re sebelisa PostgreSQL joalo ka polokelo ea data. 'Me ha ho letho le potlakileng ho "tšollela" data ho eona ho feta opareitara COPY Ha e so etsahale.

Empa ho "tšolla" data feela ha se theknoloji ea rona. Hobane haeba u na le likopo tse ka bang 50k motsotsoana ho li-server tse lekholo, joale sena se tla hlahisa 100-150GB ea likutu ka letsatsi. Ka hona, re ile ra tlameha ho "khaola" motheo ka hloko.

Taba ea pele, re ile ra etsa joalo ho arola ka letsatsi, hobane, ka kakaretso, ha ho motho ea thahasellang kamano pakeng tsa matsatsi. Ho na le phapang efe ho seo u neng u e-na le sona maobane, haeba bosiung bona u hlahisitse mofuta o mocha oa ts'ebeliso - le lipalo-palo tse ncha.

Taba ea bobeli, re ithutile (ba qobelletsoe) haholo, ka potlako haholo ho ngola ka ho sebelisa COPY. Ke hore, eseng feela COPYhobane o lebelo ho feta INSERT, esita le kapele.

Ntlafatso e ngata ea lipotso tsa PostgreSQL. Kirill Borovikov (Tensor)

Ntlha ea boraro - ke ile ka tlameha ho lahla li-triggers, ka ho latellana, le linotlolo tsa kantle ho naha. Ke hore, ha re na referential integrity ho hang. Hobane haeba u na le tafole e nang le li-FK tse peli, 'me u re ka har'a sebopeho sa database "mona ke rekoto ea log e boletsoeng ke FK, mohlala, ho sehlopha sa lirekoto," joale ha u e kenya, PostgreSQL. ha e na letho le setseng haese mokhoa oa ho e nka le ho e etsa ka botšepehi SELECT 1 FROM master_fk1_table WHERE ... ka sekhetho seo u lekang ho se kenya - ho netefatsa hore rekoto ena e teng moo, hore u se ke ua "roala" Senotlolo sena sa Kantle ho Naha ka ho kenya ha hao.

Ho e-na le rekoto e le 'ngoe e eang lethathamong leo re lebelletseng ho lona le li-index tsa lona, ​​re fumana molemo o eketsehileng oa ho bala litafole tsohle tseo e buang ka tsona. Empa ha re hloke sena ho hang - mosebetsi oa rona ke ho hatisa ka hohle kamoo ho ka khonehang le kapele kamoo ho ka khonehang ka mojaro o fokolang. Kahoo FK - tlase!

Ntlha e latelang ke aggregation le hashing. Qalong, re ile ra li kenya ts'ebetsong ka har'a database - ka mor'a tsohle, ho bonolo hore hang-hang, ha tlaleho e fihla, e e etse ka mofuta o itseng oa letlapa. "plus one" hantle feela ka har'a leqhubu. Ho joalo, ho bonolo, empa ntho e tšoanang e mpe - o kenya rekoto e le 'ngoe, empa o tlameha ho bala le ho ngola ntho e' ngoe ho tsoa tafoleng e 'ngoe. Ho feta moo, ha u bale le ho ngola feela, empa hape u etsa joalo ka linako tsohle.

Joale nahana hore u na le tafole eo ho eona u ka balang feela palo ea likopo tse fetileng ho moamoheli ea itseng: +1, +1, +1, ..., +1. 'Me uena, ha e le hantle, ha u hloke sena - tsohle lia khoneha kakaretso mohopolong ka 'mokelli ebe o romela ho database hang feela +10.

E, haeba ho ka ba le mathata a mang, botšepehi ba hau bo ka "senyeha", empa ena ke taba e batlang e sa utloahale - hobane u na le seva se tloaelehileng, se na le betri ho molaoli, u na le log ea transaction, log ho tsamaiso ea faele ... Ka kakaretso, ha se ea bohlokoa. Tahlehelo ea tlhahiso eo u e fumanang ho tsoa ho li-triggers/FK ha e tšoanele litšenyehelo tseo u li kenyang.

Hoa tšoana le ka hashing. Kopo e itseng e fofela ho uena, u bala sekhetho se itseng ho sona ka har'a database, u se ngolle database ebe u se bolella motho e mong le e mong. Ntho e 'ngoe le e' ngoe e ntle ho fihlela, ka nako ea ho rekota, motho oa bobeli a tla ho uena ea batlang ho rekota ntho e le 'ngoe -' me u thibeloa, 'me sena se se se ntse se le mpe. Ka hona, haeba u ka fetisetsa moloko oa li-ID tse ling ho mofani (e amanang le database), ho molemo ho etsa sena.

E ne e le hantle feela hore re sebelise MD5 ho tloha mongolong - kopo, moralo, template, ... Re e bala ka lehlakoreng la mokelli, 'me re "tšolle" ID e entsoeng ka ho itokiselitse ho database. Bolelele ba MD5 le karohano ea letsatsi le letsatsi e re lumella hore re se ke ra tšoenyeha ka likhohlano tse ka bang teng.

Ntlafatso e ngata ea lipotso tsa PostgreSQL. Kirill Borovikov (Tensor)

Empa e le hore re tlalehe tsena tsohle kapele, ho ne ho hlokahala hore re fetole mokhoa oa ho rekota ka bo oona.

Hangata u ngola lintlha joang? Re na le mofuta o mong oa dataset, re e arola ka litafole tse 'maloa, ebe re e QOSA - pele ho ea pele, ebe ho ea ho ea bobeli, ho ea ho ea boraro ... Ha ho bonolo, hobane ho bonahala eka re ngola molaetsa o le mong oa data ka mehato e meraro. ka tatellano. E sa kgahliseng. Na e ka etsoa kapele? E ka khona!

Ho etsa sena, ho lekane feela ho senya phallo tsena ka tsela e tšoanang. Hoa etsahala hore re na le liphoso, likopo, litempele, li-block, ... ho fofa ka likhoele tse arohaneng - 'me re li ngola kaofela ka tsela e tšoanang. Ho lekane bakeng sa sena boloka mocha oa COPY o lula o bulehile bakeng sa tafole e 'ngoe le e 'ngoe eo u e batlang.

Ntlafatso e ngata ea lipotso tsa PostgreSQL. Kirill Borovikov (Tensor)

Ke hore, ho 'mokelli ho na le molapo kamehla, moo nka ngolang data eo ke e hlokang. Empa e le hore database e bone data ena, 'me motho e mong a se ke a ema a emetse hore data ena e ngoloe, KOPI e tlameha ho sitisoa ka linako tse itseng. Ho rona, nako e sebetsang ka ho fetisisa e ne e ka ba 100ms - rea e koala 'me hang-hang re e bula hape tafoleng e tšoanang. 'Me haeba re se na phallo e lekaneng nakong ea litlhōrō tse ling, joale re kopanya ho fihlela moeli o itseng.

Ho feta moo, re fumane hore bakeng sa profil ea mojaro o joalo, pokello efe kapa efe, ha lirekoto li bokelloa ka lihlopha, li mpe. Classic bobe ke INSERT ... VALUES le lirekoto tse ling tse 1000. Hobane ka nako eo u na le tlhōrō ea ho ngola mecheng ea litaba, 'me bohle ba lekang ho ngola ntho e itseng ho disk ba tla be ba emetse.

Ho tlosa li-anomalies tse joalo, feela u se ke ua kopanya letho, o seke oa thiba ho hang. 'Me haeba buffering to disk e etsahala (ka lehlohonolo, Stream API ho Node.js e u lumella ho tseba) - chechisa khokahanyo ena. Ha u fumana ketsahalo ea hore e lokolohile hape, e ngolle u le moleng o bokelletsoeng. 'Me ha e ntse e phathahane, nka e latelang mahala ho tloha letamong' me u e ngolle.

Pele re kenyelletsa mokhoa ona oa ho rekota data, re ne re e-na le hoo e ka bang 4K ho ngola li-ops, 'me ka tsela ena re fokotsa mojaro ka makhetlo a 4. Joale ba se ba holile makhetlo a mang a 6 ka lebaka la lits'oants'o tse ncha tse shebiloeng - ho fihla ho 100MB/s. 'Me hona joale re boloka likutu bakeng sa likhoeli tse 3 tse fetileng ka palo e ka bang 10-15TB, ka tšepo ea hore ka likhoeli tse tharo feela moqapi ofe kapa ofe o tla khona ho rarolla bothata leha e le bofe.

Re utloisisa mathata

Empa ho bokella data ena kaofela ho molemo, ho molemo, ho bohlokoa, empa ha hoa lekana - e hloka ho utloisisoa. Hobane tsena ke limilione tsa merero e fapaneng ka letsatsi.

Ntlafatso e ngata ea lipotso tsa PostgreSQL. Kirill Borovikov (Tensor)

Empa limilione ha li laolehe, re tlameha ho qala ka ho etsa "tse nyane". 'Me, pele ho tsohle, u lokela ho etsa qeto ea hore na u tla hlophisa ntho ena "e nyenyane" joang.

Re khethile lintlha tse tharo tsa bohlokoa:

  • eo o rometse kopo ena
    Ke hore, ho tsoa ho ts'ebeliso efe e "fihlileng": sebopeho sa marang-rang, backend, tsamaiso ea ho lefa kapa ntho e 'ngoe.
  • moo ho etsahetse
    Ho seva sefe se ikhethileng? Hobane haeba u na le li-server tse 'maloa tlas'a kopo e le' ngoe, 'me ka tšohanyetso e' ngoe e "ea bothoto" (hobane "disk e bolile", "memori e lutla", bothata bo bong), joale o hloka ho sebetsana le seva ka ho khetheha.
  • kamoo bothata bo iponahatsa ka tsela enngwe kapa enngwe

Ho utloisisa hore na "ke mang" a re rometseng kopo, re sebelisa sesebelisoa se tloaelehileng - ho beha phapang ea nako: SET application_name = '{bl-host}:{bl-method}'; - re romella lebitso la moamoheli oa logic ea khoebo eo kopo e tsoang ho eona, le lebitso la mokhoa kapa ts'ebeliso e e qalileng.

Kamora hore re fetise "mong'a" oa kopo, e tlameha ho hlahisoa ho log - bakeng sa sena re hlophisa phetoho. log_line_prefix = ' %m [%p:%v] [%d] %r %a'. Bakeng sa ba thahasellang, mohlomong sheba bukeng ea litaelotsohle di bolela eng. Hoa etsahala hore re bona ho log:

  • время
  • lintlha tsa tšebetso le li-transaction
  • lebitso la database
  • IP ea motho ea rometseng kopo ena
  • le lebitso la mokhoa

Ntlafatso e ngata ea lipotso tsa PostgreSQL. Kirill Borovikov (Tensor)

Joale re ile ra hlokomela hore ha ho thahasellise haholo ho sheba kamano ea kopo e le 'ngoe pakeng tsa li-server tse fapaneng. Ha se hangata moo o nang le boemo boo sesebelisoa se le seng se hohelang ka ho lekana mona le mane. Empa le haeba e tšoana, sheba leha e le efe ea li-server tsena.

Kahoo sehiloeng ke sena "server e le 'ngoe - letsatsi le le leng" e ile ea re lekane bakeng sa tlhahlobo leha e le efe.

Karolo ea pele ea tlhahlobo e tšoana "mohlala" - mokhoa o khutsufalitsoeng oa tlhahiso ea moralo, o hlakotsoe ho matšoao ohle a linomoro. Sekhao sa bobeli ke ts'ebeliso kapa mokhoa, 'me sehiloeng sa boraro ke node e khethehileng ea moralo e re baketseng mathata.

Ha re tloha maemong a ikhethileng ho ea ho litempele, re ile ra fumana melemo e 'meli ka nako e le ngoe:

  • phokotso e ngata ya palo ya dintho bakeng sa tshekatsheko
    Ha rea ​​​​lokela ho sekaseka bothata ka likete tsa lipotso kapa merero, empa ka litempele tse ngata.
  • kemiso ea nako
    Ke hore, ka ho akaretsa "lintlha" ka har'a karolo e itseng, u ka bontša ponahalo ea bona motšehare. 'Me mona u ka utloisisa hore haeba u na le mofuta o itseng oa mohlala o etsahalang, mohlala, hang ka hora, empa e lokela ho etsahala hang ka letsatsi, u lokela ho nahana ka se ileng sa senyeha - ke mang ea se bakileng le hore na ke hobane'ng, mohlomong e lokela ho ba mona. ha ea lokela. Ona ke mokhoa o mong oo e seng oa lipalo, o bonahalang feela, oa ho hlahloba.

Ntlafatso e ngata ea lipotso tsa PostgreSQL. Kirill Borovikov (Tensor)

Mekhoa e setseng e itšetlehile ka matšoao ao re a ntšang morerong: ke makhetlo a makae mokhoa o joalo o etsahetseng, kakaretso le nako e tloaelehileng, hore na ho baloa data e kae ho tswa ho disk, le bokae ho tloha mohopolong ...

Hobane, ka mohlala, u tla leqepheng la analytics bakeng sa moeti, sheba - ho hong ho qala ho bala haholo ho disk. Disk ho seva ha e khone ho e sebetsana - ke mang ea balang ho eona?

'Me u ka hlophisa ka kholomo efe kapa efe' me u nke qeto ea hore na u tla sebetsana le eng hona joale - mojaro o ho processor kapa disk, kapa palo eohle ea likopo ... Re e hlopha, ra sheba tse "holimo", ra e lokisa le e hlahisitse mofuta o mocha oa sesebelisoa.
[puo ea video]

Mme hanghang o ka bona lits'ebetso tse fapaneng tse tlang le template e ts'oanang ho tsoa ho kopo joalo ka SELECT * FROM users WHERE login = 'Vasya'. Frontend, backend, processing... 'Me ua ipotsa hore na ke hobane'ng ha ts'ebetso e ka bala mosebelisi haeba a sa sebelisane le eena.

Tsela e fapaneng ke ho bona hanghang ho tsoa ts'ebelisong seo e se etsang. Mohlala, karolo e ka pele ke ena, sena, sena, 'me sena hang ka hora (lethathamo la nako lea thusa). 'Me potso e hlaha hang-hang: ho bonahala eka ha se mosebetsi oa pele ho etsa ntho hang ka hora ...

Ntlafatso e ngata ea lipotso tsa PostgreSQL. Kirill Borovikov (Tensor)

Ka mor'a nako e itseng, re ile ra hlokomela hore re ne re sa kopane lipalo-palo ka li-node tsa moralo. Re ile ra ikarola ho merero feela li-node tse etsang ho hong ka data ea litafole ka botsona (li bale / li ngole ka index kapa che). Ebile, ho eketsoa karolo e le 'ngoe feela e amanang le setšoantšo se fetileng - node ee e re tliselitse lirekoto tse kae?, le hore na ke tse kae tse ileng tsa lahloa (Mela e Tlositsoe ka Sefe).

Ha u na index e loketseng holim'a poleiti, u etsa kopo ho eona, e fofa ho feta index, e oela Seq Scan ... u hloekisitse litlaleho tsohle ntle le e le 'ngoe. Hobaneng o hloka lirekoto tse tlhotliloeng tsa 100M ka letsatsi? Na ha ho molemo ho phutha index?

Ntlafatso e ngata ea lipotso tsa PostgreSQL. Kirill Borovikov (Tensor)

Ha re se re hlahlobile li-node tsohle tsa meralo ka li-node, re ile ra hlokomela hore ho na le meaho e tloaelehileng meralong e ka 'nang ea bonahala e belaella. 'Me ho ka ba monate ho bolella moqapi: "Motsoalle, mona u qala ho bala ka index, ebe u hlophisa, ebe u khaola" - e le molao, ho na le rekoto e le' ngoe.

E mong le e mong ea ngotseng lipotso mohlomong o kile a kopana le mokhoa ona: "Mphe taelo ea ho qetela ea Vasya, letsatsi la eona." 'Me haeba u sena index ka letsatsi, kapa ha ho na letsatsi lethathamong leo u le sebelisitseng, u tla tla. hata "rake" e ts'oanang hantle.

Empa rea ​​tseba hore ena ke "rake" - ke hobane'ng ha u sa bolelle mohlahisi hang-hang seo a lokelang ho se etsa. Ka hona, ha a bula moralo hona joale, moqapi oa rona o bona hang-hang setšoantšo se setle se nang le malebela, moo hang-hang a reng ho eena: "U na le mathata mona le mane, empa a rarolloa ka tsela ena le eane."

Ka lebaka leo, palo ea phihlelo e neng e hlokahala ho rarolla mathata qalong le hona joale e theohile haholo. Ena ke mofuta oa sesebelisoa seo re nang le sona.

Ntlafatso e ngata ea lipotso tsa PostgreSQL. Kirill Borovikov (Tensor)

Source: www.habr.com

Eketsa ka tlhaloso