Optimization mòr de cheistean PostgreSQL. Kirill Borovikov (Tensor)

Tha an aithisg a’ taisbeanadh cuid de dhòighean-obrach a cheadaicheas sùil a chumail air coileanadh cheistean SQL nuair a tha milleanan dhiubh ann gach latha, agus tha ceudan de luchd-frithealaidh PostgreSQL air an sgrùdadh.

Dè na fuasglaidhean teignigeach a leigeas leinn an leithid de dh'fhiosrachadh a phròiseasadh gu h-èifeachdach, agus ciamar a nì seo beatha leasaiche àbhaisteach nas fhasa?


Cò aig a bheil ùidh? mion-sgrùdadh air duilgheadasan sònraichte agus diofar dhòighean optimization Ceistean SQL agus fuasgladh dhuilgheadasan àbhaisteach DBA ann am PostgreSQL - faodaidh tu cuideachd leugh sreath de artaigilean air a ’chuspair seo.

Optimization mòr de cheistean PostgreSQL. Kirill Borovikov (Tensor)
Is e m ’ainm Kirill Borovikov, tha mi a’ riochdachadh Companaidh tensor. Gu sònraichte, tha mi gu sònraichte ag obair le stòran-dàta sa chompanaidh againn.

An-diugh innsidh mi dhut mar a nì sinn an fheum as fheàrr de cheistean, nuair nach fheum thu “tagh às a chèile” coileanadh aon cheist, ach fuasgladh fhaighinn air an duilgheadas en masse. Nuair a tha milleanan de iarrtasan, agus feumaidh tu a lorg cuid dòighean-obrach airson fuasgladh an duilgheadas mòr seo.

San fharsaingeachd, tha Tensor airson millean de ar luchd-dèiligidh Is e VLSI an tagradh againn: lìonra sòisealta corporra, fuasglaidhean airson conaltradh bhidio, airson sruth sgrìobhainnean a-staigh agus a-muigh, siostaman cunntasachd airson cunntasachd agus taighean-bathair,... Is e sin, leithid “mega-combine” airson riaghladh gnìomhachais amalaichte, anns a bheil còrr air 100 eadar-dhealaichte pròiseactan a-staigh.

Gus dèanamh cinnteach gu bheil iad uile ag obair agus a’ leasachadh gu h-àbhaisteach, tha 10 ionadan leasachaidh againn air feadh na dùthcha, le barrachd annta 1000 luchd-leasachaidh.

Tha sinn air a bhith ag obair le PostgreSQL bho 2008 agus tha sinn air tòrr de na bhios sinn a’ giullachd a chruinneachadh - dàta teachdaiche, staitistigeil, mion-sgrùdaidh, dàta bho shiostaman fiosrachaidh taobh a-muigh - barrachd air 400TB. Tha timcheall air 250 frithealaiche ann an cinneasachadh a-mhàin, agus gu h-iomlan tha timcheall air 1000 frithealaiche stòr-dàta air am bi sinn a’ cumail sùil.

Optimization mòr de cheistean PostgreSQL. Kirill Borovikov (Tensor)

Tha SQL na chànan dearbhach. Tha thu a’ mìneachadh chan e “mar” a bu chòir rudeigin obrachadh, ach “dè” a tha thu airson a choileanadh. Tha fios nas fheàrr aig an DBMS mar a nì thu JOIN - mar a cheanglas tu na bùird agad, dè na suidheachaidhean a bu chòir a chuir, dè a thèid tron ​​​​chlàr-amais, dè nach bi ...

Bidh cuid de DBMSn a’ gabhail ri molaidhean: “Chan eil, ceangail an dà chlàr seo ann an leithid de chiudha,” ach chan urrainn dha PostgreSQL seo a dhèanamh. Is e seo suidheachadh mothachail prìomh luchd-leasachaidh: “B’ fheàrr leinn crìoch a chuir air optimizer na ceiste na leigeil le luchd-leasachaidh molaidhean de sheòrsa air choreigin a chleachdadh. ”

Ach, a dh’ aindeoin nach eil PostgreSQL a’ leigeil leis an “taobh a-muigh” smachd a chumail air fhèin, tha e a’ ceadachadh gu foirfe faic ciod a tha dol a stigh annnuair a ruitheas tu do cheist, agus far a bheil duilgheadasan aice.

Optimization mòr de cheistean PostgreSQL. Kirill Borovikov (Tensor)

San fharsaingeachd, dè na duilgheadasan clasaigeach a bhios aig leasaiche [gu DBA] mar as trice? " An so choimhlion sinn an t-iarrtas, agus tha a h-uile dad slaodach leinn, tha a h-uile dad an crochadh, tha rudeigin a' tachairt... Trioblaid de sheòrsa air choreigin!"

Tha na h-adhbharan cha mhòr an-còmhnaidh mar a leanas:

  • algairim ceist neo-èifeachdach
    Leasaiche: “A-nis tha mi a’ toirt dha clàran 10 ann an SQL tro JOIN…” - agus an dùil gum bi na cumhaichean aige gu h-èifeachdach “gun cheangal” agus gheibh e a h-uile dad gu sgiobalta. Ach chan eil mìorbhailean a 'tachairt, agus tha siostam sam bith le leithid de chaochlaideach (10 clàran ann an aon BHO) an-còmhnaidh a' toirt seachad seòrsa de mhearachd. [artaigil]
  • staitistig neo-iomchaidh
    Tha a’ phuing seo gu math buntainneach gu sònraichte airson PostgreSQL, nuair a bhios tu “a’ dòrtadh” stòr-dàta mòr air an t-seirbheisiche, a’ dèanamh iarrtas, agus a’ “sexcanits” air a’ chlàr agad. Oir an-dè bha clàran 10 ann, agus an-diugh tha 10 millean ann, ach chan eil PostgreSQL fhathast mothachail air seo, agus feumaidh sinn innse mu dheidhinn. [artaigil]
  • "plug" air goireasan
    Tha thu air stòr-dàta mòr agus làn luchdachadh a chuir a-steach air frithealaiche lag aig nach eil coileanadh diosc, cuimhne no pròiseasar gu leòr. Agus sin agad... An àiteigin tha mullach coileanaidh os a chionn nach urrainn dhut leum tuilleadh.
  • bacadh
    Is e puing duilich a tha seo, ach tha iad nas buntainniche airson diofar cheistean atharrachaidh (INSERT, UPDATE, DELETE) - is e cuspair mòr air leth a tha seo.

A 'faighinn plana

...Agus airson a h-uile càil eile sinn feum air plana! Feumaidh sinn faicinn dè tha a’ tachairt taobh a-staigh an fhrithealaiche.

Optimization mòr de cheistean PostgreSQL. Kirill Borovikov (Tensor)

Tha plana cur an gnìomh ceiste airson PostgreSQL na chraobh den algairim cur an gnìomh ceist ann an riochdachadh teacsa. Is e dìreach an algairim a chaidh a lorg, mar thoradh air mion-sgrùdadh leis an dealbhaiche, mar an fheadhainn as èifeachdaiche.

Is e gnìomhachd a th’ anns gach nód craoibhe: a’ faighinn dàta air ais bho bhòrd no clàr-amais, a’ togail mapa-bit, a’ ceangal dà bhòrd, a’ tighinn còmhla, a’ trasnadh, no a’ dùnadh a-mach taghaidhean. Le bhith a’ dèanamh ceist tha e a’ ciallachadh coiseachd tro nodan na craoibhe seo.

Gus plana na ceiste fhaighinn, is e an dòigh as fhasa an aithris a chuir an gnìomh EXPLAIN. Gus faighinn leis a h-uile fìor fheart, is e sin, ceist a chuir an gnìomh air a’ bhunait - EXPLAIN (ANALYZE, BUFFERS) SELECT ....

An droch phàirt: nuair a bhios tu ga ruith, bidh e a 'tachairt "an seo agus an-dràsta", agus mar sin chan eil e freagarrach ach airson debugging ionadail. Ma ghabhas tu frithealaiche làn luchdaichte a tha fo shruth làidir de dh’ atharrachaidhean dàta, agus gum faic thu: “Oh! An seo tha coileanadh slaodach againnsya iarrtas." Leth uair a thìde, uair a thìde air ais - fhad ‘s a bha thu a’ ruith agus a ’faighinn an iarrtas seo bho na logaichean, ga thoirt air ais chun t-seirbheisiche, dh’ atharraich an dàta agus na staitistig gu lèir agad. Bidh thu ga ruith gu debug - agus ruithidh e gu sgiobalta! Agus chan urrainn dhut a thuigsinn carson, carson a bha gu slaodach.

Optimization mòr de cheistean PostgreSQL. Kirill Borovikov (Tensor)

Gus tuigsinn dè dìreach a thachair aig an àm nuair a chaidh an t-iarrtas a chuir gu bàs air an fhrithealaiche, sgrìobh daoine snasail auto_explain modal. Tha e an làthair anns cha mhòr a h-uile sgaoileadh PostgreSQL as cumanta, agus faodar a chuir an gnìomh gu sìmplidh anns an fhaidhle config.

Ma thuigeas e gu bheil iarrtas air choireigin a’ ruith nas fhaide na a’ chrìoch a dh’ innis thu dha, nì e sin “dealbh” de phlana an iarrtais seo agus gan sgrìobhadh còmhla sa log.

Optimization mòr de cheistean PostgreSQL. Kirill Borovikov (Tensor)

Tha coltas gu bheil a h-uile dad ceart gu leòr a-nis, thèid sinn chun log agus chì sinn ann... [text footcloth]. Ach chan urrainn dhuinn dad a ràdh mu dheidhinn, ach a-mhàin gur e plana math a th’ ann oir thug e 11ms airson a chuir gu bàs.

Tha e coltach gu bheil a h-uile dad gu math - ach chan eil dad soilleir dè a thachair. A bharrachd air an ùine choitcheann, chan eil sinn dha-rìribh a’ faicinn dad. Leis nach eil a bhith a’ coimhead air a leithid de “uan” de theacsa shìmplidh mar as trice lèirsinneach.

Ach eadhon ged nach eil e follaiseach, eadhon ged a tha e mì-ghoireasach, tha duilgheadasan nas bunaitiche ann:

  • Tha an nota a’ comharrachadh suim de ghoireasan an fho-chraobh gu lèir fo dha. Is e sin, chan urrainn dhut dìreach faighinn a-mach dè an ùine a chaidh a chaitheamh air a’ chlàr shònraichte seo ma tha suidheachadh neadachaidh ann. Feumaidh sinn coimhead gu dinamach a bheil “clann” agus caochladairean cumhach, CTEn a-staigh - agus seo uile a thoirt air falbh “nar n-inntinn”.
  • An dàrna puing: is e an ùine a tha air a chomharrachadh air an nód ùine cur gu bàs aon nód. Ma chaidh an nód seo a chuir gu bàs mar thoradh air, mar eisimpleir, lùb tro chlàran clàr grunn thursan, bidh an àireamh de lùban - cearcallan an nód seo - ag àrdachadh sa phlana. Ach tha an ùine cur gu bàs atamach fhèin fhathast mar a tha e a thaobh plana. Is e sin, gus tuigsinn dè cho fada ‘s a chaidh an nód seo a choileanadh gu h-iomlan, feumaidh tu aon rud iomadachadh le fear eile - a-rithist,“ nad cheann. ”

Ann an leithid de shuidheachaidhean, tuig "Cò an ceangal as laige?" cha mhòr do-dhèanta. Mar sin, bidh eadhon an luchd-leasachaidh fhèin a 'sgrìobhadh anns an "leabhar-làimhe" sin “Tha tuigse air plana na ealain a dh’ fheumar ionnsachadh, eòlas…”.

Ach tha 1000 luchd-leasachaidh againn, agus chan urrainn dhut an t-eòlas seo a thoirt do gach fear dhiubh. Tha mi, thusa, tha fios aige, ach chan eil fios aig cuideigin thall an sin tuilleadh. Is dòcha gun ionnsaich e, no is dòcha nach eil, ach feumaidh e a bhith ag obair a-nis - agus càite am faigheadh ​​​​e an t-eòlas seo?

Dealbhaich sealladh

Mar sin, thuig sinn gum feum sinn dèiligeadh ris na duilgheadasan sin deagh shealladh den phlana. [artaigil]

Optimization mòr de cheistean PostgreSQL. Kirill Borovikov (Tensor)

Chaidh sinn an toiseach “tron mhargaidh” - leig dhuinn sùil a thoirt air an eadar-lìn gus faicinn dè a tha eadhon ann.

Ach thionndaidh e a-mach gur e glè bheag de fhuasglaidhean an ìre mhath “beò” a tha gu ìre mhòr a ’leasachadh - gu litearra, dìreach aon: mìnich.depesz.com le Hubert Lubaczewski. Nuair a thèid thu a-steach don raon “feed” mar riochdachadh teacsa den phlana, seallaidh e dhut clàr leis an dàta parsed:

  • ùine giollachd an nód fhèin
  • ùine iomlan airson an fho-chraobh gu lèir
  • an àireamh de chlàran a chaidh fhaighinn air ais ris an robh dùil gu staitistigeil
  • an corp nòd fèin

Tha comas aig an t-seirbheis seo cuideachd tasglann de cheanglaichean a cho-roinn. Thilg thu do phlana a-steach an sin agus thuirt e: "Hey, Vasya, seo ceangal, tha rudeigin ceàrr an sin."

Optimization mòr de cheistean PostgreSQL. Kirill Borovikov (Tensor)

Ach tha duilgheadasan beaga ann cuideachd.

An toiseach, àireamh mhòr de “copy-paste”. Gabhaidh tu pìos den log, cuir a-steach e an sin, agus a-rithist, is a-rithist.

Anns an dàrna àite, chan eil mion-sgrùdadh air an uiread de dhàta a chaidh a leughadh - na h-aon bufairean ris an toradh EXPLAIN (ANALYZE, BUFFERS), chan eil sinn ga fhaicinn an seo. Tha e dìreach nach eil fios ciamar a disassemble iad, gan tuigsinn agus ag obair còmhla riutha. Nuair a bhios tu a’ leughadh tòrr dàta agus a’ tuigsinn gur dòcha gu bheil thu a’ mì-riarachadh an diosg agus an tasgadan cuimhne, tha am fiosrachadh seo glè chudromach.

Is e an treas puing àicheil leasachadh fìor lag a’ phròiseict seo. Tha na geallaidhean glè bheag, tha e math ma tha aon uair gach sia mìosan, agus tha an còd ann am Perl.

Optimization mòr de cheistean PostgreSQL. Kirill Borovikov (Tensor)

Ach is e “lyrics” a tha seo uile, dh’ fhaodadh sinn dòigh air choireigin a bhith beò le seo, ach tha aon rud ann a thionndaidh gu mòr air falbh bhon t-seirbheis seo. Tha iad sin nam mearachdan anns a’ mhion-sgrùdadh air Common Table Expression (CTE) agus diofar nodan fiùghantach leithid InitPlan/SubPlan.

Ma tha thu a 'creidsinn an dealbh seo, tha an ùine cur gu bàs iomlan airson gach nód fa leth nas motha na an ùine cur gu bàs iomlan airson an iarrtais gu lèir. Tha e sìmplidh - cha deach ùine ginealach an CTE seo a thoirt air falbh bhon nód CTE Scan. Mar sin, chan eil fios againn tuilleadh air an fhreagairt cheart air dè cho fada ‘s a thug an scan CTE fhèin.

Optimization mòr de cheistean PostgreSQL. Kirill Borovikov (Tensor)

An uairsin thuig sinn gu robh an t-àm ann ar cuid fhìn a sgrìobhadh - Hurray! Tha a h-uile leasaiche ag ràdh: “A-nis sgrìobhaidh sinn ar cuid fhèin, bidh e air leth furasta!”

Ghabh sinn stac a bha àbhaisteach airson seirbheisean lìn: cridhe stèidhichte air Node.js + Express, chleachd sinn Bootstrap agus D3.js airson diagraman brèagha. Agus bha na dùilean againn làn fhìreanachadh - fhuair sinn a’ chiad prototype ann an 2 sheachdain:

  • parser plana àbhaisteach
    Is e sin, a-nis is urrainn dhuinn plana sam bith a pharsadh bhon fheadhainn a chruthaich PostgreSQL.
  • mion-sgrùdadh ceart air nodan fiùghantach - CTE Scan, InitPlan, SubPlan
  • mion-sgrùdadh air cuairteachadh bufair - far a bheil duilleagan dàta air an leughadh bhon chuimhne, càite bhon tasgadan ionadail, càite bhon diosc
  • fhuair soilleireachd
    Gus nach “cladhach” seo uile sa log, ach gus an “ceangal as laige” fhaicinn sa bhad san dealbh.

Optimization mòr de cheistean PostgreSQL. Kirill Borovikov (Tensor)

Fhuair sinn rudeigin mar seo, le soilleireachadh co-chòrdadh air a ghabhail a-steach. Ach mar as trice chan eil ar luchd-leasachaidh ag obair tuilleadh le riochdachadh iomlan den phlana, ach le fear nas giorra. Às deidh na h-uile, tha sinn mu thràth air na h-àireamhan gu lèir a pharsadh agus air an tilgeil clì is deas, agus sa mheadhan cha do dh’ fhàg sinn ach a ’chiad loidhne, dè an seòrsa nód a th’ ann: CTE Scan, ginealach CTE no Seq Scan a rèir soidhne air choireigin.

Is e seo an riochdachadh giorraichte ris an can sinn teamplaid plana.

Optimization mòr de cheistean PostgreSQL. Kirill Borovikov (Tensor)

Dè eile a bhiodh goireasach? Bhiodh e goireasach faicinn dè a’ chuibhreann den ùine iomlan againn a tha air a riarachadh dè an nód - agus dìreach “steigeadh” ris an taobh clàr-cearcaill.

Bidh sinn a ’comharrachadh an nód agus a’ faicinn - tha e a ’tionndadh a-mach gun tug Seq Scan nas lugha na cairteal den ùine iomlan, agus chaidh an 3/4 a bha air fhàgail a thoirt le CTE Scan. Uamhas! Is e nota beag a tha seo mun “ìre teine” de CTE Scan ma chleachdas tu iad gu gnìomhach anns na ceistean agad. Chan eil iad gu math luath - tha iad eadhon nas ìsle na sganadh bùird cunbhalach. [artaigil] [artaigil]

Ach mar as trice tha na diagraman sin nas inntinniche, nas iom-fhillte, nuair a chomharraicheas sinn sa bhad earrann agus chì sinn, mar eisimpleir, gun robh còrr air leth den ùine a dh’ ith cuid de Seq Scan “ag ithe”. A bharrachd air an sin, bha seòrsa de chriathrag a-staigh, chaidh tòrr chlàran a chuir air falbh a rèir sin ... Faodaidh tu an dealbh seo a thilgeil gu dìreach chun leasaiche agus a ràdh: “Vasya, tha a h-uile dad dona an seo dhut! Dèan dealbh dheth, seall - tha rudeigin ceàrr!"

Optimization mòr de cheistean PostgreSQL. Kirill Borovikov (Tensor)

Gu nàdarra, bha cuid de “ràcan” an sàs.

B’ e a’ chiad rud a thàinig sinn tarsainn air an duilgheadas cuairteachaidh. Tha ùine gach nòta fa leth sa phlana air a chomharrachadh le neo-mhearachdachd 1 μs. Agus nuair a tha an àireamh de chuairtean nód nas àirde na, mar eisimpleir, 1000 - às deidh a chuir gu bàs roinn PostgreSQL “taobh a-staigh cruinneas”, an uairsin nuair a thathar ag obrachadh air ais gheibh sinn an ùine iomlan “an àiteigin eadar 0.95ms agus 1.05ms”. Nuair a thèid an cunntadh gu microseconds, tha sin ceart gu leòr, ach nuair a tha e mu thràth [milli] diog, feumaidh tu am fiosrachadh seo a thoirt fa-near nuair a bhios tu “a’ fuasgladh ghoireasan ”gu nodan a’ phlana “cò a dh’ ith dè an ìre ”.

Optimization mòr de cheistean PostgreSQL. Kirill Borovikov (Tensor)

Is e an dàrna puing, nas iom-fhillte, cuairteachadh ghoireasan (na bufairean sin) am measg nodan fiùghantach. Chosg seo dhuinn a’ chiad dà sheachdain den prototype agus 2 seachdainean eile.

Tha e gu math furasta an seòrsa duilgheadas seo fhaighinn - bidh sinn a’ dèanamh CTE agus a rèir coltais a’ leughadh rudeigin ann. Gu dearbh, tha PostgreSQL “smart” agus cha leugh e dad gu dìreach an sin. An uairsin bheir sinn bhuaithe a’ chiad chlàr, agus thuige a’ cheud agus a’ chiad fhear bhon aon CTE.

Optimization mòr de cheistean PostgreSQL. Kirill Borovikov (Tensor)

Bidh sinn a’ coimhead air a’ phlana agus a’ tuigsinn - tha e neònach, tha 3 bufairean againn (duilleagan dàta) “air an caitheamh” ann an Seq Scan, 1 a bharrachd ann an CTE Scan, agus 2 a bharrachd anns an dàrna CTE Scan. Is e sin, ma bheir sinn geàrr-chunntas air a h-uile càil, gheibh sinn 6, ach bhon chlàr cha leugh sinn ach 3! Cha leugh CTE Scan dad bho àite sam bith, ach bidh e ag obair gu dìreach le cuimhne pròiseas. Is e sin, gu soilleir gu bheil rudeigin ceàrr an seo!

Gu dearbh, tha e a’ tionndadh a-mach gur e seo na 3 duilleagan dàta sin uile a chaidh iarraidh bho Seq Scan, dh’ iarr a’ chiad 1 an 1d CTE Scan, agus an uairsin chaidh an 2na, agus chaidh 2 eile a leughadh dha. Is e sin, chaidh àireamh iomlan de Chaidh 3 duilleagan a leughadh, chan e 6.

Optimization mòr de cheistean PostgreSQL. Kirill Borovikov (Tensor)

Agus thug an dealbh seo sinn gu tuigse nach e craobh a th’ ann an coileanadh plana tuilleadh, ach dìreach seòrsa de ghraf acyclic. Agus fhuair sinn diagram mar seo, gus an tuig sinn “dè a thàinig às a sin sa chiad àite.” Is e sin, an seo chruthaich sinn CTE bho pg_class, agus dh’ iarr sinn air dà uair, agus chaidh cha mhòr a h-uile ùine againn a chaitheamh air a ’mheur nuair a dh’ iarr sinn air an dàrna turas. Tha e soilleir gu bheil leughadh an 2mh inntrig tòrr nas daoire na dìreach a bhith a’ leughadh a’ chiad inntrigeadh bhon chlàr.

Optimization mòr de cheistean PostgreSQL. Kirill Borovikov (Tensor)

Rinn sinn exhaled airson greis. Thuirt iad: “A-nis, Neo, tha fios agad air kung fu! A-nis tha an t-eòlas againn ceart air do sgrion. A-nis faodaidh tu a chleachdadh." [artaigil]

Cruinneachadh log

Ghabh an 1000 neach-leasachaidh againn osna faochadh. Ach bha sinn a’ tuigsinn nach eil againn ach na ceudan de luchd-frithealaidh “sabaid”, agus chan eil an “copy-paste” seo uile bhon luchd-leasachaidh idir goireasach. Thuig sinn gum feumadh sinn a chruinneachadh sinn fhìn.

Optimization mòr de cheistean PostgreSQL. Kirill Borovikov (Tensor)

San fharsaingeachd, tha modal àbhaisteach ann as urrainn staitistig a chruinneachadh, ge-tà, feumaidh e cuideachd a bhith air a chuir an gnìomh anns an config - seo modal pg_stat_statements. Ach cha do chòrd e rinn.

An toiseach, bidh e a’ sònrachadh nan aon cheistean a’ cleachdadh diofar sgeamaichean taobh a-staigh an aon stòr-dàta QueryIds eadar-dhealaichte. Is e sin, ma nì thu an toiseach SET search_path = '01'; SELECT * FROM user LIMIT 1;agus an uairsin SET search_path = '02'; agus an aon iarrtas, an uairsin bidh clàran eadar-dhealaichte aig staitistig a’ mhodal seo, agus cha bhith e comasach dhomh staitistig coitcheann a chruinneachadh gu sònraichte ann an co-theacsa ìomhaigh an iarrtais seo, gun a bhith a ’toirt aire do na sgeamaichean.

Is e an dàrna puing a chuir stad oirnn bho bhith ga chleachdadh dìth phlanaichean. Is e sin, chan eil plana ann, chan eil ann ach an t-iarrtas fhèin. Chì sinn dè bha a’ slaodadh sìos, ach chan eil sinn a’ tuigsinn carson. Agus an seo tillidh sinn gu duilgheadas dàta a tha ag atharrachadh gu luath.

Agus a’ mhionaid mu dheireadh – dìth "fìrinn". Is e sin, chan urrainn dhut dèiligeadh ri eisimpleir sònraichte de choileanadh ceiste - chan eil gin ann, chan eil ann ach staitistig iomlan. Ged a tha e comasach obrachadh le seo, tha e dìreach gu math duilich.

Optimization mòr de cheistean PostgreSQL. Kirill Borovikov (Tensor)

Mar sin, chuir sinn romhainn sabaid an aghaidh leth-bhreac agus thòisich sinn a’ sgrìobhadh cruinneadair.

Bidh an neach-cruinneachaidh a 'ceangal tro SSH, a' stèidheachadh ceangal tèarainte ris an fhrithealaiche leis an stòr-dàta a 'cleachdadh teisteanas, agus tail -F “Clings” ris anns an fhaidhle log. Mar sin anns an t-seisean seo gheibh sinn “sgàthan” iomlan den fhaidhle log gu lèir, a ghineas am frithealaiche. Tha an luchd air an fhrithealaiche fhèin glè bheag, leis nach bi sinn a’ parsadh dad an sin, tha sinn dìreach mar sgàthan air an trafaic.

Leis gu robh sinn mu thràth air tòiseachadh a’ sgrìobhadh an eadar-aghaidh ann an Node.js, chùm sinn oirnn a’ sgrìobhadh an neach-cruinneachaidh ann. Agus tha an teicneòlas seo air fìreanachadh fhèin, oir tha e gu math goireasach JavaScript a chleachdadh gus obrachadh le dàta teacsa le cruth lag, is e sin an log. Agus tha bun-structar Node.js fhèin mar àrd-ùrlar backend a 'toirt cothrom dhut obrachadh gu furasta agus gu h-iomchaidh le ceanglaichean lìonra, agus gu dearbh le sruthan dàta sam bith.

Mar sin, bidh sinn "a 'sìneadh" dà cheangal: a' chiad fhear a bhith "ag èisteachd" ris a 'chlàr fhèin agus ga thoirt thugainn fhìn, agus an dàrna fear a bhith ag iarraidh a' bhunait bho àm gu àm. “Ach tha an log a’ sealltainn gu bheil an soidhne le oid 123 air a bhacadh, ”ach chan eil seo a’ ciallachadh dad don leasaiche, agus bhiodh e math faighneachd don stòr-dàta, “Dè a th’ ann an OID = 123 co-dhiù? ” Agus mar sin bidh sinn bho àm gu àm a’ faighneachd don bhunait dè nach eil fios againn mum dheidhinn fhìn fhathast.

Optimization mòr de cheistean PostgreSQL. Kirill Borovikov (Tensor)

“Chan eil ann ach aon rud air nach tug thu aire, tha gnè de sheilleanan coltach ri ailbhein!..” Thòisich sinn a’ leasachadh an t-siostam seo nuair a bha sinn airson sùil a chumail air 10 frithealaichean. An fheadhainn as deatamaiche nar tuigse, far an do dh’ èirich cuid de dhuilgheadasan a bha duilich dèiligeadh riutha. Ach anns a 'chiad ràithe, fhuair sinn ceud airson sgrùdadh - oir bha an siostam ag obair, bha a h-uile duine ga iarraidh, bha a h-uile duine cofhurtail.

Feumar seo uile a chuir ris, tha an sruth dàta mòr agus gnìomhach. Gu dearbh, is e na bhios sinn a’ cumail sùil, dè as urrainn dhuinn dèiligeadh ris, na bhios sinn a’ cleachdadh. Bidh sinn cuideachd a’ cleachdadh PostgreSQL mar stòradh dàta. Agus chan eil dad nas luaithe airson dàta “a dhòrtadh” na an gnìomhaiche COPY Chan ann fhathast.

Ach chan e dìreach an teicneòlas againn a th’ ann an “dòrtadh” dàta. Oir ma tha timcheall air 50k iarrtas gach diog agad air ceud frithealaiche, cruthaichidh seo 100-150GB de logaichean gach latha. Mar sin, dh'fheumadh sinn am bonn "a ghearradh" gu faiceallach.

An toiseach, rinn sinn sgaradh tron ​​latha, oir, gu ìre mhòr, chan eil ùidh aig duine anns a’ cho-cheangal eadar làithean. Dè an diofar a nì e na bha agad an-dè, nam biodh tu a-nochd air dreach ùr den tagradh a chuir a-steach - agus cuid de staitistigean ùra mu thràth.

San dàrna h-àite, dh’ ionnsaich sinn (b’ fheudar dhuinn) glè, glè luath airson sgrìobhadh a’ cleachdadh COPY. Is e sin, chan e a-mhàin COPYoir tha e nas luaithe na INSERT, agus eadhon nas luaithe.

Optimization mòr de cheistean PostgreSQL. Kirill Borovikov (Tensor)

An treas puing - bha agam ri trèigsinn brosnachaidhean, fa leth, agus iuchraichean cèin. Is e sin, chan eil ionracas iomraidh againn idir. Oir ma tha clàr agad aig a bheil paidhir FKn, agus gu bheil thu ag ràdh ann an structar an stòr-dàta “Seo clàr log air a bheil FK a’ toirt iomradh, mar eisimpleir, gu buidheann de chlàran, ”an uairsin nuair a chuireas tu a-steach e, PostgreSQL chan eil dad air fhàgail ach mar a ghabhas e agus a nì thu gu h-onarach SELECT 1 FROM master_fk1_table WHERE ... leis an aithnichear a tha thu a’ feuchainn ri cuir a-steach - dìreach gus dèanamh cinnteach gu bheil an clàr seo an làthair, nach bi thu “a’ briseadh dheth ”an iuchair chèin seo le do chuir a-steach.

An àite aon chlàr air a’ chlàr targaid agus na clàran-amais aige, gheibh sinn buannachd a bharrachd bho bhith a’ leughadh bho na clàran air fad air a bheil e a’ toirt iomradh. Ach chan eil feum againn air seo idir - is e an obair againn a bhith a’ clàradh nas urrainn dhuinn agus cho luath sa ghabhas leis an luchd as lugha. Mar sin FK - sìos!

Is e an ath phuing cruinneachadh agus hashing. An toiseach, chuir sinn an gnìomh iad san stòr-dàta - às deidh a h-uile càil, tha e goireasach sa bhad, nuair a ruigeas clàr, a dhèanamh ann an seòrsa de chlàr "plus one" ceart anns an inneal-brosnachaidh. Uill, tha e goireasach, ach an aon rud dona - cuir a-steach aon chlàr, ach feumaidh tu rudeigin eile a leughadh agus a sgrìobhadh bho bhòrd eile. A bharrachd air an sin, chan e a-mhàin gu bheil thu a’ leughadh agus a’ sgrìobhadh, bidh thu cuideachd ga dhèanamh a h-uile turas.

A-nis smaoinich gu bheil clàr agad anns am bi thu dìreach a’ cunntadh an àireamh de dh’iarrtasan a chaidh tro òstair sònraichte: +1, +1, +1, ..., +1. Agus thusa, ann am prionnsabal, chan eil feum agad air seo - tha e comasach suim mar chuimhneachan air an neach-cruinneachaidh agus cuir chun stòr-dàta ann an aon turas +10.

Tha, ma tha cuid de dhuilgheadasan ann, faodaidh an ionracas loidsigeach agad “tuiteam às a chèile”, ach is e cùis cha mhòr neo-phractaigeach a tha seo - leis gu bheil frithealaiche àbhaisteach agad, tha bataraidh aige anns an rianadair, tha log malairt agad, log air an siostam fhaidhlichean... San fharsaingeachd, chan fhiach e. Chan fhiach an call cinneasachd a gheibh thu bho bhith a’ ruith luchd-brosnachaidh / FK na cosgais a thig ort.

Tha e an aon rud le hashing. Bidh iarrtas sònraichte ag itealaich thugad, bidh thu a’ tomhas aithnichear sònraichte bhuaithe san stòr-dàta, ga sgrìobhadh chun stòr-dàta agus an uairsin ga innse don h-uile duine. Tha a h-uile dad ceart gu leòr gus, aig àm clàraidh, thig dàrna neach thugad a tha airson an aon rud a chlàradh - agus gheibh thu bacadh, agus tha seo mar-thà dona. Mar sin, mas urrainn dhut ginealach cuid de IDan a ghluasad chun neach-dèiligidh (an taca ris an stòr-dàta), tha e nas fheàrr seo a dhèanamh.

Bha e dìreach foirfe dhuinn MD5 a chleachdadh bhon teacsa - iarrtas, plana, teamplaid,... Bidh sinn ga thomhas air taobh an neach-cruinneachaidh, agus “a’ dòrtadh” an ID deiseil a-steach don stòr-dàta. Tha fad MD5 agus sgaradh làitheil a’ leigeil leinn gun a bhith draghail mu thubaistean a dh’ fhaodadh a bhith ann.

Optimization mòr de cheistean PostgreSQL. Kirill Borovikov (Tensor)

Ach airson seo a chlàradh gu sgiobalta, dh'fheumadh sinn am modh clàraidh fhèin atharrachadh.

Ciamar a sgrìobhas tu dàta mar as trice? Tha seòrsa de sheòrsa dàta againn, roinn sinn e ann an grunn chlàran, agus an uairsin COPY e - an toiseach a-steach don chiad, an uairsin a-steach don dàrna fear, a-steach don treas ... Tha e mì-ghoireasach, oir tha e coltach gu bheil sinn a’ sgrìobhadh aon sruth dàta ann an trì ceumannan ann an òrdugh. Neo-thaitneach. An gabh a dhèanamh nas luaithe? Can!

Gus seo a dhèanamh, tha e gu leòr dìreach na sruthan sin a bhriseadh ann an co-shìnte ri chèile. Tha e a 'tionndadh a-mach gu bheil sinn mearachdan, iarrtasan, teamplaidean, bacaidhean, ... ag itealaich ann an snàithleanan fa leth - agus tha sinn a' sgrìobhadh a h-uile ann an co-shìnte. Gu leòr airson seo cùm sianal COPY an-còmhnaidh fosgailte airson gach clàr targaid fa leth.

Optimization mòr de cheistean PostgreSQL. Kirill Borovikov (Tensor)

Is e sin, aig an neach-cruinneachaidh tha sruth ann an-còmhnaidh, anns an urrainn dhomh an dàta a tha a dhìth orm a sgrìobhadh. Ach gus am faic an stòr-dàta an dàta seo, agus nach tèid cuideigin an sàs a’ feitheamh ris an dàta seo a sgrìobhadh, Feumar casg a chuir air COPY aig amannan sònraichte. Dhuinne, bha an ùine as èifeachdaiche timcheall air 100ms - bidh sinn ga dhùnadh agus ga fhosgladh a-rithist chun aon bhòrd. Agus mura h-eil gu leòr de aon shruth againn aig cuid de stùcan, bidh sinn a’ cruinneachadh suas gu ìre shònraichte.

A bharrachd air an sin, fhuair sinn a-mach, airson a leithid de phròifil luchd, gu bheil cruinneachadh sam bith, nuair a thèid clàran a chruinneachadh ann an baidsean, olc. Tha an t-olc clasaigeach INSERT ... VALUES agus 1000 clàr eile. Oir aig an ìre sin tha stùc sgrìobhaidh agad air na meadhanan, agus bidh a h-uile duine eile a tha a’ feuchainn ri rudeigin a sgrìobhadh chun diosc a’ feitheamh.

Gus faighinn cuidhteas a leithid de neo-riaghailteachdan, dìreach na cruinnich dad, na bi a’ bufair idir. Agus ma thachras buffering gu diosc (gu fortanach, leigidh an Stream API ann an Node.js leat faighinn a-mach) - cuir dheth an ceangal seo. Nuair a gheibh thu tachartas gu bheil e saor a-rithist, sgrìobh thuige bhon ciudha cruinnichte. Agus fhad ‘s a tha e trang, thoir an ath fhear an-asgaidh bhon amar agus sgrìobh thuige.

Mus tug sinn a-steach an dòigh-obrach seo airson clàradh dàta, bha timcheall air 4K sgrìobhadh ops, agus san dòigh seo lughdaich sinn an luchd 4 tursan. A-nis tha iad air fàs 6 tursan eile mar thoradh air stòran-dàta sgrùdaichte ùra - suas ri 100MB/s. Agus a-nis bidh sinn a’ stòradh logaichean airson na 3 mìosan mu dheireadh ann an tomhas de mu 10-15TB, an dòchas ann an dìreach trì mìosan gum bi leasaiche sam bith comasach air fuasgladh fhaighinn air duilgheadas sam bith.

Tha sinn a 'tuigsinn nan duilgheadasan

Ach tha dìreach a bhith a 'tional an dàta seo gu lèir math, feumail, buntainneach, ach chan eil gu leòr - feumar a thuigsinn. Leis gu bheil iad sin nam milleanan de phlanaichean eadar-dhealaichte gach latha.

Optimization mòr de cheistean PostgreSQL. Kirill Borovikov (Tensor)

Ach tha na milleanan do-ruigsinneach, feumaidh sinn an toiseach “nas lugha” a dhèanamh. Agus, an toiseach, feumaidh tu co-dhùnadh ciamar a chuireas tu an rud “nas lugha” seo air dòigh.

Tha sinn air trì prìomh phuingean a chomharrachadh:

  • chuir an t-iarrtas so
    Is e sin, bhon tagradh a rinn e “ràinig e”: eadar-aghaidh lìn, backend, siostam pàighidh no rudeigin eile.
  • far a bheil thachair e
    Dè am frithealaiche sònraichte? Oir ma tha grunn luchd-frithealaidh agad fo aon iarrtas, agus gu h-obann tha aon “a’ dol gòrach ”(leis gu bheil an“ diosc grod ”,“ cuimhne air a leigeil a-mach ”, duilgheadas eile), feumaidh tu dèiligeadh gu sònraichte ris an fhrithealaiche.
  • ciamar nochd an duilgheadas ann an dòigh air choreigin

Gus “cò” a chuir iarrtas thugainn a thuigsinn, bidh sinn a’ cleachdadh inneal àbhaisteach - a’ suidheachadh caochladair seisean: SET application_name = '{bl-host}:{bl-method}'; - cuiridh sinn ainm an aoigh loidsig gnìomhachais às a bheil an t-iarrtas a’ tighinn, agus ainm an dòigh no an aplacaid a thòisich e.

Às deidh dhuinn a dhol seachad air “sealbhadair” an iarrtais, feumaidh e a bhith air a chuir a-mach chun log - airson seo bidh sinn a’ rèiteachadh an caochladair log_line_prefix = ' %m [%p:%v] [%d] %r %a'. Dhaibhsan aig a bheil ùidh, is dòcha coimhead anns an leabhar-làimhedè tha e uile a’ ciallachadh. Tha e coltach gu bheil sinn a 'faicinn anns a' log:

  • время
  • aithnichearan pròiseas agus malairt
  • ainm stòr-dàta
  • IP an neach a chuir an t-iarrtas seo
  • agus ainm modh

Optimization mòr de cheistean PostgreSQL. Kirill Borovikov (Tensor)

An uairsin thuig sinn nach eil e glè inntinneach coimhead air a 'cho-dhàimh airson aon iarrtas eadar diofar luchd-frithealaidh. Chan ann tric a tha suidheachadh agad far am bi aon iarrtas a’ sgreuchail suas gu co-ionann an seo agus an sin. Ach eadhon ged a tha e mar an ceudna, thoir sùil air gin de na frithealaichean sin.

Mar sin seo an gearradh "aon fhrithealaiche - aon latha" thionndaidh e a-mach gu robh e gu leòr dhuinn airson mion-sgrùdadh sam bith.

Tha a 'chiad roinn anailis mar an ceudna "sampall" - cruth giorraichte de thaisbeanadh a’ phlana, air fhuadach leis a h-uile comharra àireamhach. Is e an dàrna gearradh an tagradh no an dòigh, agus is e an treas gearradh an nód plana sònraichte a dh’ adhbhraich duilgheadasan dhuinn.

Nuair a ghluais sinn bho shuidheachaidhean sònraichte gu teamplaidean, fhuair sinn dà bhuannachd aig an aon àm:

  • iomadach lùghdachadh anns an àireamh de nithean airson mion-sgrùdadh
    Feumaidh sinn an duilgheadas a sgrùdadh tuilleadh chan ann le mìltean de cheistean no de phlanaichean, ach le dusanan de theamplaidean.
  • loidhne-tìm
    Is e sin, le bhith a’ toirt geàrr-chunntas air na “fìrinnean” ann an earrann sònraichte, faodaidh tu an coltas a thaisbeanadh tron ​​​​latha. Agus an seo tuigidh tu ma tha pàtran de sheòrsa air choreigin agad a thachras, mar eisimpleir, uair san uair, ach bu chòir dha tachairt uair san latha, bu chòir dhut smaoineachadh air dè chaidh ceàrr - cò a dh’ adhbhraich e agus carson, is dòcha gum bu chòir dha a bhith an seo cha bu chòir. Is e seo dòigh sgrùdaidh eile nach eil àireamhach, dìreach lèirsinneach.

Optimization mòr de cheistean PostgreSQL. Kirill Borovikov (Tensor)

Tha na dòighean a tha air fhàgail stèidhichte air na comharran a tharraing sinn bhon phlana: cia mheud uair a thachair a leithid de phàtran, an ùine iomlan agus cuibheasach, cia mheud dàta a chaidh a leughadh bhon diosc, agus cia mheud bho chuimhne ...

Air sgàth, mar eisimpleir, thig thu gu duilleag analytics airson an aoigh, seall - tha rudeigin a 'tòiseachadh a' leughadh cus air an diosg. Chan urrainn dhan diosc air an fhrithealaiche a làimhseachadh - cò leughas bhuaithe?

Agus faodaidh tu a rèiteachadh le colbh sam bith agus co-dhùnadh dè a dhèiligeas tu ris an-dràsta - an luchd air a 'phròiseas no an diosg, no an àireamh iomlan de dh' iarrtasan ... sgaoileadh a-mach dreach ùr den tagradh.
[òraid bhidio]

Agus sa bhad chì thu diofar thagraidhean a thig leis an aon teamplaid bho iarrtas mar SELECT * FROM users WHERE login = 'Vasya'. Frontend, backend, giollachd... Agus saoil carson a leughadh giollachd an neach-cleachdaidh mura h-eil e ag eadar-obrachadh leis.

Is e an dòigh eile a bhith faicinn sa bhad bhon tagradh dè a bhios e a’ dèanamh. Mar eisimpleir, is e an aghaidh seo, seo, seo, agus seo uair san uair (tha an loidhne-tìm a’ cuideachadh). Agus tha a’ cheist ag èirigh sa bhad: tha e coltach nach e obair an aghaidh a th’ ann rudeigin a dhèanamh uair san uair...

Optimization mòr de cheistean PostgreSQL. Kirill Borovikov (Tensor)

Às deidh beagan ùine, thuig sinn gu robh dìth cruinneachadh againn staitistig le nodan plana. Dhealaich sinn bho na planaichean a-mhàin na nodan sin a nì rudeigin le dàta nan clàran fhèin (leugh / sgrìobh iad le clàr-amais no nach eil). Gu dearbh, chan eil ach aon taobh air a chur ris an coimeas ris an dealbh roimhe - cia mheud clàr a thug an nód seo thugainn?, agus cia mheud a chaidh a thilgeil air falbh (Rows Removed by Filter).

Chan eil clàr-amais iomchaidh agad air an truinnsear, bidh thu ag iarraidh air, bidh e ag itealaich seachad air a’ chlàr-amais, a’ tuiteam a-steach do Seq Scan ... tha thu air a h-uile clàr a shìoladh a-mach ach aon. Carson a tha feum agad air 100M de chlàran sìoltachaidh gach latha? Nach eil e nas fheàrr an clàr-amais a roiligeadh suas?

Optimization mòr de cheistean PostgreSQL. Kirill Borovikov (Tensor)

An dèidh mion-sgrùdadh a dhèanamh air na planaichean gu lèir le nód, thuig sinn gu bheil cuid de structaran àbhaisteach anns na planaichean a tha glè choltach a bhith a’ coimhead amharasach. Agus bhiodh e math innse don leasaiche: "Caraid, an seo leugh thu an toiseach le clàr-amais, an uairsin a rèiteachadh, agus an uairsin gearradh dheth" - mar riaghailt, tha aon chlàr ann.

Is dòcha gu bheil a h-uile duine a sgrìobh ceistean air coinneachadh ris a’ phàtran seo: “Thoir dhomh an òrdugh mu dheireadh airson Vasya, an ceann-latha aige.” Agus mura h-eil clàr-amais agad a rèir ceann-latha, no mura bheil ceann-latha sa chlàr-amais a chleachd thu, nì thu sin. ceum air an aon “rake”.

Ach tha fios againn gur e “ràcan” a tha seo - mar sin carson nach innis thu don leasaiche sa bhad dè a bu chòir dha a dhèanamh. A rèir sin, nuair a dh'fhosglas sinn plana a-nis, tha an leasaiche againn sa bhad a 'faicinn dealbh àlainn le molaidhean, far a bheil iad ag innse dha sa bhad: "Tha duilgheadasan agad an seo agus an sin, ach tha iad air am fuasgladh mar seo agus san dòigh sin."

Mar thoradh air an sin, tha an ìre de eòlas a bha a dhìth gus fuasgladh fhaighinn air duilgheadasan aig an toiseach agus a-nis air tuiteam gu mòr. Is e seo an seòrsa inneal a th’ againn.

Optimization mòr de cheistean PostgreSQL. Kirill Borovikov (Tensor)

Source: www.habr.com

Cuir beachd ann