Nnukwu njikarịcha nke ajụjụ PostgreSQL. Kirill Borovikov (Tensor)

Akụkọ ahụ na-egosi ụfọdụ ụzọ na-enye ohere nyochaa arụmọrụ nke ajụjụ SQL mgbe enwere ọtụtụ nde ha kwa ụbọchị, na enwere ọtụtụ narị sava PostgreSQL na-enyocha.

Kedu ihe ngwọta teknuzu na-enye anyị ohere ịhazi ụdị ozi dị otú ahụ nke ọma, oleekwa otú nke a si eme ka ndụ onye mmepụta ihe dị mfe karị?


Ònye nwere mmasị? nyocha nke nsogbu ndị akọwapụtara na usoro njikarịcha dị iche iche Ajuju SQL na idozi nsogbu DBA na-ahụkarị na PostgreSQL - ị nwekwara ike gụọ usoro isiokwu na isiokwu a.

Nnukwu njikarịcha nke ajụjụ PostgreSQL. Kirill Borovikov (Tensor)
Aha m bụ Kirill Borovikov, m na-anọchi anya Ụlọ ọrụ Tensor. Kpọmkwem, m ọkachamara na-arụ ọrụ na ọdụ data na ụlọ ọrụ anyị.

Taa, m ga-agwa gị otú anyị si ebuli ajụjụ, mgbe ị na-adịghị mkpa ka "ịkewapụ iche" arụmọrụ nke otu ajụjụ, ma dozie nsogbu na oke. Mgbe enwere ọtụtụ nde arịrịọ, ma ịchọrọ ịchọta ụfọdụ ụzọ ngwọta nnukwu nsogbu a.

N'ozuzu, Tensor maka otu nde ndị ahịa anyị bụ VLSI bụ ngwa anyị: netwọk mmekọrịta ụlọ ọrụ, ngwọta maka nkwurịta okwu vidiyo, maka ntinye akwụkwọ n'ime na nke mpụga, usoro ndekọ ego maka ndekọ ego na ụlọ nkwakọba ihe, ... Ya bụ, "mega-combine" dị otú ahụ maka njikwa azụmahịa jikọtara ọnụ, nke nwere ihe karịrị 100 dị iche iche. esịtidem oru ngo.

Iji hụ na ha niile na-arụ ọrụ ma na-emepe emepe, anyị nwere ụlọ ọrụ mmepe iri na mba niile, yana ọtụtụ n'ime ha 1000 mmepe.

Anyị na PostgreSQL na-arụ ọrụ kemgbe 2008 wee chịkọta ọnụ ọgụgụ buru ibu nke ihe anyị na-ahazi - data ndị ahịa, ọnụ ọgụgụ, nyocha, data sitere na sistemụ ozi mpụga - karịa 400TB. Enwere ihe dị ka sava 250 na mmepụta naanị, na mkpokọta enwere ihe dị ka sava nchekwa data 1000 anyị na-enyocha.

Nnukwu njikarịcha nke ajụjụ PostgreSQL. Kirill Borovikov (Tensor)

SQL bụ asụsụ nkwupụta. Ị na-akọwa ọ bụghị "otu" ihe kwesịrị ịrụ ọrụ, kama "ihe" ịchọrọ imezu. DBMS maara nke ọma ka esi eme JOIN - otu esi ejikọta tebụl gị, ọnọdụ ndị ị ga-etinye, ihe ga-agafe na index, ihe na-agaghị ...

Ụfọdụ DBMS na-anabata ndụmọdụ: "Mba, jikọọ tebụl abụọ a n'ụdị kwụ n'ahịrị," mana PostgreSQL enweghị ike ime nke a. Nke a bụ ọnọdụ maara nke ọma nke na-eduga ndị mmepe: "Anyị ga-achọ imecha njikarịcha ajụjụ karịa ikwe ka ndị mmepe jiri ụdị ntunye."

Ma, n'agbanyeghị eziokwu na PostgreSQL anaghị ekwe ka "n'èzí" na-achịkwa onwe ya, ọ na-enye ohere nke ọma hụ ihe na-eme n'ime yamgbe ị na-agba ọsọ ajụjụ gị, na ebe ọ na-enwe nsogbu.

Nnukwu njikarịcha nke ajụjụ PostgreSQL. Kirill Borovikov (Tensor)

N'ozuzu, kedu nsogbu kpochapụrụ onye nrụpụta [na DBA] na-abịakarị? “N'ebe a, anyị mezuru arịrịọ ahụ, na ihe niile na-eji nwayọọ na anyị, ihe niile na-ekowe, ihe na-eme...Ụdị nsogbu!”

Ihe kpatara ya na-abụkarị otu:

  • algọridim ajụjụ na-adịghị arụ ọrụ
    Onye nrụpụta: "Ugbu a, m na-enye ya tebụl 10 na SQL site na JOIN ..." - ma na-atụ anya na ọnọdụ ya ga-abụ n'ụzọ ọrụ ebube nke ọma "na-atọpụ" na ọ ga-enweta ihe niile ngwa ngwa. Ma ọrụ ebube adịghị eme, na usoro ọ bụla nwere mgbanwe dị otú ahụ (tebụl 10 na otu SITE) na-enye mgbe niile ụdị njehie. [otu isiokwu]
  • ọnụ ọgụgụ na-adịghị mkpa
    Isi okwu a dị ezigbo mkpa maka PostgreSQL, mgbe ị “wụsara” nnukwu dataset na sava ahụ, rịọ arịrịọ, ọ “sexcanits” mbadamba ụrọ gị. N'ihi na ụnyaahụ e nwere ihe ndekọ 10 na ya, ma taa, e nwere nde 10, ma PostgreSQL amabeghị nke a, anyị kwesịrị ịgwa ya banyere ya. [otu isiokwu]
  • "plug" na akụrụngwa
    Ị wụnyela nnukwu nchekwa data juru na nkesa na-adịghị ike nke na-enweghị diski zuru oke, ebe nchekwa, ma ọ bụ nhazi nhazi. Ma nke ahụ bụ ihe niile ... N'ebe e nwere ụlọ arụ ọrụ n'elu nke ị na-enweghị ike ịwụli elu.
  • igbochi
    Nke a bụ isi ihe siri ike, mana ha kachasị mkpa maka ajụjụ mgbanwe dị iche iche (INSERT, UPDATE, DeleTE) - nke a bụ nnukwu isiokwu dị iche.

Inweta atụmatụ

... Na ihe ọ bụla ọzọ anyị chọrọ atụmatụ! Anyị kwesịrị ịhụ ihe na-eme n'ime ihe nkesa.

Nnukwu njikarịcha nke ajụjụ PostgreSQL. Kirill Borovikov (Tensor)

Atụmatụ ogbugbu ajụjụ maka PostgreSQL bụ osisi nke ajụjụ ogbugbu algọridim na nnọchite ederede. Ọ bụ kpọmkwem algọridim, n'ihi nyocha nke onye na-eme atụmatụ, bụ nke kachasị dị irè.

Ọnụ osisi ọ bụla bụ ọrụ: iweghachite data site na tebụl ma ọ bụ ndeksi, wuo bitmap, ịbanye na tebụl abụọ, ịbanye, na-ejikọta, ma ọ bụ ewepu nhọrọ. Ime ajụjụ gụnyere ịgafe n'ọnụ osisi a.

Iji nweta atụmatụ ajụjụ, ụzọ kachasị mfe bụ imezu nkwupụta ahụ EXPLAIN. Iji nweta njirimara niile dị adị, ya bụ, ịme ajụjụ na ntọala - EXPLAIN (ANALYZE, BUFFERS) SELECT ....

Akụkụ ọjọọ: mgbe ị na-agba ọsọ ya, ọ na-eme "ebe a na ugbu a", n'ihi ya, ọ bụ naanị maka nbibi mpaghara. Ọ bụrụ na ị were ihe nkesa eburu ibu nke dị n'okpuru mgbanwe data siri ike, ị ga-ahụ: "Oh! N'ebe a, anyị nwere igbu egbu ngwa ngwaся arịrịọ." Ọkara elekere, otu elekere gara aga - ka ị na-agba ọsọ ma na-enweta arịrịọ a site na ndekọ, na-eweghachi ya na ihe nkesa, dataset gị niile na ọnụ ọgụgụ gị gbanwere. Ị na-agba ya iji debug - ọ na-agba ọsọ ọsọ ọsọ! Ị pụghịkwa ịghọta ihe kpatara ya, ihe kpatara ya bụ nwayọọ nwayọọ.

Nnukwu njikarịcha nke ajụjụ PostgreSQL. Kirill Borovikov (Tensor)

Iji ghọta ihe mere kpọmkwem n'oge a rịọrọ arịrịọ na ihe nkesa, ndị maara ihe dere modul auto_explain. Ọ dị na ihe fọrọ nke nta ka ọ bụrụ nkesa PostgreSQL niile, enwere ike ịgbalite ya na faịlụ nhazi.

Ọ bụrụ na ọ chọpụta na ụfọdụ arịrịọ na-aga ogologo oge karịa oke ị gwara ya, ọ na-eme ya "Snapshot" nke atụmatụ nke arịrịọ a ma dee ha ọnụ na log.

Nnukwu njikarịcha nke ajụjụ PostgreSQL. Kirill Borovikov (Tensor)

Ihe niile dị ka ọ dị mma ugbu a, anyị na-aga na log na-ahụ ebe ahụ ... [ụkwụ ụkwụ ederede]. Mana anyị enweghị ike ikwu ihe ọ bụla gbasara ya, ma e wezụga eziokwu na ọ bụ atụmatụ magburu onwe ya n'ihi na ọ were 11ms iji gbuo ya.

Ihe niile dị ka ọ dị mma - mana ọ nweghị ihe doro anya ihe mere n'ezie. Ewezuga oge izugbe, anyị anaghị ahụ ihe ọ bụla n'ezie. N'ihi na ilele "nwa atụrụ" dị otú ahụ nke ederede doro anya abụghị ihe a na-ahụ anya.

Ma ọ bụrụgodị na ọ pụtaghị ìhè, ọ bụrụgodị na ọ dị mfe, enwere nsogbu ndị ọzọ dị mkpa:

  • Ọnụ na-egosi Nchikota akụrụngwa nke dum subtree n'okpuru ya. Ya bụ, ị pụghị ịchọpụta naanị oge ejiri na nyocha Index nke a ma ọ bụrụ na enwere ọnọdụ akwụ ụgwọ n'okpuru ya. Anyị ga-eleba anya nke ọma iji hụ ma enwere “ụmụaka” na ọnọdụ mgbanwe, CTE dị n'ime - wee wepụ ihe a niile “n'uche anyị”.
  • Isi okwu nke abụọ: oge ​​egosiri na ọnụ bụ otu ọnụ ọnụ oge igbu oge. Ọ bụrụ na e gburu ọnụ ọnụ a n'ihi, dịka ọmụmaatụ, loop site na ndekọ tebụl ọtụtụ ugboro, mgbe ahụ ọnụ ọgụgụ loops-cycles nke ọnụ a-na-abawanye na atụmatụ ahụ. Mana oge ogbugbu atomic n'onwe ya na-anọgide n'otu n'otu na usoro atụmatụ. Nke ahụ bụ, iji ghọta ogologo oge a rụrụ ọnụ ọnụ a n'ozuzu ya, ịkwesịrị iji otu ihe mụbaa - ọzọ, "n'isi gị."

N'ọnọdụ ndị dị otú ahụ, ghọta "Ònye bụ njikọ kachasị ike?" ọ fọrọ nke nta ka ọ gaghị ekwe omume. Ya mere, ọbụna ndị mmepe onwe ha na-ede na "akwụkwọ ntuziaka" na "Ịghọta atụmatụ bụ nka nke a ga-amụtarịrị, ahụmahụ...".

Mana anyị nwere ndị nrụpụta 1000, ị nweghị ike ibuga ahụmịhe a nye onye ọ bụla n'ime ha. Mụ onwe m, gị, ọ maara, mana onye nọ ebe ahụ amaghịzi. Ma eleghị anya ọ ga-amụta, ma ọ bụ ma eleghị anya, ma ọ kwesịrị ịrụ ọrụ ugbu a - na ebee ka ọ ga-enweta ahụmahụ a?

Nhazi atụmatụ

Ya mere, anyị chọpụtara na iji nagide nsogbu ndị a, anyị kwesịrị ezigbo anya nke atụmatụ. [isiokwu]

Nnukwu njikarịcha nke ajụjụ PostgreSQL. Kirill Borovikov (Tensor)

Anyị buru ụzọ gaa "site n'ahịa" - ka anyị leba anya na ịntanetị ka anyị hụ ihe dị adị.

Ma ọ tụgharịrị na ọ dị ntakịrị ihe ngwọta "dị ndụ" nke na-etolite ma ọ bụ na-eto eto - n'ụzọ nkịtị, naanị otu: nkọwa.depesz.com nke Hubert Lubaczewski dere. Mgbe itinyere n'ọhịa "nri" ihe nnochite anya ederede nke atụmatụ a, ọ na-egosi gị tebụl nwere data atụgharị:

  • oge nhazi ọnụ nke onwe
  • ngụkọta oge maka dum subtree
  • ọnụ ọgụgụ ndekọ ndị ewepụtara nke a tụrụ anya na ọnụ ọgụgụ
  • ọnụ ahụ n'onwe ya

Ọrụ a nwekwara ike ịkekọrịta ebe nchekwa njikọ. Ị tụbara atụmatụ gị n'ebe ahụ wee sị: "Hey, Vasya, nke a bụ njikọ, ọ nwere ihe na-ezighị ezi n'ebe ahụ."

Nnukwu njikarịcha nke ajụjụ PostgreSQL. Kirill Borovikov (Tensor)

Ma enwerekwa obere nsogbu.

Nke mbụ, nnukwu ego nke "opi-paste". Ị na-ewere mpempe akwụkwọ, tinye ya n'ebe ahụ, na ọzọ, na ọzọ.

Nke abuo, enweghị nyocha nke ọnụọgụ data agụ - otu buffers na mmepụta EXPLAIN (ANALYZE, BUFFERS), anyị ahụghị ya ebe a. Ọ maghị ka ọ ga-esi gbasaa ha, ghọta ha ma soro ha rụọ ọrụ. Mgbe ị na-agụ ọtụtụ data wee ghọta na ị nwere ike na-emebi diski na cache ebe nchekwa, ozi a dị ezigbo mkpa.

Isi ihe na-adịghị mma nke atọ bụ mmepe adịghị ike nke ọrụ a. Nkwekọrịta ahụ dị ntakịrị, ọ dị mma ma ọ bụrụ na otu ugboro kwa ọnwa isii, na koodu dị na Perl.

Nnukwu njikarịcha nke ajụjụ PostgreSQL. Kirill Borovikov (Tensor)

Mana nke a niile bụ “abụ abụ”, anyị nwere ike ibi ndụ n'ụzọ ụfọdụ na nke a, mana enwere otu ihe tụpụrụ anyị n'ọrụ a nke ukwuu. Ndị a bụ ihie ụzọ na nyocha nke Okwu Isiokwu nkịtị (CTE) yana ọnụ ọnụ dị iche iche dị ike dị ka InitPlan/SubPlan.

Ọ bụrụ na ị kwenyere na foto a, mgbe ahụ ngụkọta oge ogbugbu nke ọnụ ọnụ onye ọ bụla karịrị oge mmezu nke arịrịọ niile. Ọ dị mfe - Ewepụghị oge ọgbọ nke CTE a na oghere CTE Scan. Ya mere, anyị amaghịzị azịza ziri ezi maka ogologo oge nyocha CTE n'onwe ya were.

Nnukwu njikarịcha nke ajụjụ PostgreSQL. Kirill Borovikov (Tensor)

Mgbe ahụ, anyị chọpụtara na oge eruola ka anyị dee nke anyị - mee ngwa ngwa! Onye nrụpụta ọ bụla na-ekwu: "Ugbu a, anyị ga-ede nke anyị, ọ ga-adị mfe nke ukwuu!"

Anyị ewerela nchịkọta a na-ahụkarị maka ọrụ weebụ: isi dabere na Node.js + Express, Bootstrap na D3.js ejiri mee ihe maka eserese mara mma. Na atụmanya anyị ziri ezi n'ụzọ zuru oke - anyị nwetara ụdị mbụ n'ime izu abụọ:

  • nhazi atụmatụ omenala
    Ya bụ, ugbu a, anyị nwere ike ịtụgharị atụmatụ ọ bụla site na nke PostgreSQL mepụtara.
  • nyocha ziri ezi nke oghere dị ike - Nyocha CTE, InitPlan, SubPlan
  • nyocha nke nkesa buffers - ebe a na-agụ ibe data site na ebe nchekwa, ebe site na cache mpaghara, ebe site na diski
  • nwetara nghọta
    Ka ị ghara "ịgwu" ihe a niile na log, kama ịhụ "njikọ kacha ike" ozugbo na foto a.

Nnukwu njikarịcha nke ajụjụ PostgreSQL. Kirill Borovikov (Tensor)

Anyị nwetara ihe dị ka nke a, na-egosipụta syntax gụnyere. Mana ọ na-abụkarị ndị mmepe anyị anaghị arụ ọrụ na ngosipụta zuru oke nke atụmatụ ahụ, mana yana nke dị mkpụmkpụ. A sị ka e kwuwe, anyị enyochala nọmba niile ma tụba ha n'aka ekpe na aka nri, na n'etiti anyị hapụrụ naanị ahịrị mbụ, ụdị ọnụ ọ bụ: CTE Scan, CTE generation ma ọ bụ Seq Scan dị ka ụfọdụ akara.

Nke a bụ ndebiri nnọchite anya anyị na-akpọ atụmatụ template.

Nnukwu njikarịcha nke ajụjụ PostgreSQL. Kirill Borovikov (Tensor)

Kedu ihe ọzọ ga-adaba adaba? Ọ ga-adaba adaba ịhụ òkè nke ngụkọta oge anyị ekenyela n'ọnụ ọnụ - wee “rapara ya” n'akụkụ. ihe nhazi.

Anyị na-atụ aka na ọnụ ọnụ wee hụ - ọ tụgharịrị na Seq Scan were ihe na-erughị otu ụzọ n'ụzọ anọ nke ngụkọta oge, ma CTE Scan were 3/4 fọdụrụnụ. Ụjọ! Nke a bụ ntakịrị ndetu gbasara “ọnụego ọkụ” nke CTE Scan ma ọ bụrụ na ị na-eji ha arụ ọrụ na ajụjụ gị. Ha anaghị adị ngwa ngwa - ha dị ala ọbụna na nyocha tebụl mgbe niile. [isiokwu] [isiokwu]

Ma na-emekarị eserese ndị dị otú ahụ na-adọrọ mmasị karị, dị mgbagwoju anya, mgbe anyị na-arụtụ aka ozugbo na akụkụ ma hụ, dịka ọmụmaatụ, na ihe karịrị ọkara nke oge ụfọdụ Seq Scan "rie". Ọzọkwa, e nwere ụdị Filter dị n'ime, ọtụtụ ihe ndekọ na-atụfu dị ka ya ... Ị nwere ike ịtụfu foto a ozugbo na onye mmepụta ma kwuo: "Vasya, ihe niile dị njọ maka gị! Chepụta ya, lee - ọ nwere ihe adịghị mma!

Nnukwu njikarịcha nke ajụjụ PostgreSQL. Kirill Borovikov (Tensor)

Dị ka o kwesịrị ịdị, e nwere ụfọdụ “rake” metụtara.

Ihe mbụ anyị hụrụ bụ nsogbu nke okirikiri. A na-egosi oge ọnụ onye ọ bụla n'ime atụmatụ ya na izi ezi nke 1 μs. Na mgbe ọnụ ọgụgụ nke ọnụ cycles gafere, ọmụmaatụ, 1000 - mgbe ogbugbu PostgreSQL kewara "n'ime ziri ezi", mgbe na-agbakọ azụ anyị na-enweta ngụkọta oge "ebe n'etiti 0.95ms na 1.05ms". Mgbe ọnụọgụ ahụ na-aga na microseconds, nke ahụ dị mma, ma mgbe ọ dịlarị [milli] sekọnd, ị ga-eburu ozi a n'uche mgbe ị na-ewepụ ihe onwunwe na ọnụ nke atụmatụ "onye riri ego ole".

Nnukwu njikarịcha nke ajụjụ PostgreSQL. Kirill Borovikov (Tensor)

Isi ihe nke abụọ, nke siri ike karị, bụ nkesa nke akụrụngwa (ihe nchekwa ndị ahụ) n'etiti ọnụ ọnụ dị ike. Nke a riri anyị izu abụọ mbụ nke prototype gbakwunyere izu anọ ọzọ.

Ọ dị mfe ịnweta ụdị nsogbu a - anyị na-eme CTE wee gụọ ihe dị na ya. N'ezie, PostgreSQL bụ "maara" na ọ gaghị agụ ihe ọ bụla ozugbo ebe ahụ. Mgbe ahụ, anyị na-ewere ndekọ mbụ na ya, na ya otu narị na mbụ otu site na otu CTE.

Nnukwu njikarịcha nke ajụjụ PostgreSQL. Kirill Borovikov (Tensor)

Anyị na-eleba anya na atụmatụ a wee ghọta - ọ bụ ihe ijuanya, anyị nwere 3 buffers (data ibe) "rie" na Seq Scan, 1 ọzọ na CTE Scan, na 2 ọzọ na CTE Scan nke abụọ. Ya bụ, ọ bụrụ na anyị chịkọta ihe niile, anyị ga-enweta 6, mana site na mbadamba ihe anyị na-agụ naanị 3! CTE Scan anaghị agụ ihe ọ bụla site na ebe ọ bụla, mana ọ na-arụ ọrụ ozugbo na ebe nchekwa usoro. Ya bụ, ihe doro anya na ọ na-ezighị ezi ebe a!

N'ezie, ọ na-apụta na ebe a bụ ibe 3 nke data a rịọrọ site na Seq Scan, nke mbụ jụrụ maka 1st CTE Scan, na mgbe ahụ nke abụọ, na 1 ọzọ ka a gụrụ ya. Agụpụtara data ibe 2, ọ bụghị 2.

Nnukwu njikarịcha nke ajụjụ PostgreSQL. Kirill Borovikov (Tensor)

Na foto a mere ka anyị ghọta na ogbugbu nke atụmatụ abụghịzi osisi, kama ọ bụ naanị ụdị eserese acyclic. Anyị nwetakwara eserese dị ka nke a, ka anyị wee ghọta “ihe si ebe mbụ bịa.” Ya bụ, ebe a ka anyị mepụtara CTE site na pg_class, wee rịọ maka ya ugboro abụọ, na ihe fọrọ nke nta ka ọ bụrụ oge anyị niile ejirila na alaka ụlọ ọrụ mgbe anyị rịọrọ maka ya nke abụọ. O doro anya na ịgụ ihe ntinye 2st dị oke ọnụ karịa naanị ịgụ ihe ntinye 101 na mbadamba.

Nnukwu njikarịcha nke ajụjụ PostgreSQL. Kirill Borovikov (Tensor)

Anyị kupụrụ ume ruo oge ụfọdụ. Ha sịrị: “Ugbu a, Neo, ị ma kung fu! Ugbu a ahụmịhe anyị dị na ihuenyo gị. Ugbu a ị nwere ike iji ya." [isiokwu]

Nchịkọta ndekọ

Ndị mmepe 1000 anyị na-eku ume ume. Mana anyị ghọtara na anyị nwere naanị narị narị sava “ọgụ”, na “copy-paste” niile nke ndị mmepe adịghị adaba ma ọlị. Anyị ghọtara na anyị ga-anakọta ya n'onwe anyị.

Nnukwu njikarịcha nke ajụjụ PostgreSQL. Kirill Borovikov (Tensor)

N'ozuzu, e nwere ọkọlọtọ ọkọlọtọ nke nwere ike ịnakọta ọnụ ọgụgụ, Otú ọ dị, ọ dịkwa mkpa ka ọ rụọ ọrụ na nhazi - nke a. modul pg_stat_statements. Ma o kweghị anyị.

Mbụ, ọ na-ekenye otu ajụjụ site na iji atụmatụ dị iche iche n'ime otu nchekwa data QueryIds dị iche iche. Ya bụ, ọ bụrụ na i bu ụzọ mee ya SET search_path = '01'; SELECT * FROM user LIMIT 1;ma SET search_path = '02'; na otu arịrịọ ahụ, mgbe ahụ, ọnụ ọgụgụ nke modul a ga-enwe ndekọ dị iche iche, na agaghị m enwe ike ịnakọta ọnụ ọgụgụ n'ozuzu kpọmkwem na ọnọdụ nke profaịlụ arịrịọ a, na-enweghị n'uche atụmatụ.

Isi ihe nke abụọ gbochiri anyị iji ya bụ enweghị atụmatụ. Ya bụ, enweghị atụmatụ, enwere naanị arịrịọ n'onwe ya. Anyị na-ahụ ihe na-ebelata, ma anyị aghọtaghị ihe kpatara ya. Na ebe a anyị laghachi na nsogbu nke a ngwa ngwa na-agbanwe dataset.

Na oge ikpeazụ - enweghị "eziokwu". Ya bụ, ị nweghị ike ileba anya n'otu ihe atụ nke mmezu ajụjụ - ọ nweghị nke ọ bụla, enwere naanị nchịkọta chịkọtara. Ọ bụ ezie na ọ ga-ekwe omume ịrụ ọrụ na nke a, ọ bụ nnọọ ihe siri ike.

Nnukwu njikarịcha nke ajụjụ PostgreSQL. Kirill Borovikov (Tensor)

Ya mere, anyị kpebiri ịlụ ọgụ copy-paste wee malite ide ihe onye nchikota.

Onye na-anakọta na-ejikọta site na SSH, guzobe njikọ echekwara na ihe nkesa na nchekwa data site na iji akwụkwọ, na tail -F "na-arapara" ya na faịlụ log. Yabụ na nnọkọ a anyị na-enweta "enyo" zuru oke nke faịlụ ndekọ niile, nke ihe nkesa na-emepụta. Ibu dị na ihe nkesa n'onwe ya dị ntakịrị, n'ihi na anyị anaghị atụgharị ihe ọ bụla n'ebe ahụ, anyị na-egosipụta naanị okporo ụzọ.

Ebe ọ bụ na anyị amalitelarị ide ihe ntanetị na Node.js, anyị gara n'ihu na-ede onye nchịkọta na ya. Na nkà na ụzụ a kwadoro onwe ya, n'ihi na ọ dị mfe iji Javascript rụọ ọrụ na data ederede na-adịghị ike, nke bụ log. Na akụrụngwa Node.js n'onwe ya dị ka ikpo okwu azụ azụ na-enye gị ohere iji njikọ netwọkụ rụọ ọrụ n'ụzọ dị mfe yana n'ezie na iyi data ọ bụla.

N'ihi ya, anyị "na-agbatị" njikọ abụọ: nke mbụ 'na-ege ntị' na log n'onwe ya ma were ya n'onwe anyị, na nke abụọ na-ajụ mgbe ụfọdụ isi. "Ma ndekọ na-egosi na egbochiri akara na oid 123," ma nke a apụtaghị ihe ọ bụla nye onye mmepụta, ọ ga-adị mma ịjụ nchekwa data, "Gịnị bụ OID = 123?" Ya mere, anyị na-ajụkarị isi ihe anyị na-amabeghị banyere onwe anyị.

Nnukwu njikarịcha nke ajụjụ PostgreSQL. Kirill Borovikov (Tensor)

"E nwere naanị otu ihe ị na-atụghị anya ya, e nwere ụdị aṅụ dị ka enyí! ..." Anyị malitere ịmepụta usoro a mgbe anyị chọrọ nyochaa sava 10. Nke kachasị mkpa na nghọta anyị, ebe nsogbu ụfọdụ bilitere nke siri ike ịnagide. Ma n'ime nkeji iri na ise mbụ, anyị nwetara otu narị maka nlekota oru - n'ihi na usoro ahụ na-arụ ọrụ, onye ọ bụla chọrọ ya, onye ọ bụla nwere ahụ iru ala.

Ihe a niile kwesiri ka agbakwunye ya, data data buru ibu ma na-arụ ọrụ. N'ezie, ihe anyị na-enyocha, ihe anyị nwere ike imeri, bụ ihe anyị na-eji. Anyị na-ejikwa PostgreSQL dịka nchekwa data. Ọ dịghịkwa ihe dị ngwa ngwa "ịwụsa" data n'ime ya karịa onye ọrụ COPY Ọbụbeghị.

Mana naanị "ịwụsa" data abụghị n'ezie teknụzụ anyị. N'ihi na ọ bụrụ na ị nwere ihe dị ka 50k arịrịọ kwa sekọnd na otu narị sava, nke a ga-ewepụta 100-150GB nke ndekọ kwa ụbọchị. Ya mere, anyị kwesịrị iji nlezianya "bee" isi.

Nke mbụ, anyị mere nkewa kwa ụbọchị, n'ihi na, n'ozuzu, ọ dịghị onye nwere mmasị na mmekọrịta n'etiti ụbọchị. Kedu ihe dị iche na-eme ihe ị nwere ụnyaahụ, ma ọ bụrụ n'abalị a ị wepụrụ ụdị ngwa ọhụrụ - yana ugbua ụfọdụ ọnụ ọgụgụ ọhụrụ.

Nke abụọ, anyị mụtara (a manyere) dị nnọọ ngwa ngwa iji dee COPY. Ya bụ, ọ bụghị naanị COPYn'ihi na ọ na-agba ọsọ karịa INSERT, na ọbụna ngwa ngwa.

Nnukwu njikarịcha nke ajụjụ PostgreSQL. Kirill Borovikov (Tensor)

Isi ihe nke atọ - aghaghị m hapụ ihe na-akpalite, otu, na igodo mba ọzọ. Ya bụ, anyị enweghị iguzosi ike n'ezi ihe ma ọlị. N'ihi na ọ bụrụ na ị nwere tebụl nke nwere FK abụọ, ma ị na-ekwu na nhazi nchekwa data na "ebe a bụ ndekọ ndekọ nke FK na-ezo aka, dịka ọmụmaatụ, na otu ndekọ," mgbe ahụ, mgbe itinye ya, PostgreSQL. o nweghi ihe fọduru ma ka esi ewere ya were ezi-okwu SELECT 1 FROM master_fk1_table WHERE ... na njirimara ị na-achọ itinye - naanị iji lelee na ndekọ a dị ebe ahụ, ka ị ghara 'gbajie' igodo mba ofesi na ntinye gị.

Kama otu ndekọ na tebụl ezubere iche na ndenye ndepụta ya, anyị na-enweta uru agbakwunyere nke ịgụ na tebụl niile ọ na-ezo aka. Mana anyị achọghị nke a ma ọlị - ọrụ anyị bụ idekọ dị ka o kwere mee yana ngwa ngwa o kwere mee na obere ibu. Yabụ FK - gbadaa!

Isi ihe na-esote bụ mkpokọta na hashing. Na mbụ, anyị etinyere ha na nchekwa data - mgbe niile, ọ dị mma ozugbo, mgbe ndekọ rutere, mee ya n'ụdị mbadamba. "gbakwunyere otu" ziri ezi na mkpalite. Ọfọn, ọ dị mma, ma otu ihe ọjọọ ahụ - ị na-etinye otu ndekọ, ma na-amanye ịgụ na dee ihe ọzọ site na tebụl ọzọ. Ọzọkwa, ọ bụghị naanị na ị na-agụ ma na-ede, ị na-emekwa ya mgbe ọ bụla.

Ugbu a were ya na ị nwere tebụl nke ị na-agụ naanị ọnụ ọgụgụ arịrịọ ndị gafere n'aka otu onye ọbịa: +1, +1, +1, ..., +1. Ma gị onwe gị, n'ụkpụrụ, ị chọghị nke a - ọ ga-ekwe omume nchikota na ebe nchekwa na onye na-anakọta ma ziga na nchekwa data n'otu oge +10.

Ee, n'ọnọdụ ụfọdụ, iguzosi ike n'ezi ihe gị nwere ike "daba", mana nke a bụ ikpe na-enweghị isi - n'ihi na ị nwere ihe nkesa nkịtị, ọ nwere batrị na njikwa, ị nwere ndekọ azụmahịa, log na Sistemụ faịlụ ... N'ozuzu, ọ bụghị uru ya. Ọnwụ nke arụpụtaghị ihe ị na-enweta site na ihe na-akpali akpali/FK abaghị uru ego ị na-enweta.

Otú ahụ ka ọ dịkwa na hashing. Arịrịọ ụfọdụ na-efega gị, ị gbakọọ ụfọdụ njirimara site na ya na nchekwa data, dee ya na nchekwa data wee gwa ya onye ọ bụla. Ihe niile dị mma ruo mgbe, n'oge ndekọ, onye nke abụọ na-abịakwute gị nke chọrọ ịdekọ otu ihe ahụ - na ị ga-egbochi ya, nke a adịlarị njọ. Ya mere, ọ bụrụ na ị nwere ike ịnyefe ọgbọ nke ụfọdụ ID na onye ahịa (ihe metụtara nchekwa data), ọ ka mma ime nke a.

O zuru oke maka anyị iji MD5 site na ederede - arịrịọ, atụmatụ, ndebiri, ... Anyị na-agbakọ ya n'akụkụ onye nchịkọta, wee "wunye" ID dị njikere n'ime nchekwa data. Ogologo MD5 na nkewa kwa ụbọchị na-enye anyị ohere ka anyị ghara ichegbu onwe ha maka nkuko nwere ike ime.

Nnukwu njikarịcha nke ajụjụ PostgreSQL. Kirill Borovikov (Tensor)

Mana ka ịdekọ ihe a niile ngwa ngwa, anyị kwesịrị ịgbanwe usoro ndekọ ahụ n'onwe ya.

Kedu ka esi ede data? Anyị nwere ụdị dataset, anyị kewara ya na tebụl dị iche iche, wee depụta ya - nke mbụ n'ime nke mbụ, wee banye nke abụọ, banye na nke atọ ... Ọ dịghị mma, n'ihi na ọ dị ka anyị na-ede otu iyi data na nzọụkwụ atọ. n'usoro. adịghị mma. Enwere ike ime ya ngwa ngwa? Nwere ike!

Iji mee nke a, ọ bụ naanị iji decompose ndị a na-asọpụta n'otu n'otu. Ọ na-apụta na anyị nwere njehie, arịrịọ, ndebiri, mgbochi, ... na-efe efe na eriri dị iche iche - anyị na-edekwa ya niile n'otu. Zuru oke maka nke a Debe ọwa COPY na-emeghe mgbe niile maka tebụl ebumnuche onye ọ bụla.

Nnukwu njikarịcha nke ajụjụ PostgreSQL. Kirill Borovikov (Tensor)

Ya bụ, na onye nchịkọta mmiri na-adị mgbe niile, nke m nwere ike ide data m chọrọ n'ime ya. Mana ka nchekwa data wee hụ data a, ma mmadụ agaghị arapara na-eche ka e dee data a, A ga-akwụsịrịrị COPY n'oge ụfọdụ. Maka anyị, oge kachasị dị irè bụ ihe dịka 100ms - anyị na-emechi ya ma meghee ya ozugbo na otu tebụl. Ma ọ bụrụ na anyị enweghị ezuru otu eruba n'oge ụfọdụ ọnụ ọgụgụ kasị elu, mgbe ahụ, anyị na-agbakọta ruo a ụfọdụ ókè.

Ọzọkwa, anyị chọpụtara na maka profaịlụ ibu dị otú ahụ, nchịkọta ọ bụla, mgbe a na-anakọta ihe ndekọ na batches, dị njọ. Omuma ọjọọ bụ INSERT ... VALUES na ihe ndekọ 1000 ọzọ. N'ihi na n'oge ahụ ị nwere ọnụ ọgụgụ kachasị elu na mgbasa ozi, na onye ọ bụla na-agbalị ide ihe na diski ga-echere.

Iji kpochapụ nsogbu ndị dị otú ahụ, naanị achịkọtala ihe ọ bụla. echekwala ma ọlị. Ma ọ bụrụ na nchikota diski emee (ọ dabara nke ọma, API Stream na Node.js na-enye gị ohere ịchọpụta) - yigharịrị njikọ a. Mgbe ị nwetara mmemme na ọ bụ n'efu ọzọ, degara ya n'ahịrị agbakọbara. Ma ka ọ na-arụsi ọrụ ike, were nke ọzọ n'efu site na ọdọ mmiri wee degara ya akwụkwọ.

Tupu iwebata usoro a na ndekọ data, anyị nwere ihe dị ka 4K dee ops, n'ụzọ dị otú a, anyị belatara ibu ahụ ugboro anọ. Ugbu a, ha etoola ugboro 4 ọzọ n'ihi ọdụ data nyocha ọhụrụ - ruo 6MB / s. Ma ugbu a, anyị na-echekwa ndekọ maka ọnwa 100 gara aga n'ihe dị ka 3-10TB, na-atụ anya na n'ime ọnwa atọ ọ bụla onye mmepụta ga-enwe ike dozie nsogbu ọ bụla.

Anyị ghọtara nsogbu ndị ahụ

Mana naanị ịnakọta data a niile dị mma, bara uru, bara uru, mana ezughị oke - ọ dị mkpa ka a ghọta ya. N'ihi na ndị a bụ nde atụmatụ dị iche iche kwa ụbọchị.

Nnukwu njikarịcha nke ajụjụ PostgreSQL. Kirill Borovikov (Tensor)

Mana ọtụtụ nde mmadụ enweghị ike ịchịkwa, anyị ga-ebu ụzọ mee “obere”. Na, nke mbụ, ịkwesịrị ikpebi otú ị ga-esi hazie ihe a "obere".

Anyị achọpụtala isi ihe atọ:

  • onye zitere arịrịọ a
    Nke ahụ bụ, site na ngwa ngwa ọ 'bịarutere': interface webụ, azụ azụ, usoro ịkwụ ụgwọ ma ọ bụ ihe ọzọ.
  • ebe o mere
    Na ihe nkesa kpọmkwem? N'ihi na ọ bụrụ na ị nwere ọtụtụ sava n'okpuru otu ngwa, na mberede, otu "na-aga nzuzu" (n'ihi na "diski bụ rere ure", "memory leaked", ụfọdụ nsogbu ọzọ), mgbe ahụ, ị ​​chọrọ kpọmkwem lebara ihe nkesa.
  • otú nsogbu ahụ gosipụtara onwe ya n'otu ụzọ ma ọ bụ ọzọ

Iji ghọta “onye” zitere anyị arịrịọ, anyị na-eji ngwa ọkọlọtọ-ịtọpụta mgbanwe oge: SET application_name = '{bl-host}:{bl-method}'; - anyị na-eziga aha nke azụmahịa mgbagha onye ọbịa nke arịrịọ na-abịa, na aha nke usoro ma ọ bụ ngwa na butere ya.

Mgbe anyị gafere "onye nwe" nke arịrịọ ahụ, ọ ga-abụrịrị mmepụta na log - maka nke a anyị na-ahazi mgbanwe ahụ. log_line_prefix = ' %m [%p:%v] [%d] %r %a'. Maka ndị nwere mmasị, ikekwe lee anya n'akwụkwọ ntuziakakedu ihe ọ pụtara. Ọ tụgharịrị na anyị na-ahụ na log:

  • время
  • usoro na njirimara azụmahịa
  • aha nchekwa data
  • IP nke onye zitere arịrịọ a
  • na aha usoro

Nnukwu njikarịcha nke ajụjụ PostgreSQL. Kirill Borovikov (Tensor)

Mgbe ahụ, anyị ghọtara na ọ bụghị ihe na-adọrọ mmasị ile anya na njikọ maka otu arịrịọ n'etiti sava dị iche iche. Ọ bụghị mgbe niile ka ị na-enwe ọnọdụ ebe otu ngwa na-adaba n'otu ebe ebe a. Ma ọ bụrụgodị na ọ bụ otu ihe ahụ, lee anya na nke ọ bụla n'ime sava ndị a.

Ya mere, ebe a bụ ịkpụ "Otu ihe nkesa - otu ụbọchị" ọ tụgharịrị na-ezuru anyị maka nyocha ọ bụla.

Akụkụ nyocha nke mbụ bụ otu ihe ahụ "Sample" - ụdị nbibiri nke ngosi nke atụmatụ, kpochapụrụ ihe ngosi ọnụọgụ niile. Nke abụọ ịkpụ bụ ngwa ma ọ bụ usoro, na nke atọ ịkpụ bụ kpọmkwem ọnụ ọnụ atụmatụ nke kpatara anyị nsogbu.

Mgbe anyị si n'ụkpụrụ ụfọdụ gaa na ndebiri, anyị nwetara uru abụọ n'otu oge:

  • otutu mbelata na ọnụ ọgụgụ nke ihe maka nyocha
    Anyị ga-enyocha nsogbu ahụ abụghịzị site na puku kwuru puku ajụjụ ma ọ bụ atụmatụ, kama site na ọtụtụ ndebiri.
  • usoro iheomume
    Ya bụ, site n'ịchịkọta "eziokwu" n'ime akụkụ ụfọdụ, ị nwere ike igosipụta ọdịdị ha n'ụbọchị. Na ebe a ị nwere ike ịghọta na ọ bụrụ na ị nwere ụdị ụdị nke na-eme, dịka ọmụmaatụ, otu ugboro n'otu awa, ma ọ kwesịrị ime otu ugboro n'ụbọchị, ị kwesịrị iche echiche banyere ihe na-ezighị ezi - onye kpatara ya na ihe kpatara ya, ma eleghị anya, ọ ga-abụ ebe a. ekwesịghị. Nke a bụ usoro nyocha ọzọ na-abụghị ọnụọgụgụ, naanị anya, usoro nyocha.

Nnukwu njikarịcha nke ajụjụ PostgreSQL. Kirill Borovikov (Tensor)

Ụzọ ndị fọdụrụ na-adabere na ihe ndị na-egosi anyị na-ewepụ na atụmatụ ahụ: ugboro ole ụdị usoro a mere, ngụkọta oge na nkezi oge, ole data agụpụtara na diski, na ole site na ebe nchekwa ...

N'ihi na, dịka ọmụmaatụ, ị na-abịa na ibe nyocha maka onye ọbịa, lee - ihe na-amalite ịgụ nke ukwuu na diski. Disk dị na ihe nkesa enweghị ike ijikwa ya - onye na-agụ ya?

Ma ị nwere ike hazie site na kọlụm ọ bụla wee kpebie ihe ị ga-eme ugbu a - ibu dị na processor ma ọ bụ diski, ma ọ bụ ọnụ ọgụgụ nke arịrịọ ... Anyị na-edozi ya, lelee ndị "n'elu", dozie ya na ewepụtara ụdị ngwa ọhụrụ a.
[ihe nkuzi vidiyo]

Na ozugbo ị nwere ike ịhụ ngwa dị iche iche na-abịa na otu template site na arịrịọ dị ka SELECT * FROM users WHERE login = 'Vasya'. Frontend, backend, nhazi... Ma ị na-eche ihe kpatara nhazi ga-eji gụọ onye ọrụ ma ọ bụrụ na ya na ya adịghị emekọrịta ihe.

Ụzọ ndị ọzọ bụ ịhụ ozugbo site na ngwa ihe ọ na-eme. Dịka ọmụmaatụ, ihu ihu bụ nke a, nke a, nke a, na nke a otu ugboro n'otu awa (usoro iheomume na-enyere aka). Na ajụjụ na-ebilite ozugbo: ọ dị ka ọ bụghị ọrụ nke frontend ime ihe otu ugboro n'otu awa ...

Nnukwu njikarịcha nke ajụjụ PostgreSQL. Kirill Borovikov (Tensor)

Mgbe oge ụfọdụ gasịrị, anyị chọpụtara na anyị enweghị nchịkọta ọnụ ọgụgụ site na ọnụ ọgụgụ atụmatụ. Anyị kewapụrụ atụmatụ naanị ndị ọnụ na-eme ihe na data nke tebụl n'onwe ha (gụọ / dee ha site index ma ọ bụ). N'ezie, naanị otu akụkụ ka agbakwunyere na foto gara aga - Ndekọ ole ka ọnụ ọnụ a wetara anyị?, na ole ka a tụfuru (Ahịhịa wepụrụ site na nzacha).

Ị nweghị index kwesịrị ekwesị na efere ahụ, ị ​​​​na-arịọ ya arịrịọ, ọ na-efefe na-agafe index, dabara na Seq Scan ... ị ehichapụla ihe ndekọ niile ma e wezụga otu. Kedu ihe kpatara ị ga-eji chọọ ndekọ 100M nzacha kwa ụbọchị?

Nnukwu njikarịcha nke ajụjụ PostgreSQL. Kirill Borovikov (Tensor)

Mgbe anyị tụlechara ọnụ ọnụ atụmatụ niile site na ọnụ, anyị chọpụtara na e nwere ụfọdụ ihe arụrụ arụ n'ime atụmatụ ndị nwere ike ịdị na-enyo enyo. Ọ ga-adị mma ịgwa onye mmepụta: "Enyi, ebe a ka ị na-ebu ụzọ gụọ site na index, wee dozie, wee bepụ" - dịka iwu, e nwere otu ndekọ.

Onye ọ bụla nke dere ajụjụ nwere ike ịhụ ụkpụrụ a: "Nye m usoro ikpeazụ maka Vasya, ụbọchị ya." kwụpụ n'otu aka ahụ "ịza" .

Ma anyị maara na nke a bụ "rake" - ya mere, ị gaghị agwa onye mmepụta ozugbo ihe ọ ga-eme. N'ihi ya, mgbe ị na-emepe atụmatụ ugbu a, onye nrụpụta anyị na-ahụ foto mara mma ozugbo na ndụmọdụ, ebe ha na-agwa ya ozugbo: "Ị nwere nsogbu ebe a na ebe ahụ, ma a na-edozi ha n'ụzọ dị otú a."

N'ihi ya, ọnụọgụ ahụmahụ dị mkpa iji dozie nsogbu na mmalite na ugbu a agbadala nke ukwuu. Nke a bụ ụdị ngwá ọrụ anyị nwere.

Nnukwu njikarịcha nke ajụjụ PostgreSQL. Kirill Borovikov (Tensor)

isi: www.habr.com

Tinye a comment