Fanatsarana betsaka ny fangatahana PostgreSQL. Kirill Borovikov (Tensor)

Ny tatitra dia manolotra fomba fiasa sasany mamela manara-maso ny fahombiazan'ny fangatahana SQL rehefa misy an-tapitrisany isan'andro, ary misy mpizara PostgreSQL an-jatony arahana maso.

Inona no vahaolana ara-teknika ahafahantsika mikojakoja amin'ny fomba mahomby toy izany ny vaovao, ary ahoana no hanamora ny fiainan'ny mpamorona tsotra?


Iza no liana? famakafakana olana manokana sy teknika fanatsarana isan-karazany Fanontaniana SQL sy famahana olana mahazatra DBA ao amin'ny PostgreSQL - azonao atao koa mamaky lahatsoratra maromaro momba ity lohahevitra ity.

Fanatsarana betsaka ny fangatahana PostgreSQL. Kirill Borovikov (Tensor)
Kirill Borovikov no anarako, misolo tena aho orinasa Tensor. Raha ny tena manokana dia manampahaizana manokana amin'ny fiaraha-miasa amin'ny angon-drakitra ao amin'ny orinasanay aho.

Androany aho dia hilaza aminao ny fomba hanatsarana ny fanontaniana, rehefa tsy mila "manasaraka" ny fahombiazan'ny fangatahana tokana ianao, fa mamaha ny olana amin'ny ankapobeny. Rehefa misy fangatahana an-tapitrisany, ary mila mitady sasany ianao fanatonana vahaolana ity olana lehibe ity.

Amin'ny ankapobeny, ny Tensor ho an'ny mpanjifanay iray tapitrisa dia VLSI no fampiharana anay: tambajotra sosialy ho an'ny orinasa, vahaolana amin'ny fifandraisana amin'ny horonan-tsary, ho an'ny fikorianan'ny antontan-taratasy anatiny sy ivelany, rafitra kaonty ho an'ny kaonty sy trano fanatobiana entana,... Izany hoe, "mega-combine" toy izany ho an'ny fitantanana orinasa mitambatra, izay misy mihoatra ny 100 samihafa. tetikasa anatiny.

Mba hahazoana antoka fa miasa sy mivoatra ara-dalΓ na izy rehetra, dia manana foibe fampandrosoana 10 manerana ny firenena izahay, miaraka amin'izy ireo bebe kokoa Mpamorona 1000.

Niara-niasa tamin'ny PostgreSQL izahay nanomboka tamin'ny taona 2008 ary nanangona be dia be ny zavatra karakarainay - angona mpanjifa, statistika, analytique, angona avy amin'ny rafitra fampahalalana ivelany - mihoatra ny 400TB. Manodidina ny 250 eo ny mpizara ao amin'ny famokarana fotsiny, ary amin'ny fitambarany dia manodidina ny 1000 ny mpizara database izay arahintsika.

Fanatsarana betsaka ny fangatahana PostgreSQL. Kirill Borovikov (Tensor)

SQL dia fiteny manambara. Tsy mamaritra hoe "ahoana" ny zavatra tokony hiasa, fa "inona" tianao hotratrarina. Ny DBMS dia mahafantatra tsara kokoa ny fomba fanaovana JOIN - ny fomba fampifandraisana ny latabatrao, inona ny fepetra apetraka, inona no handeha amin'ny index, inona no tsy ...

Ny DBMS sasany dia manaiky soso-kevitra: "Tsia, ampifandraiso amin'ny filaharana toy izany sy toy izany ireo tabilao roa ireo," saingy tsy afaka manao izany ny PostgreSQL. Ity no toeran'ny sain'ireo mpamorona mpitarika: "Tianay ny mamarana ny fanontana fanontaniana toy izay mamela ny mpamorona hampiasa karazana soso-kevitra."

Saingy, na dia eo aza ny hoe tsy avelan'ny PostgreSQL hifehy ny tenany ny "ivelan'ny" dia mamela tanteraka izany jereo ny ao anatinyrehefa mametraka ny fanontanianao ianao, ary aiza no misy olana.

Fanatsarana betsaka ny fangatahana PostgreSQL. Kirill Borovikov (Tensor)

Amin'ny ankapobeny, inona no olana mahazatra matetika ateraky ny developer [amin'ny DBA]? β€œTao no nahatanteraka ny fangatahana, ary miadana ny zava-drehetra amintsika, mihantona daholo ny zava-drehetra, misy zavatra mitranga... Karazana olana!”

Saika mitovy foana ny antony:

  • algorithm query tsy mahomby
    Mpamorona: "Ankehitriny dia omeko latabatra 10 amin'ny SQL amin'ny alΓ lan'ny JOIN aho..." - ary manantena fa "hamahy" amin'ny fomba mahagaga ny toe-javatra misy azy ary ho azony haingana ny zava-drehetra. Saingy tsy mitranga ny fahagagana, ary izay rafitra misy fiovaovana toy izany (tabilao 10 amin'ny iray FROM) dia manome karazana fahadisoana foana. [lahatsoratra]
  • antontan'isa tsy misy ifandraisany
    Ity teboka ity dia tena manan-danja indrindra amin'ny PostgreSQL, rehefa "nandraraka" daty lehibe teo amin'ny mpizara ianao, dia manao fangatahana ary "sexcanits" ny takelakao. Satria nisy firaketana 10 omaly, ary 10 tapitrisa ankehitriny, saingy tsy mbola fantatry ny PostgreSQL izany, ary mila milaza izany isika. [lahatsoratra]
  • "plug" amin'ny loharano
    Nametraka angon-drakitra lehibe sy feno entana ianao amin'ny lohamilina malemy izay tsy ampy kapila, fitadidiana na processeur. Ary izay ihany... Any amin'ny toerana misy valindrihana fampisehoana ambony izay tsy azonao hitsambikina intsony.
  • fanakanana
    Hevitra sarotra ity, saingy manan-danja indrindra amin'ny fangatahana fanovana isan-karazany (INSERT, UPDATE, DELETE) - lohahevitra lehibe misaraka ity.

Mahazo drafitra

... Ary ho an'ny zavatra hafa rehetra izahay mila drafitra! Mila jerena ny zava-mitranga ao anatin'ny mpizara.

Fanatsarana betsaka ny fangatahana PostgreSQL. Kirill Borovikov (Tensor)

Ny drafitra famonoana fanontaniana ho an'ny PostgreSQL dia hazon'ny algorithm famonoana fanontaniana amin'ny fanehoana lahatsoratra. Izany indrindra no algorithm izay, vokatry ny famakafakana nataon'ny planner, no hita fa mahomby indrindra.

Ny node hazo tsirairay dia asa: maka angon-drakitra avy amin'ny latabatra na index, manangana bitmap, manakambana latabatra roa, manambatra, mifanelanelana, na manilika ireo safidy. Ny fanatanterahana fanontaniana dia ny fandehanana amin'ny vodin'ity hazo ity.

Mba hahazoana ny drafitra fangatahana, ny fomba tsotra indrindra dia ny fanatanterahana ny fanambarana EXPLAIN. Mba hahazoana amin'ny toetra tena izy rehetra, izany hoe, manatanteraka fanontaniana amin'ny fototra - EXPLAIN (ANALYZE, BUFFERS) SELECT ....

Ny lafiny ratsy: rehefa mihazakazaka ianao dia mitranga "eto sy izao", ka mety amin'ny debugging eo an-toerana ihany. Raha maka mpizara be entana ianao izay eo ambanin'ny fiovan'ny angon-drakitra mahery vaika, dia hitanao hoe: β€œOh! Eto isika dia misy famonoana miadanaXia fangatahana." Antsasak'adiny, adiny iray lasa izay - raha nihazakazaka sy naka ity fangatahana ity avy amin'ny diary ianao, namerina azy tany amin'ny lohamilina, dia niova ny angona sy ny antontan'isa manontolo. Ampanaovinao ny debug - ary mandeha haingana! Ary tsy azonao ny antony, nahoana dia miadana.

Fanatsarana betsaka ny fangatahana PostgreSQL. Kirill Borovikov (Tensor)

Mba hahatakarana ny zava-nitranga marina tamin'ny fotoana nanaovana ny fangatahana tao amin'ny server, nanoratra ny olona hendry auto_explain module. Saika hita ao amin'ny fizarana PostgreSQL mahazatra indrindra izy io, ary azo alefa amin'ny rakitra config.

Raha tsapany fa ny fangatahana sasany dia mandeha lavitra noho ny fetra nolazainao azy, dia mandeha izany "snapshot" ny drafitr'ity fangatahana ity ary manoratra azy ireo miaraka amin'ny diary.

Fanatsarana betsaka ny fangatahana PostgreSQL. Kirill Borovikov (Tensor)

Toa milamina ny zava-drehetra ankehitriny, mandeha any amin'ny kitay izahay ary mahita any... [texte footcloth]. Saingy tsy afaka milaza na inona na inona momba izany izahay, ankoatra ny zava-misy fa drafitra tena tsara izy io satria naka 11ms ny fanatanterahana azy.

Toa milamina ny zava-drehetra - saingy tsy misy mazava ny tena zava-nitranga. Ankoatra ny fotoana amin'ny ankapobeny dia tsy mahita na inona na inona isika. Satria tsy hita maso ny fijerena β€œzanak’ondry” toy izany amin’ny soratra tsotra.

Saingy na dia tsy mazava aza izany, na dia tsy mety aza, dia misy olana lehibe kokoa:

  • Ny node dia manondro fitambaran'ny loharanon'ny zana-kazo manontolo eo ambaniny. Izany hoe, tsy azonao fantarina fotsiny hoe ohatrinona ny fotoana laniny tamin'ity Scan Index manokana ity raha toa ka misy toe-javatra misy ao ambaniny. Tsy maintsy mijery amin'ny fomba mavitrika isika mba hahitana raha misy "ankizy" sy ny fari-piadidiana misy fepetra, CTE ao anatiny - ary esory izany rehetra izany "ao an-tsaintsika".
  • Teboka faharoa: ny fotoana voalaza eo amin'ny node dia fotoana famonoana node tokana. Raha toa ka novonoina io node io noho ny, ohatra, mirakitra im-betsaka ny tadivavarana amin'ny tabilao, dia mitombo ny isan'ny tadivavarana β€” tsingerin'ity node ity β€” ao amin'ny drafitra. Saingy ny fotoana famonoana atomika dia mitovy amin'ny drafitra. Izany hoe, mba hahatakarana ny halavan'ny izany node tanteraka, dia mila ampitomboina zavatra iray hafa - indray, "ao amin'ny lohanao."

Amin'ny toe-javatra toy izany dia fantaro ny hoe "Iza no rohy malemy indrindra?" saika tsy azo atao. Noho izany, na ny mpamorona aza dia manoratra ao amin'ny "manual" izay "Ny fahatakarana ny drafitra dia zavakanto tsy maintsy ianarana, traikefa...".

Saingy manana mpamorona 1000 izahay, ary tsy afaka mampita izany traikefa izany amin'ny tsirairay amin'izy ireo ianao. Izaho, ianao, fantany, fa misy olona any tsy mahalala intsony. Angamba hianatra izy, na tsia, fa mila miasa izy izao - ary aiza no hahazoany izany traikefa izany?

Famantarana ny drafitra

Noho izany, nahatsapa izahay fa mba hiatrehana ireo olana ireo dia mila sary tsara ny drafitra. [lahatsoratra]

Fanatsarana betsaka ny fangatahana PostgreSQL. Kirill Borovikov (Tensor)

Nandeha "namakivaky ny tsena" aloha izahay - andao hijery amin'ny Internet mba hahitana izay misy.

Saingy hita fa vitsy dia vitsy ny vahaolana "miaina" izay mivoatra na latsaka - ara-bakiteny, iray ihany: explain.depesz.com nataon'i Hubert Lubaczewski. Rehefa miditra ao amin'ny saha "feed" sarin'ny lahatsoratra momba ny drafitra ianao, dia mampiseho latabatra misy ny angon-drakitra voavaha:

  • ny fotoana fanodinana ny node
  • fotoana manontolo ho an'ny zana-kazo manontolo
  • isan'ny firaketana nalaina izay nampoizina ara-statistika
  • ny vatana node mihitsy

Ity serivisy ity koa dia manana fahafahana mizara arisivan'ny rohy. Natsipiny tao ny drafitrao ary hoy ianao: "Hey, Vasya, ity misy rohy, misy zavatra tsy mety ao."

Fanatsarana betsaka ny fangatahana PostgreSQL. Kirill Borovikov (Tensor)

Misy olana kely koa anefa.

Voalohany, be dia be ny "copy-paste". Maka tapa-kazo iray ianao, apetaho eo, ary avereno indray.

Faharoa, tsy misy famakafakana ny habetsaky ny angona novakiana - ireo buffers izay mivoaka EXPLAIN (ANALYZE, BUFFERS), tsy hitantsika eto. Tsy hainy tsotra izao ny manala azy ireo, mahatakatra azy ireo ary miara-miasa aminy. Rehefa mamaky angon-drakitra be dia be ianao ary mahatsapa fa mety diso toerana ny kapila sy ny cache fitadidiana, dia tena zava-dehibe io fampahalalana io.

Ny teboka ratsy fahatelo dia ny fampandrosoana tena malemy amin'ity tetikasa ity. Kely dia kely ny commits, tsara raha indray mandeha isaky ny enim-bolana, ary ao Perl ny code.

Fanatsarana betsaka ny fangatahana PostgreSQL. Kirill Borovikov (Tensor)

Saingy "tononkira" daholo izany, azontsika atao ny miaina miaraka amin'izany, saingy misy zavatra iray tena nampiala antsika tamin'ity serivisy ity. Ireo dia lesoka amin'ny famakafakana ny Common Table Expression (CTE) sy ireo nodes mavitrika isan-karazany toa ny InitPlan/SubPlan.

Raha mino an'io sary io ianao, dia ny totalin'ny fotoana famonoana ny node tsirairay dia lehibe noho ny totalin'ny fotoana fanatanterahana ny fangatahana manontolo. Tsotra izany- ny fotoana famokarana an'ity CTE ity dia tsy nesorina tamin'ny CTE Scan node. Noho izany, tsy fantatsika intsony ny valiny marina momba ny faharetan'ny scan CTE.

Fanatsarana betsaka ny fangatahana PostgreSQL. Kirill Borovikov (Tensor)

Dia tsikaritray fa tonga ny fotoana hanoratana ny anay - hurray! Hoy ny mpamorona tsirairay: "Hanoratra ny anay izahay izao, ho mora be izany!"

Naka stack mahazatra ho an'ny serivisy tranonkala izahay: fototra mifototra amin'ny Node.js + Express, nampiasa Bootstrap sy D3.js ho an'ny kisary tsara tarehy. Ary nohamarinina tanteraka ny fanantenanay - nahazo ny prototype voalohany izahay tao anatin'ny 2 herinandro:

  • parser drafitra manokana
    Izany hoe, afaka mamakafaka ny drafitra rehetra avy amin'ireo novokarin'ny PostgreSQL isika.
  • famakafakana marina momba ny nodes dynamique - CTE Scan, InitPlan, SubPlan
  • famakafakana ny fizarana buffers - aiza no vakiana avy amin'ny fitadidiana ny pejy data, avy amin'ny cache eo an-toerana, avy amin'ny kapila
  • nahazo mazava
    Mba tsy "hady" izany rehetra izany ao amin'ny log, fa hahita ny "rohy malemy" avy hatrany eo amin'ny sary.

Fanatsarana betsaka ny fangatahana PostgreSQL. Kirill Borovikov (Tensor)

Nahazo zavatra toy izao izahay, miaraka amin'ny fanasongadinana syntax. Saingy matetika ny mpamorona anay dia tsy miasa amin'ny fanehoana feno ny drafitra intsony, fa miaraka amin'ny drafitra fohy kokoa. Rehefa dinihina tokoa, dia efa namakivaky ny isa rehetra ary natsipy azy ireo havia sy havanana, ary eo afovoany navela ihany ny tsipika voalohany, inona no node: CTE Scan, CTE taranaka na Seq Scan araka ny famantarana sasany.

Izany no fanafohezana fanehoana antsointsika mΓ΄dely drafitra.

Fanatsarana betsaka ny fangatahana PostgreSQL. Kirill Borovikov (Tensor)

Inona koa no mety? Mety tsara ny mahita hoe inona ny ampahany amin'ny fotoanantsika rehetra atokana amin'ny node - ary "apetaho" eo amin'ny sisiny fotsiny. tabilao pie.

Manondro ny node izahay ary mahita - hita fa ny Seq Scan dia naka latsaky ny ampahefatry ny fotoana manontolo, ary ny 3/4 sisa dia nalain'ny CTE Scan. Horror! Ity dia fanamarihana kely momba ny "tahan'ny afo" amin'ny CTE Scan raha mampiasa azy ireo amin'ny fanontanianao ianao. Tsy dia haingana loatra izy ireo - ambany izy ireo na dia amin'ny fijerena latabatra mahazatra aza. [lahatsoratra] [lahatsoratra]

Saingy matetika ny kisary toy izany dia mahaliana kokoa, sarotra kokoa, rehefa manondro ampahany iray avy hatrany isika ary mahita, ohatra, fa mihoatra ny antsasaky ny fotoana ny Seq Scan sasany "nihinana". Ambonin'izany, nisy karazana Sivana tao anatiny, maro ny rakitsoratra nariana araka izany... Azonao atao ny manipy mivantana an'io sary io amin'ny mpamorona ary miteny hoe: "Vasya, ratsy ny zava-drehetra eto aminao! Fantaro izany, jereo fa misy tsy mety!”

Fanatsarana betsaka ny fangatahana PostgreSQL. Kirill Borovikov (Tensor)

Mazava ho azy fa nisy "rake" sasany tafiditra.

Ny zavatra voalohany hitanay dia ny olana amin'ny fihodinana. Ny fotoanan'ny node tsirairay ao amin'ny drafitra dia aseho amin'ny fahamarinan'ny 1 ΞΌs. Ary rehefa mihoatra ny isan'ny tsingerin'ny node, ohatra, 1000 - aorian'ny famonoana PostgreSQL mizara "ao anatin'ny marina", dia rehefa manao kajy miverina dia mahazo ny fotoana manontolo "eo anelanelan'ny 0.95ms sy 1.05ms". Rehefa mandeha amin'ny microseconds ny fanisana dia tsy maninona izany, fa rehefa efa [milli] segondra izany, dia tsy maintsy raisinao an-tsaina izany fampahalalana izany rehefa "manala" loharanon-karena amin'ny node amin'ny drafitra "izay nandany ohatrinona".

Fanatsarana betsaka ny fangatahana PostgreSQL. Kirill Borovikov (Tensor)

Ny teboka faharoa, sarotra kokoa, dia ny fizarana loharanon-karena (ireo buffers) eo amin'ireo nodes mavitrika. Nandany anay ny herinandro 2 voalohany tamin'ny prototype miampy herinandro 4 hafa.

Mora ny mahazo ity karazana olana ity - manao CTE izahay ary heverina fa mamaky zavatra ao anatiny. Raha ny marina, PostgreSQL dia "smart" ary tsy hamaky na inona na inona mivantana any. Avy eo dia maka ny rakitsoratra voalohany avy amin'io isika, ary amin'izany ny voalohany zato avy amin'ny CTE iray ihany.

Fanatsarana betsaka ny fangatahana PostgreSQL. Kirill Borovikov (Tensor)

Mijery ny drafitra izahay ary mahazo - hafahafa izany, manana buffer 3 izahay (pejy data) "nihinana" ao amin'ny Seq Scan, 1 fanampiny amin'ny CTE Scan, ary 2 hafa amin'ny CTE Scan faharoa. Izany hoe, raha fintinina tsotra izao ny zava-drehetra dia hahazo 6 isika, fa avy amin'ny tablette dia 3 ihany no mamaky! CTE Scan dia tsy mamaky na inona na inona na aiza na aiza, fa miasa mivantana amin'ny fitadidiana ny fizotrany. Izany hoe misy zavatra tsy mety mazava eto!

Raha ny marina dia hita fa ireto daholo ny pejy 3 nangatahana tamin'ny Seq Scan, ny 1 voalohany nangataka ny 1er CTE Scan, ary avy eo ny 2, ary ny 2 hafa novakiana taminy. Izany hoe, total 3 pejy no novakiana, fa tsy 6.

Fanatsarana betsaka ny fangatahana PostgreSQL. Kirill Borovikov (Tensor)

Ary io sary io dia nitarika antsika ho amin'ny fahatakarana fa ny fanatanterahana drafitra dia tsy hazo intsony, fa karazana grafika acyclic fotsiny. Ary nahazo kisary toy izao izahay, mba hahatakaranay ny β€œizay nipoitra avy tany am-boalohany.” Izany hoe, eto izahay dia namorona CTE avy amin'ny pg_class, ary nangataka azy indroa, ary saika ny fotoananay rehetra dia lany tamin'ny sampana rehefa nangataka izany izahay fanindroany. Mazava ho azy fa ny famakiana ny laharana faha-2 dia lafo kokoa noho ny famakiana ny fidirana voalohany amin'ny takelaka.

Fanatsarana betsaka ny fangatahana PostgreSQL. Kirill Borovikov (Tensor)

Nisempotra kely izahay. Hoy izy ireo: β€œAnkehitriny ry Neo, hainao ny kung fu! Efa eo amin'ny efijery anao izao ny traikefanay. Afaka mampiasa izany ianao izao. " [lahatsoratra]

Fanamafisana ny log

Nisento maivamaivana ireo mpamorona anay 1000. Saingy azonay fa tsy manana mpizara "ady" an-jatony fotsiny izahay, ary tsy mety mihitsy izany "kopia-mametaka" rehetra izany avy amin'ny mpamorona. Tsapanay fa tsy maintsy nanangona izany izahay.

Fanatsarana betsaka ny fangatahana PostgreSQL. Kirill Borovikov (Tensor)

Amin'ny ankapobeny dia misy maody mahazatra afaka manangona antontan'isa, na izany aza, mila ampidirina ao amin'ny config - ity pg_stat_statements module. Saingy tsy nety taminay izy.

Voalohany, manendry fanontaniana mitovy amin'ny fampiasana tetika samihafa ao anaty angon-drakitra mitovy QueryId samihafa. Izany hoe raha manao izany ianao aloha SET search_path = '01'; SELECT * FROM user LIMIT 1;ary avy eo SET search_path = '02'; ary ny fangatahana mitovy, dia hanana firaketana samihafa ny antontan'isan'ity mΓ΄dely ity, ary tsy ho afaka hanangona antontan'isa ankapobe manokana aho amin'ny toe-javatra misy an'io mombamomba ny fangatahana io, raha tsy miraharaha ireo tetika.

Ny teboka faharoa nanakana anay tsy hampiasa azy dia tsy fahampian'ny drafitra. Izany hoe tsy misy drafitra fa ny fangatahana ihany no misy. Hitanay izay nihena, saingy tsy azonay ny antony. Ary eto isika dia miverina amin'ny olan'ny angon-drakitra miova haingana.

Ary ny fotoana farany - tsy fisian'ny "facts". Izany hoe, tsy afaka mamaly ohatra iray manokana amin'ny fanatanterahana fanontaniana ianao - tsy misy, tsy misy afa-tsy antontan'isa mitambatra. Na dia azo atao aza ny miara-miasa amin'izany dia sarotra be.

Fanatsarana betsaka ny fangatahana PostgreSQL. Kirill Borovikov (Tensor)

Noho izany, nanapa-kevitra ny hiady amin'ny kopia-mametaka izahay ary nanomboka nanoratra hetra.

Ny mpanangona dia mifandray amin'ny SSH, mametraka fifandraisana azo antoka amin'ny mpizara miaraka amin'ny angon-drakitra mampiasa taratasy fanamarinana, ary tail -F "mifikitra" aminy ao amin'ny rakitra log. Ka amin'ity fivoriana ity mahazo "fitaratra" feno amin'ny rakitra log manontolo, izay vokarin'ny mpizara. Ny enta-mavesatra eo amin'ny mpizara mihitsy dia kely indrindra, satria tsy manara-maso na inona na inona ao izahay, taratry ny fifamoivoizana fotsiny.

Satria efa nanomboka nanoratra ny interface ao amin'ny Node.js izahay, dia nanohy nanoratra ny mpanangona tao anatiny. Ary io teknolojia io dia nanamarina ny tenany, satria tena mety ny mampiasa JavaScript mba hiasa miaraka amin'ny angon-drakitra lahatsoratra malemy, izay ny log. Ary ny fotodrafitrasa Node.js mihitsy amin'ny maha sehatra backend anao dia ahafahanao miasa mora sy mora amin'ny fifandraisana amin'ny tambajotra, ary amin'ny alΓ lan'ny angon-drakitra rehetra.

Arak'izany dia "manaparitaka" fifandraisana roa isika: ny voalohany dia "mihaino" ny log ary mitondra izany ho antsika, ary ny faharoa manontany matetika ny fototra. "Saingy ny log dia mampiseho fa voasakana ny famantarana misy oid 123," saingy tsy midika na inona na inona amin'ny mpamorona izany, ary tsara ny manontany ny angon-drakitra hoe "Inona no OID = 123?" Ary noho izany dia manontany tsindraindray ny fototra izay mbola tsy fantatsika momba ny tenantsika.

Fanatsarana betsaka ny fangatahana PostgreSQL. Kirill Borovikov (Tensor)

β€œZavatra iray ihany no tsy noeritreretinao, misy karazana tantely toy ny elefanta!..” Nanomboka namolavola ity rafitra ity izahay rehefa te hanara-maso mpizara 10. Ny tena manan-danja indrindra amin'ny fahatakarantsika, izay nisehoan'ny olana sasany izay sarotra zakaina. Saingy nandritra ny telovolana voalohany dia nahazo zato izahay ho an'ny fanaraha-maso - satria mandeha ny rafitra, samy maniry izany ny rehetra, mahazo aina ny rehetra.

Izany rehetra izany dia mila ampiana, lehibe sy mavitrika ny fikorianan'ny data. Raha ny marina, ny zavatra arahintsika, izay azontsika zakaina, no ampiasaintsika. Mampiasa PostgreSQL ho fitahirizana angon-drakitra ihany koa izahay. Ary tsy misy haingana kokoa ny "mandraraka" angona ao aminy noho ny mpandraharaha COPY Tsy mbola.

Saingy tsy ny teknΓ΄lΓ΄jintsika ny "fandrotsahana" fotsiny. Satria raha manana fangatahana 50k isan-tsegondra eo amin'ny mpizara zato ianao, dia hiteraka 100-150GB ny log isan'andro. Noho izany dia tsy maintsy "nanapaka" tsara ny fotony izahay.

Voalohany, nanao izany izahay fisarahana isan'andro, satria, amin'ny ankapobeny, tsy misy olona liana amin'ny fifandraisan'ny andro. Inona no mahasamihafa ny anananao omaly, raha namoaka dikan-teny vaovao amin'ny fampiharana ianao anio alina - ary efa misy antontan'isa vaovao.

Faharoa, nianatra izahay (voatery) tena, tena haingana manoratra mampiasa COPY. Izany hoe tsy fotsiny COPYsatria haingana noho izy INSERT, ary na dia haingana kokoa aza.

Fanatsarana betsaka ny fangatahana PostgreSQL. Kirill Borovikov (Tensor)

Ny teboka fahatelo - tsy maintsy nanao izany aho avelao ny trigger, ary ny fanalahidy vahiny. Izany hoe tsy manana integridad referential mihitsy izahay. Satria raha manana latabatra misy FK roa ianao, ary miteny ao amin'ny rafitry ny angon-drakitra ianao fa "eto ny firaketana an-tsoratra izay ambaran'ny FK, ohatra, amin'ny vondron'ny rakitra", dia rehefa ampidirinao izany, PostgreSQL tsy misy na inona na inona afa-tsy ny fandraisana sy ny fanaovana izany amim-pahatsorana SELECT 1 FROM master_fk1_table WHERE ... miaraka amin'ny identifier izay ezahinao ampidirina - mba hanamarinana fotsiny fa misy io firaketana io, fa tsy "manapaka" ity fanalahidy vahiny ity amin'ny fampidiranao.

Raha tokony ho firaketana iray ho an'ny latabatra kendrena sy ny fanondrony, dia mahazo tombony fanampiny amin'ny famakiana avy amin'ireo tabilao rehetra resahiny isika. Saingy tsy mila izany mihitsy izahay - ny andraikitray dia ny mirakitra an-tsoratra araka izay tratra ary haingana araka izay tratra miaraka amin'ny entana kely indrindra. Noho izany FK - midina!

Ny teboka manaraka dia ny fanangonana sy ny hashing. Tany am-boalohany dia nampiharina tao amin'ny angon-drakitra izy ireo - na izany aza, mora ny manao izany avy hatrany, rehefa tonga ny firaketana, manao izany amin'ny karazana takelaka. "miampy iray" eo amin'ny trigger. Eny, mety izany, fa ny ratsy iray ihany - mampiditra rakitsoratra iray ianao, fa voatery mamaky sy manoratra zavatra hafa avy amin'ny latabatra hafa. Ankoatra izany, tsy vitan'ny hoe mamaky sy manoratra ianao, fa manao izany koa isaky ny mandeha.

Alao sary an-tsaina izao fa manana latabatra ianao izay manisa fotsiny ny isan'ny fangatahana nandalo tamina mpampiantrano iray manokana: +1, +1, +1, ..., +1. Ary ianao, amin'ny ankapobeny, dia tsy mila izany - azo atao izany rehetra izany fitambaran'ny fahatsiarovana amin'ny mpanangona ary alefaso any amin'ny database indray mandeha +10.

Eny, raha misy olana sasany, ny tsy fivadihanao lojika dia mety "hisaraka", saingy tranga tsy azo tsapain-tanana izany - satria manana mpizara mahazatra ianao, manana bateria ao amin'ny controller, manana log de transaction ianao, logiciel amin'ny rafitra fichier... Amin'ny ankapobeny, tsy mendrika izany. Ny fahaverezan'ny vokatra azonao amin'ny fampandehanana trigger/FK dia tsy mendrika ny fandanianao.

Toy izany koa ny hashing. Misy fangatahana manidina aminao, kajy ny famantarana iray avy amin'izany ao amin'ny tahiry, soraty amin'ny angon-drakitra ary avy eo ambarao amin'ny rehetra. Tsara ny zava-drehetra mandra-pahatongan'ny fotoana fandraketana, misy olona faharoa tonga aminao izay te hanoratra zavatra mitovy - ary voasakana ianao, ary efa ratsy izany. Noho izany, raha azonao atao ny mamindra ny famokarana ID sasany amin'ny mpanjifa (mifandray amin'ny angon-drakitra), dia tsara kokoa ny manao izany.

Tena tonga lafatra ho antsika ny mampiasa MD5 avy amin'ny lahatsoratra - fangatahana, drafitra, mΓ΄dely,... Kajy izany eo amin'ny lafiny mpanangom-bokatra, ary "arotsaka" ao anaty tahiry ny ID efa vita. Ny halavan'ny MD5 sy ny fisarahana isan'andro dia mamela antsika tsy hanahy momba ny fifandonana mety hitranga.

Fanatsarana betsaka ny fangatahana PostgreSQL. Kirill Borovikov (Tensor)

Saingy mba handrakitra an-tsoratra izany rehetra izany haingana, dia nila nanova ny fomba fandraketana mihitsy izahay.

Ahoana ny fanoratanao data matetika? Manana karazana tahirin-kevitra izahay, mizara azy ho latabatra maromaro, ary avy eo COPY - voalohany amin'ny voalohany, avy eo amin'ny faharoa, amin'ny fahatelo... Tsy mety izany, satria toa manoratra stream data iray amin'ny dingana telo izahay. misesy. Tsy mahafinaritra. Afaka atao haingana kokoa ve izany? Afaka!

Mba hanaovana izany, dia ampy fotsiny ny manafoana ireo fikorianan'izy ireo mifanaraka amin'ny tsirairay. Hita fa manana lesoka, fangatahana, mΓ΄dely, fanakanana, ... manidina amin'ny kofehy samihafa - ary soratanay mifanitsy daholo izany. Ampy izay mitazona fantsona COPY misokatra tsy tapaka ho an'ny latabatra kendrena tsirairay.

Fanatsarana betsaka ny fangatahana PostgreSQL. Kirill Borovikov (Tensor)

Izany hoe, amin'ny mpanangom-bokatra misy riaka foana, izay ahafahako manoratra ny angona ilaiko. Fa mba ho hitan'ny angon-drakitra izany angon-drakitra izany, ary misy olona tsy mijanona miandry ny fanoratana an'io data io, Ny COPY dia tsy maintsy tapaka amin'ny fotoana sasany. Aminay, 100ms eo ho eo ny fe-potoana mahomby indrindra - manidy azy izahay ary manokatra izany avy hatrany eo amin'ny latabatra iray ihany. Ary raha tsy ampy ny fikorianan'ny rivotra iray mandritra ny tampon'isa sasany, dia mitambatra amin'ny fetra iray isika.

Ho fanampin'izay, hitanay fa ho an'ny mombamomba entana toy izany, ny fitambarana rehetra, rehefa angonina amin'ny andiany ny rakitra dia ratsy. Ny ratsy klasika dia INSERT ... VALUES ary firaketana 1000 fanampiny. Satria amin'izay fotoana izay dia manana tampon'ny fanoratana ianao amin'ny haino aman-jery, ary ny olon-kafa rehetra manandrana manoratra zavatra amin'ny kapila dia hiandry.

Mba hialana amin'ny anomaliana toy izany dia aza mitambatra na inona na inona, aza manao buffer mihitsy. Ary raha misy ny buffering amin'ny kapila (Soa ihany fa ny Stream API ao amin'ny Node.js dia ahafahanao mahita) - ahemotra ity fifandraisana ity. Rehefa mahazo hetsika iray ianao fa maimaim-poana indray dia manorata amin'izany avy amin'ny filaharana voaangona. Ary raha mbola be atao izany, alao ny iray maimaim-poana avy ao amin'ny dobo ary manorata azy.

Talohan'ny nampidirana ity fomba fandraketana angon-drakitra ity dia nanana ops 4K teo ho eo izahay, ary tamin'izany fomba izany dia nampihena in-4 ny entana. Ankehitriny dia nitombo in-6 indray izy ireo noho ny angon-drakitra voara-maso vaovao - hatramin'ny 100MB/s. Ary ankehitriny dia mitahiry logs izahay nandritra ny 3 volana farany tao anatin'ny 10-15TB eo ho eo, manantena fa afaka telo volana monja dia ho afaka hamaha olana ny developer rehetra.

Takatsika ny olana

Fa ny fanangonana fotsiny ireo angon-drakitra rehetra ireo dia tsara, mahasoa, manan-danja, saingy tsy ampy - mila takatra izany. Satria drafitra samihafa an-tapitrisany isan'andro ireo.

Fanatsarana betsaka ny fangatahana PostgreSQL. Kirill Borovikov (Tensor)

Saingy an-tapitrisany no tsy azo fehezina, tsy maintsy manao "kely kokoa" aloha isika. Ary, voalohany indrindra, mila manapa-kevitra ianao hoe ahoana no handaminanao an'io zavatra "kely kokoa".

Nahita teboka telo lehibe izahay:

  • izay nandefa ity fangatahana ity
    Izany hoe, avy amin'ny fampiharana inona no "tonga": interface tsara web, backend, rafitra fandoavam-bola na zavatra hafa.
  • izay nitranga izany
    Amin'ny mpizara manokana inona? Satria raha manana lohamilina maromaro eo ambanin'ny fampiharana iray ianao, ary tampoka dia "lasa adala" ny iray (satria "lo ny kapila", "tafiditra ny fahatsiarovana", olana hafa), dia mila miresaka manokana amin'ny mpizara ianao.
  • Ahoana no ny olana dia niseho tamin'ny fomba iray na hafa

Mba hahatakarana ny hoe "iza" no nandefa fangatahana ho anay, dia mampiasa fitaovana mahazatra izahay - mametraka fari-pitsipika session: SET application_name = '{bl-host}:{bl-method}'; - alefanay ny anaran'ny mpampiantrano lojika fandraharahana izay niavian'ny fangatahana, ary ny anaran'ny fomba na fampiharana izay nanombohana azy.

Rehefa avy nandalo ny "tompon'ny" fangatahana izahay, dia tsy maintsy avoaka amin'ny log izany - noho izany dia amboary ny variable log_line_prefix = ' %m [%p:%v] [%d] %r %a'. Ho an'izay liana angamba jereo ao amin'ny boky torolalanainona no dikan'izany rehetra izany. Hitantsika ao amin'ny log:

  • врСмя
  • famantarana ny dingana sy ny fifampiraharahana
  • anarana database
  • IP an'ny olona nandefa ity fangatahana ity
  • ary ny anaran'ny fomba

Fanatsarana betsaka ny fangatahana PostgreSQL. Kirill Borovikov (Tensor)

Dia tsikaritray fa tsy dia mahaliana loatra ny mijery ny fifandraisan'ny fangatahana iray eo amin'ireo mpizara samihafa. Tsy matetika ianao no manana toe-javatra izay misy fampiharana iray mivadika etsy sy eroa. Saingy na dia mitovy aza izany, jereo ny iray amin'ireo mpizara ireo.

Ka izao no tapaka "mpizara iray - iray andro" hita fa ampy ho antsika ny analyse rehetra.

Ny fizarana voalohany analytical dia mitovy "santionany" - endrika fanafohezana ny fanolorana ny drafitra, nesorina ny tondro isa rehetra. Ny fanapahana faharoa dia ny fampiharana na ny fomba, ary ny fanapahana fahatelo dia ny node drafitra manokana izay niteraka olana ho antsika.

Rehefa nifindra avy amin'ny ohatra manokana mankany amin'ny mΓ΄dely izahay dia nahazo tombony roa indray mandeha:

  • fampihenana maro ny isan'ny zavatra hodinihina
    Tsy maintsy mamakafaka ny olana tsy amin'ny fanontaniana na drafitra an'arivony intsony isika, fa amin'ny modely am-polony.
  • fizotry
    Izany hoe, amin'ny famintinana ny "zava-misy" ao anatin'ny fizarana iray dia azonao atao ny mampiseho ny endriny mandritra ny andro. Ary eto dia azonao atao ny mahatakatra fa raha manana karazana lamina mitranga ianao, ohatra, indray mandeha isan'andro, fa tokony hitranga indray mandeha isan'andro izany, dia tokony hieritreritra izay tsy nety ianao - iza no nahatonga izany ary nahoana, angamba tokony ho eto. tsy tokony. Ity dia fomba famakafakana tsy misy tarehimarika, hita maso fotsiny.

Fanatsarana betsaka ny fangatahana PostgreSQL. Kirill Borovikov (Tensor)

Ny fomba sisa tavela dia mifototra amin'ny tondro izay alaintsika avy amin'ny drafitra: impiry no nisehoan'ny lamina toy izany, ny totalin'ny fotoana sy ny salan'isa, ny habetsaky ny angona novakiana tao amin'ny kapila, ary ny habetsahan'ny fitadidiana...

Satria, ohatra, tonga any amin'ny pejy analyse ho an'ny mpampiantrano ianao, jereo - misy zavatra manomboka mamaky be loatra amin'ny kapila. Ny kapila ao amin'ny server dia tsy mahazaka izany - iza no mamaky azy?

Ary azonao atao ny mandamina araka ny tsanganana rehetra ary manapa-kevitra hoe inona no hataonao amin'izao fotoana izao - ny enta-mavesatra eo amin'ny processeur na ny kapila, na ny totalin'ny fangatahana ... namoaka dikan-teny vaovao amin'ny fampiharana.
[video lahateny]

Ary avy hatrany ianao dia afaka mahita fampiharana samy hafa miaraka amin'ny mΓ΄dely mitovy amin'ny fangatahana toy ny SELECT * FROM users WHERE login = 'Vasya'. Frontend, backend, processing... Ary manontany tena ianao hoe nahoana ny fanodinana no mamaky ny mpampiasa raha tsy mifandray aminy izy.

Ny mifanohitra amin'izany dia ny mijery avy hatrany amin'ny fampiharana ny zavatra ataony. Ohatra, ny frontend dia ity, ity, ity, ary ity indray mandeha isan'ora (manampy ny fandaharam-potoana). Ary avy hatrany dia mipetraka ny fanontaniana: toa tsy anjaran'ny frontend ny manao zavatra indray mandeha isan'ora...

Fanatsarana betsaka ny fangatahana PostgreSQL. Kirill Borovikov (Tensor)

Rehefa afaka kelikely, dia tsapanay fa tsy ampy ny fitambarana statistika amin'ny nodes plan. Ireo nodes izay manao zavatra miaraka amin'ny angon-drakitra amin'ny latabatra ihany no natokantsika tamin'ny drafitra (vakio / soraty amin'ny index na tsia). Raha ny marina, lafiny iray ihany no ampiana raha oharina amin'ny sary teo aloha - firy ny rakitra nentin'ity node ity ho antsika?, ary firy no nariana (Laharana nesorina tamin'ny sivana).

Tsy manana index sahaza eo amin'ny takelaka ianao, manao fangatahana amin'izany ianao, manidina eo ambonin'ny index, latsaka ao amin'ny Seq Scan... nosivanao daholo ny rakitra rehetra afa-tsy ny iray. Nahoana ianao no mila rakitra voasivana 100M isan'andro? Tsy tsara kokoa ve ny manodina ny tondro?

Fanatsarana betsaka ny fangatahana PostgreSQL. Kirill Borovikov (Tensor)

Rehefa avy nandinika ny drafitra rehetra node isaky ny node, dia nahatsapa izahay fa misy rafitra mahazatra ao amin'ny drafitra izay tena mety ho mampiahiahy. Ary tsara ny milaza amin'ny mpamorona hoe: "Ry namana, eto ianao dia mamaky voalohany amin'ny fanondroana, avy eo mandamina, ary avy eo tapaho" - amin'ny ankapobeny dia misy rakitsoratra iray.

Izay rehetra nanoratra fanontaniana dia mety ho nifanena tamin'ity lamina ity: "Omeo ahy ny baiko farany ho an'i Vasya, ny datiny." Ary raha tsy manana tondro amin'ny daty ianao, na tsy misy daty ao amin'ny tondro nampiasainao, dia hanitsaka ny "rake" mitovy tanteraka.

Saingy fantatsika fa "rake" izany - koa maninona raha lazaina avy hatrany amin'ny mpamorona izay tokony hataony. Noho izany, rehefa manokatra drafitra izao, ny mpamorona anay dia mahita sary tsara tarehy miaraka amin'ny toro-hevitra avy hatrany, izay nilazan'izy ireo taminy avy hatrany hoe: "Manana olana etsy sy eroa ianao, saingy voavaha izao sy izao."

Vokatr'izany dia nihena be ny traikefa ilaina amin'ny famahana olana tany am-boalohany ary ankehitriny. Izany no karazana fitaovana ananantsika.

Fanatsarana betsaka ny fangatahana PostgreSQL. Kirill Borovikov (Tensor)

Source: www.habr.com

Add a comment