Imudara pupọ ti awọn ibeere PostgreSQL. Kirill Borovikov (Tensor)

Ijabọ naa ṣafihan diẹ ninu awọn ọna ti o gba laaye ṣe atẹle iṣẹ ti awọn ibeere SQL nigbati awọn miliọnu wọn wa fun ọjọ kan, ati pe awọn ọgọọgọrun ti awọn olupin PostgreSQL abojuto wa.

Awọn solusan imọ-ẹrọ wo ni o gba wa laaye lati ṣakoso iru iwọn didun alaye daradara, ati bawo ni eyi ṣe jẹ ki igbesi aye ti olupilẹṣẹ lasan rọrun?


Tani o nife? igbekale ti kan pato isoro ati orisirisi ti o dara ju imuposi Awọn ibeere SQL ati yanju awọn iṣoro DBA aṣoju ni PostgreSQL - o tun le ka kan lẹsẹsẹ ti ìwé lori koko yii.

Imudara pupọ ti awọn ibeere PostgreSQL. Kirill Borovikov (Tensor)
Orukọ mi ni Kirill Borovikov, Mo ṣe aṣoju Tensor ile-iṣẹ. Ni pataki, Mo ṣe amọja ni ṣiṣẹ pẹlu awọn apoti isura data ni ile-iṣẹ wa.

Loni Emi yoo sọ fun ọ bi a ṣe mu awọn ibeere pọ si, nigbati o ko nilo lati “mu lọtọ” iṣẹ ti ibeere kan, ṣugbọn yanju iṣoro naa ni ọpọ. Nigbati awọn miliọnu awọn ibeere ba wa, ati pe o nilo lati wa diẹ ninu yonuso si ojutu isoro nla yii.

Ni gbogbogbo, Tensor fun miliọnu ti awọn alabara wa jẹ VLSI jẹ ohun elo wa: Nẹtiwọọki awujọ ajọṣepọ, awọn solusan fun ibaraẹnisọrọ fidio, fun ṣiṣan iwe inu ati ita, awọn ọna ṣiṣe iṣiro fun iṣiro ati awọn ile itaja,... Iyẹn ni, iru “mega-combine” fun iṣakoso iṣowo iṣọpọ, ninu eyiti o wa diẹ sii ju 100 ti o yatọ. ti abẹnu ise agbese.

Lati rii daju pe gbogbo wọn ṣiṣẹ ati idagbasoke ni deede, a ni awọn ile-iṣẹ idagbasoke 10 jakejado orilẹ-ede, pẹlu diẹ sii ninu wọn 1000 kóòdù.

A ti n ṣiṣẹ pẹlu PostgreSQL lati ọdun 2008 ati pe a ti ṣajọpọ iye nla ti ohun ti a ṣe ilana - data alabara, iṣiro, itupalẹ, data lati awọn eto alaye ita - diẹ ẹ sii ju 400TB. Awọn olupin 250 wa ni iṣelọpọ nikan, ati ni apapọ awọn olupin data 1000 wa ti a ṣe atẹle.

Imudara pupọ ti awọn ibeere PostgreSQL. Kirill Borovikov (Tensor)

SQL jẹ ede asọye. O ṣe apejuwe kii ṣe "bii" ohun kan yẹ ki o ṣiṣẹ, ṣugbọn "kini" ti o fẹ lati ṣaṣeyọri. DBMS mọ dara julọ bi o ṣe le ṣe JOIN - bii o ṣe le so awọn tabili rẹ pọ, awọn ipo wo lati fa, kini yoo lọ nipasẹ atọka, kini kii yoo…

Diẹ ninu awọn DBMS gba awọn imọran: “Rara, so awọn tabili meji wọnyi pọ ni iru ati iru isinyi,” ṣugbọn PostgreSQL ko le ṣe eyi. Eyi ni ipo mimọ ti awọn olupilẹṣẹ oludari: “A yoo kuku pari imudara ibeere ju gbigba awọn olupolowo laaye lati lo iru awọn imọran.”

Ṣugbọn, botilẹjẹpe otitọ pe PostgreSQL ko gba laaye “ita” lati ṣakoso ararẹ, o gba laaye ni pipe wo ohun ti n ṣẹlẹ ninu rẹnigbati o ba ṣiṣe ibeere rẹ, ati ibi ti o ti ni awọn iṣoro.

Imudara pupọ ti awọn ibeere PostgreSQL. Kirill Borovikov (Tensor)

Ni gbogbogbo, awọn iṣoro Ayebaye wo ni olupilẹṣẹ kan [si DBA] nigbagbogbo wa pẹlu? “Nibi a mu ibeere naa ṣẹ, ati ohun gbogbo ni o lọra pẹlu wa, ohun gbogbo ti wa ni rọle, ohun kan n ṣẹlẹ... Iru wahala kan!"

Awọn idi jẹ fere nigbagbogbo kanna:

  • aisekokari ìbéèrè alugoridimu
    Olùgbéejáde: "Nisisiyi Mo n fun u ni awọn tabili 10 ni SQL nipasẹ JOIN ..." - ati pe o nireti pe awọn ipo rẹ yoo jẹ iṣẹ-iyanu ti o munadoko "ti a ko tii" ati pe oun yoo gba ohun gbogbo ni kiakia. Ṣugbọn awọn iyanu ko ṣẹlẹ, ati eyikeyi eto pẹlu iru iyipada (10 tabili ninu ọkan LATI) nigbagbogbo yoo fun diẹ ninu awọn Iru aṣiṣe. [nkan]
  • ti igba atijọ statistiki
    Ojuami yii jẹ pataki ni pataki fun PostgreSQL, nigbati o ba “tu” dataset nla kan sori olupin naa, ṣe ibeere kan, ati pe o “sexcanits” tabulẹti rẹ. Nitori lana awọn igbasilẹ 10 wa ninu rẹ, ati loni o wa 10 milionu, ṣugbọn PostgreSQL ko ti mọ eyi, ati pe a nilo lati sọ nipa rẹ. [nkan]
  • "plug" lori oro
    O ti fi aaye data nla ati ti kojọpọ sori olupin ti ko lagbara ti ko ni disk to, iranti, tabi iṣẹ ero isise. Ati pe iyẹn ni gbogbo rẹ ... Ibikan ni aja iṣẹ kan wa loke eyiti o ko le fo mọ.
  • ìdènà
    Eyi jẹ aaye ti o nira, ṣugbọn wọn ṣe pataki julọ fun ọpọlọpọ awọn ibeere iyipada (FI sii, Imudojuiwọn, Paarẹ) - eyi jẹ koko-ọrọ nla lọtọ.

Ngba eto

... Ati fun ohun gbogbo miiran a nilo ètò! A nilo lati wo ohun ti n ṣẹlẹ inu olupin naa.

Imudara pupọ ti awọn ibeere PostgreSQL. Kirill Borovikov (Tensor)

Eto ipaniyan ibeere kan fun PostgreSQL jẹ igi ti ibeere ṣiṣe alugoridimu ni aṣoju ọrọ. O jẹ deede algorithm ti, bi abajade ti itupalẹ nipasẹ oluṣeto, ni a rii pe o munadoko julọ.

Ipin igi kọọkan jẹ iṣẹ ṣiṣe: gbigba data pada lati tabili tabi atọka, kikọ bitmap kan, didapọpọ awọn tabili meji, didapọ, sisọpọ, tabi laisi awọn yiyan. Ṣiṣe ibeere kan jẹ ririn nipasẹ awọn apa ti igi yii.

Lati gba ero ibeere naa, ọna ti o rọrun julọ ni lati ṣiṣẹ alaye naa EXPLAIN. Lati gba pẹlu gbogbo awọn abuda gidi, iyẹn ni, lati ṣe ibeere gangan lori ipilẹ - EXPLAIN (ANALYZE, BUFFERS) SELECT ....

Apa buburu: nigbati o ba ṣiṣẹ, o ṣẹlẹ “nibi ati ni bayi”, nitorinaa o dara nikan fun n ṣatunṣe aṣiṣe agbegbe. Ti o ba mu olupin ti kojọpọ pupọ ti o wa labẹ ṣiṣan agbara ti awọn iyipada data, ati pe o rii: “Oh! Nibi a ni ipaniyan ti o lọraXia ìbéèrè." Idaji wakati kan, wakati kan sẹhin - lakoko ti o nṣiṣẹ ati gbigba ibeere yii lati awọn akọọlẹ, mu pada wa si olupin naa, gbogbo data ati awọn iṣiro rẹ yipada. O ṣiṣe lati yokokoro - ati awọn ti o nṣiṣẹ ni kiakia! Ati pe o ko le loye idi, idi laiyara.

Imudara pupọ ti awọn ibeere PostgreSQL. Kirill Borovikov (Tensor)

Lati le ni oye ohun ti o ṣẹlẹ gangan ni akoko ti o ti ṣe ibeere naa lori olupin, awọn eniyan ọlọgbọn kọwe auto_explain module. O wa ni fere gbogbo awọn pinpin PostgreSQL ti o wọpọ julọ, ati pe o le muu ṣiṣẹ ni irọrun ni faili atunto.

Ti o ba mọ pe diẹ ninu awọn ibeere n ṣiṣẹ gun ju opin ti o sọ fun, o ṣe “Aworan” ti ero ti ibeere yii ati kọ wọn papọ ninu akọọlẹ naa.

Imudara pupọ ti awọn ibeere PostgreSQL. Kirill Borovikov (Tensor)

Ohun gbogbo dabi pe o dara ni bayi, a lọ si log ati rii nibẹ… [aṣọ ẹsẹ ọrọ]. Ṣugbọn a ko le sọ ohunkohun nipa rẹ, yatọ si otitọ pe o jẹ ero ti o dara julọ nitori pe o gba 11ms lati ṣiṣẹ.

Ohun gbogbo dabi pe o dara - ṣugbọn ko si ohun ti o han ohun ti o ṣẹlẹ gangan. Yato si akoko gbogbogbo, a ko rii nkankan gaan. Nítorí pé irú “ọ̀dọ́-àgùntàn” bẹ́ẹ̀ gẹ́gẹ́ ti ọ̀rọ̀ àsọyé kìí ṣe ìríran lápapọ̀.

Ṣugbọn paapaa ti ko ba han gbangba, paapaa ti ko ba rọrun, awọn iṣoro ipilẹ diẹ sii wa:

  • Awọn ipade tọkasi apao awọn orisun ti gbogbo subtree labẹ rẹ. Iyẹn ni, o ko le rii iye akoko ti o lo lori Ṣiṣayẹwo Atọka pato ti ipo itẹ-ẹiyẹ kan wa labẹ rẹ. A gbọdọ wo ni agbara lati rii boya “awọn ọmọde” ati awọn oniyipada ipo, awọn CTE inu - ati yọkuro gbogbo eyi “ninu ọkan wa”.
  • Ojuami keji: akoko ti o tọka lori ipade jẹ nikan ipade ipaniyan akoko. Ti ipade yii ba ti ṣiṣẹ nitori abajade, fun apẹẹrẹ, lupu nipasẹ awọn igbasilẹ tabili ni ọpọlọpọ igba, lẹhinna nọmba awọn iyipo-awọn iyipo ti ipade yii-pọ si eto naa. Ṣugbọn akoko ipaniyan atomiki funrararẹ wa kanna ni awọn ofin ti ero. Iyẹn ni, lati ni oye bi o ṣe pẹ to ti ipade yii ni apapọ, o nilo lati isodipupo ohun kan nipasẹ omiiran - lẹẹkansi, “ni ori rẹ.”

Ni iru awọn ipo bẹẹ, loye “Ta ni ọna asopọ alailagbara julọ?” fere soro. Nitorinaa, paapaa awọn olupilẹṣẹ funrararẹ kọ sinu “Afowoyi” pe "Lílóye ero kan jẹ aworan ti o gbọdọ kọ ẹkọ, iriri...".

Ṣugbọn a ni awọn olupilẹṣẹ 1000, ati pe o ko le sọ iriri yii si ọkọọkan wọn. Emi, iwọ, o mọ, ṣugbọn ẹnikan ti o wa nibẹ ko mọ. Boya oun yoo kọ ẹkọ, tabi boya kii ṣe, ṣugbọn o nilo lati ṣiṣẹ ni bayi - ati nibo ni yoo gba iriri yii?

Eto iworan

Nítorí náà, a rí i pé láti lè kojú àwọn ìṣòro wọ̀nyí, a nílò ti o dara iworan ti awọn ètò. [ọrọ]

Imudara pupọ ti awọn ibeere PostgreSQL. Kirill Borovikov (Tensor)

A kọkọ lọ “nipasẹ ọja naa” - jẹ ki a wo Intanẹẹti lati wo kini paapaa wa.

Ṣugbọn o wa ni pe diẹ ni o wa awọn solusan “ifiwe laaye” ti o jẹ diẹ sii tabi kere si idagbasoke - itumọ ọrọ gangan, ọkan nikan: alaye.depesz.com nipasẹ Hubert Lubaczewski. Nigbati o ba tẹ aaye “kikọ sii” aṣoju ọrọ ti ero naa, o fihan ọ tabili kan pẹlu data ti a ti tu silẹ:

  • ipade ile ti ara processing akoko
  • lapapọ akoko fun gbogbo subtree
  • nọmba awọn igbasilẹ ti a gba pada ti a reti ni iṣiro
  • ara ipade ara

Iṣẹ yii tun ni agbara lati pin ibi ipamọ awọn ọna asopọ. O ju ero rẹ sinu ibẹ o sọ pe: “Hey, Vasya, ọna asopọ kan wa, nkan kan wa ti ko tọ nibẹ.”

Imudara pupọ ti awọn ibeere PostgreSQL. Kirill Borovikov (Tensor)

Ṣugbọn awọn iṣoro kekere tun wa.

Ni akọkọ, iye nla ti “daakọ-lẹẹmọ”. O mu nkan kan ti log, fi sinu ibẹ, ati lẹẹkansi, ati lẹẹkansi.

Keji, ko si onínọmbà ti awọn iye ti data ka - kanna buffers ti o jade EXPLAIN (ANALYZE, BUFFERS), a ko ri nibi. O kan ko mọ bi o ṣe le ṣajọ wọn, loye wọn ati ṣiṣẹ pẹlu wọn. Nigbati o ba n ka ọpọlọpọ awọn data ati rii pe o le ṣe aṣiṣe disk ati kaṣe iranti, alaye yii ṣe pataki pupọ.

Ojuami odi kẹta jẹ idagbasoke ailera pupọ ti iṣẹ akanṣe yii. Awọn adehun naa kere pupọ, o dara ti o ba jẹ lẹẹkan ni gbogbo oṣu mẹfa, ati pe koodu wa ni Perl.

Imudara pupọ ti awọn ibeere PostgreSQL. Kirill Borovikov (Tensor)

Ṣugbọn eyi ni gbogbo “awọn orin”, a le bakan gbe pẹlu eyi, ṣugbọn ohun kan wa ti o yi wa pada pupọ lati iṣẹ yii. Iwọnyi jẹ awọn aṣiṣe ninu itupalẹ Ikosile ti Tabili ti o wọpọ (CTE) ati ọpọlọpọ awọn apa ti o ni agbara bii InitPlan/SubPlan.

Ti o ba gbagbọ aworan yii, lẹhinna lapapọ akoko ipaniyan ti oju ipade kọọkan jẹ tobi ju akoko ipaniyan lapapọ ti gbogbo ibeere naa. O rọrun - akoko iran ti CTE yii ko yọkuro lati inu oju ipade ọlọjẹ CTE. Nitorinaa, a ko mọ idahun ti o pe si bii igba ti ọlọjẹ CTE funrararẹ gba.

Imudara pupọ ti awọn ibeere PostgreSQL. Kirill Borovikov (Tensor)

Lẹhinna a rii pe o to akoko lati kọ tiwa - hurray! Gbogbo idagbasoke sọ pe: “Bayi a yoo kọ tiwa, yoo rọrun pupọ!”

A mu akopọ aṣoju fun awọn iṣẹ wẹẹbu: mojuto ti o da lori Node.js + Express, Bootstrap ti a lo ati D3.js fun awọn aworan ti o lẹwa. Ati pe awọn ireti wa ni idalare ni kikun - a gba apẹrẹ akọkọ ni ọsẹ meji:

  • aṣa eto parser
    Iyẹn ni, ni bayi a le ṣe itupalẹ eyikeyi ero lati awọn ti ipilẹṣẹ nipasẹ PostgreSQL.
  • ti o tọ igbekale ti ìmúdàgba apa - CTE wíwo, InitPlan, SubPlan
  • igbekale buffers pinpin - nibiti a ti ka awọn oju-iwe data lati iranti, nibo lati kaṣe agbegbe, nibo lati disk
  • ni wípé
    Nitorina ki o má ṣe "ma wà" gbogbo eyi ni akọọlẹ, ṣugbọn lati wo "ọna asopọ ti ko lagbara" lẹsẹkẹsẹ ni aworan naa.

Imudara pupọ ti awọn ibeere PostgreSQL. Kirill Borovikov (Tensor)

A ni nkan bii eyi, pẹlu afihan sintasi pẹlu. Ṣugbọn nigbagbogbo awọn olupilẹṣẹ wa ko ṣiṣẹ pẹlu aṣoju pipe ti ero naa, ṣugbọn pẹlu kukuru kan. Lẹhinna, a ti sọ gbogbo awọn nọmba naa tẹlẹ ki o si sọ wọn si apa osi ati ọtun, ati ni aarin ti a fi silẹ nikan laini akọkọ, iru ipade wo ni o jẹ: CTE Scan, CTE generation tabi Seq Scan gẹgẹbi diẹ ninu awọn ami.

Eyi ni aṣoju kukuru ti a pe awoṣe ètò.

Imudara pupọ ti awọn ibeere PostgreSQL. Kirill Borovikov (Tensor)

Kini ohun miiran yoo jẹ rọrun? Yoo rọrun lati rii kini ipin ti akoko lapapọ wa ti pin si iru ipade - ati pe “fi si” si ẹgbẹ paati apẹrẹ.

A tọka si ipade ati rii - o wa ni pe Seq Scan gba o kere ju idamẹrin ti akoko lapapọ, ati pe 3/4 ti o ku ni o mu nipasẹ CTE Scan. Ibanuje! Eyi jẹ akọsilẹ kekere kan nipa “oṣuwọn ina” ti CTE Scan ti o ba lo wọn ni itara ninu awọn ibeere rẹ. Wọn ko yara pupọ - wọn kere paapaa si ibojuwo tabili deede. [ọrọ] [ọrọ]

Sugbon nigbagbogbo iru awọn aworan atọka jẹ diẹ awon, eka sii, nigba ti a lẹsẹkẹsẹ ntoka ni a apa ati ki o wo, fun apẹẹrẹ, pe diẹ ẹ sii ju idaji ninu awọn akoko Seq Scan "jẹ". Pẹlupẹlu, iru Ajọ kan wa ninu inu, ọpọlọpọ awọn igbasilẹ ti sọnu ni ibamu si rẹ… O le taara aworan yii si olupilẹṣẹ naa ki o sọ pe: “Vasya, ohun gbogbo ko dara nibi fun ọ! Ronu rẹ, wo - nkankan ti ko tọ!”

Imudara pupọ ti awọn ibeere PostgreSQL. Kirill Borovikov (Tensor)

Nipa ti, nibẹ wà diẹ ninu awọn "rakes" lowo.

Ohun akọkọ ti a wa kọja ni iṣoro iyipo. Akoko ti ipade kọọkan kọọkan ninu ero jẹ itọkasi pẹlu deede ti 1 μs. Ati pe nigbati nọmba awọn iyipo ipade ba kọja, fun apẹẹrẹ, 1000 - lẹhin ipaniyan PostgreSQL pin “laarin deede”, lẹhinna nigba iṣiro pada a gba akoko lapapọ “ibikan laarin 0.95ms ati 1.05ms”. Nigbati kika naa ba lọ si awọn iṣẹju-aaya, o dara, ṣugbọn nigbati o ti jẹ [milli] iṣẹju-aaya, o ni lati gba alaye yii sinu akọọlẹ nigbati awọn orisun “ṣii” si awọn apa ti “ẹniti o jẹ iye” ero.

Imudara pupọ ti awọn ibeere PostgreSQL. Kirill Borovikov (Tensor)

Ojuami keji, eka diẹ sii, ni pinpin awọn orisun (awọn buffers wọnyẹn) laarin awọn apa ti o ni agbara. Eyi jẹ fun wa ni ọsẹ meji akọkọ ti apẹrẹ pẹlu ọsẹ mẹrin miiran.

O rọrun pupọ lati gba iru iṣoro yii - a ṣe CTE kan ati pe a nireti ka nkan ninu rẹ. Ni otitọ, PostgreSQL jẹ “ọlọgbọn” ati pe kii yoo ka ohunkohun taara nibẹ. Lẹhinna a gba igbasilẹ akọkọ lati ọdọ rẹ, ati si ọdọ rẹ ọgọrun ati akọkọ ọkan lati CTE kanna.

Imudara pupọ ti awọn ibeere PostgreSQL. Kirill Borovikov (Tensor)

A wo ero naa ati loye - o jẹ ajeji, a ni awọn buffers 3 (awọn oju-iwe data) “jẹ” ni Seq Scan, 1 diẹ sii ni CTE Scan, ati 2 diẹ sii ni CTE Scan keji. Iyẹn ni, ti a ba ṣe akopọ ohun gbogbo, a yoo gba 6, ṣugbọn lati tabulẹti a ka 3 nikan! CTE Scan ko ka ohunkohun lati ibikibi, ṣugbọn ṣiṣẹ taara pẹlu iranti ilana. Iyẹn ni, ohun kan jẹ aṣiṣe kedere nibi!

Ni otitọ, o wa ni pe nibi ni gbogbo awọn oju-iwe 3 ti data ti o beere lati Seq Scan, akọkọ 1 beere fun 1st CTE Scan, ati lẹhinna 2nd, ati 2 diẹ sii ni a ka fun u. Iyẹn ni, lapapọ. Awọn oju-iwe 3 ni data kika, kii ṣe 6.

Imudara pupọ ti awọn ibeere PostgreSQL. Kirill Borovikov (Tensor)

Ati pe aworan yii mu wa lọ si oye pe ipaniyan ti eto kii ṣe igi mọ, ṣugbọn ni irọrun diẹ ninu awọn aworan acyclic. Ati pe a ni aworan apẹrẹ bii eyi, ki a loye “kini o wa lati ibo ni aye akọkọ.” Iyẹn ni, nibi a ṣẹda CTE kan lati pg_class, o beere fun lẹẹmeji, ati pe o fẹrẹ jẹ pe gbogbo akoko wa lo ni ẹka nigba ti a beere fun ni akoko 2nd. O han gbangba pe kika titẹsi 101st jẹ gbowolori pupọ diẹ sii ju kika kika titẹsi 1st lati tabulẹti.

Imudara pupọ ti awọn ibeere PostgreSQL. Kirill Borovikov (Tensor)

A simi fun igba diẹ. Wọ́n ní: “Ní báyìí, Neo, o mọ kung fu! Bayi iriri wa jẹ ọtun loju iboju rẹ. Bayi o le lo." [ọrọ]

Iṣọkan log

Awọn olupilẹṣẹ 1000 wa simi ti iderun. Ṣugbọn a loye pe a ni awọn ọgọọgọrun awọn olupin “ija” nikan, ati pe gbogbo “daakọ-lẹẹmọ” yii ni apakan ti awọn olupilẹṣẹ ko rọrun rara. A mọ̀ pé a ní láti kó o fúnra wa.

Imudara pupọ ti awọn ibeere PostgreSQL. Kirill Borovikov (Tensor)

Ni gbogbogbo, module boṣewa kan wa ti o le gba awọn iṣiro, sibẹsibẹ, o tun nilo lati muu ṣiṣẹ ni atunto - eyi module pg_stat_statements. Ṣugbọn ko baamu wa.

Ni akọkọ, o pin si awọn ibeere kanna ni lilo awọn ero oriṣiriṣi laarin data data kanna o yatọ si QueryIds. Iyẹn ni, ti o ba kọkọ ṣe SET search_path = '01'; SELECT * FROM user LIMIT 1;, ati igba yen SET search_path = '02'; ati ibeere kanna, lẹhinna awọn iṣiro ti module yii yoo ni awọn igbasilẹ oriṣiriṣi, ati pe Emi kii yoo ni anfani lati gba awọn iṣiro gbogbogbo ni pataki ni aaye ti profaili ibeere yii, laisi akiyesi awọn ero.

Ojuami keji ti o ṣe idiwọ fun wa lati lo aini ti eto. Iyẹn ni, ko si ero, ibeere nikan wa funrararẹ. A rii ohun ti o fa fifalẹ, ṣugbọn a ko loye idi. Ati pe nibi a pada si iṣoro ti ipilẹ data ti o yipada ni iyara.

Ati akoko to kẹhin - aini "awọn otitọ". Iyẹn ni, o ko le koju apẹẹrẹ kan pato ti ipaniyan ibeere - ko si, ko si awọn iṣiro akojọpọ nikan. Botilẹjẹpe o ṣee ṣe lati ṣiṣẹ pẹlu eyi, o kan nira pupọ.

Imudara pupọ ti awọn ibeere PostgreSQL. Kirill Borovikov (Tensor)

Nitorinaa, a pinnu lati ja daakọ-lẹẹmọ ati bẹrẹ kikọ alakojo.

Olukojọpọ sopọ nipasẹ SSH, ṣe agbekalẹ asopọ to ni aabo si olupin pẹlu ibi ipamọ data nipa lilo ijẹrisi, ati tail -F "clings" si o ni log faili. Nitorina ni igba yii a gba “digi” pipe ti gbogbo faili log, eyiti olupin naa n gbejade. Awọn fifuye lori olupin ara rẹ jẹ iwonba, nitori a ko sọ ohunkohun nibẹ, a kan digi awọn ijabọ.

Niwọn bi a ti bẹrẹ kikọ wiwo ni Node.js, a tẹsiwaju lati kọ olugba sinu rẹ. Ati pe imọ-ẹrọ yii ti ṣe idalare funrararẹ, nitori pe o rọrun pupọ lati lo JavaScript lati ṣiṣẹ pẹlu data ọrọ ti o ni ailagbara, eyiti o jẹ log. Ati Node.js amayederun ara bi a backend Syeed faye gba o lati awọn iṣọrọ ati irọrun ṣiṣẹ pẹlu awọn asopọ nẹtiwọki, ati nitootọ pẹlu eyikeyi data ṣiṣan.

Nitorinaa, a “na” awọn asopọ meji: akọkọ lati “gbọ” si log funrararẹ ati mu lọ si ara wa, ati ekeji lati beere ipilẹ lorekore. "Ṣugbọn akọọlẹ naa fihan pe ami pẹlu oid 123 ti dinamọ," ṣugbọn eyi ko tumọ si nkankan si olupilẹṣẹ, ati pe yoo dara lati beere aaye data, "Kini OID = 123 lonakona?" Ati nitorinaa a lorekore beere ipilẹ ohun ti a ko tii mọ nipa ara wa.

Imudara pupọ ti awọn ibeere PostgreSQL. Kirill Borovikov (Tensor)

"Nkan kan wa ti o ko ṣe akiyesi, eya kan wa ti awọn oyin bi erin! ..." A bẹrẹ si ni idagbasoke eto yii nigba ti a fẹ lati ṣe atẹle awọn olupin 10. O ṣe pataki julọ ni oye wa, nibiti diẹ ninu awọn iṣoro dide ti o nira lati koju. Ṣugbọn lakoko mẹẹdogun akọkọ, a gba ọgọrun fun ibojuwo - nitori pe eto naa ṣiṣẹ, gbogbo eniyan fẹ, gbogbo eniyan ni itunu.

Gbogbo eyi nilo lati ṣafikun, ṣiṣan data jẹ nla ati lọwọ. Ni otitọ, ohun ti a ṣe atẹle, ohun ti a le ṣe pẹlu, jẹ ohun ti a lo. A tun lo PostgreSQL bi ibi ipamọ data kan. Ati pe ko si ohun ti o yara lati "tu" data sinu rẹ ju oniṣẹ ẹrọ lọ COPY Ko sibẹsibẹ.

Ṣugbọn nìkan “tújáde” data kii ṣe imọ-ẹrọ wa gaan. Nitoripe ti o ba ni awọn ibeere 50k fun iṣẹju keji lori awọn olupin ọgọrun, lẹhinna eyi yoo ṣe ina 100-150GB ti awọn akọọlẹ fun ọjọ kan. Nitorina, a ni lati farabalẹ "ge" ipilẹ.

Ni akọkọ, a ṣe ipin nipa ọjọ, nitori, nipasẹ ati nla, ko si ọkan ti o nifẹ si ibamu laarin awọn ọjọ. Iyatọ wo ni o ṣe ohun ti o ni lana, ti o ba jẹ alẹ oni o yi ẹya tuntun ti ohun elo jade - ati tẹlẹ diẹ ninu awọn iṣiro tuntun.

Ni ẹẹkeji, a kọ ẹkọ (ti fi agbara mu) gan, gan sare lati kọ nipa lilo COPY. Iyẹn ni, kii ṣe nikan COPYnitori o yara ju INSERT, ati paapaa yiyara.

Imudara pupọ ti awọn ibeere PostgreSQL. Kirill Borovikov (Tensor)

Awọn kẹta ojuami - Mo ni lati kọ awọn okunfa silẹ, lẹsẹsẹ, ati awọn bọtini ajeji. Iyẹn ni, a ko ni iṣotitọ itọkasi rara. Nitoripe ti o ba ni tabili ti o ni awọn FK meji, ati pe o sọ ninu ipilẹ data pe “igbasilẹ igbasilẹ kan wa ti FK tọka si, fun apẹẹrẹ, si ẹgbẹ awọn igbasilẹ,” lẹhinna nigbati o ba fi sii, PostgreSQL ko ni nkankan ti o kù bikoṣe bi o ṣe le mu ki o ṣe ni otitọ SELECT 1 FROM master_fk1_table WHERE ... pẹlu idanimọ ti o n gbiyanju lati fi sii - o kan lati ṣayẹwo pe igbasilẹ yii wa nibẹ, pe o ko “pa” Key Ajeji yii pẹlu fifi sii rẹ.

Dipo igbasilẹ kan si tabili ibi-afẹde ati awọn itọka rẹ, a gba afikun anfani ti kika lati gbogbo awọn tabili ti o tọka si. Ṣugbọn a ko nilo eyi rara - iṣẹ-ṣiṣe wa ni lati gbasilẹ bi o ti ṣee ṣe ati ni yarayara bi o ti ṣee pẹlu ẹru ti o kere julọ. Nitorina FK - isalẹ!

Nigbamii ti ojuami ni aggregation ati hashing. Ni ibẹrẹ, a ṣe imuse wọn ni ibi ipamọ data - lẹhinna o rọrun lati lẹsẹkẹsẹ, nigbati igbasilẹ ba de, ṣe ni iru tabulẹti kan. "Plus ọkan" ọtun ninu awọn okunfa. O dara, o rọrun, ṣugbọn ohun buburu kanna - o fi igbasilẹ kan sii, ṣugbọn o fi agbara mu lati ka ati kọ nkan miiran lati tabili miiran. Pẹlupẹlu, kii ṣe pe o ka ati kọ nikan, o tun ṣe ni gbogbo igba.

Bayi fojuinu pe o ni tabili kan ninu eyiti o kan ka nọmba awọn ibeere ti o ti kọja nipasẹ agbalejo kan pato: +1, +1, +1, ..., +1. Ati iwọ, ni opo, ko nilo eyi - gbogbo rẹ ṣee ṣe apao ni iranti lori-odè ati firanṣẹ si ibi ipamọ data ni ọna kan +10.

Bẹẹni, ni ọran ti diẹ ninu awọn iṣoro, iduroṣinṣin ọgbọn rẹ le “ṣubu yato si”, ṣugbọn eyi jẹ ọran ti ko daju - nitori pe o ni olupin deede, o ni batiri kan ninu oludari, o ni akọọlẹ idunadura kan, log lori eto faili ... Ni gbogbogbo, kii ṣe o tọ si. Awọn isonu ti ise sise ti o gba lati nṣiṣẹ okunfa/FK ni ko tọ awọn inawo ti o fa.

O jẹ kanna pẹlu hashing. Ibeere kan n fo si ọ, o ṣe iṣiro idanimọ kan lati ọdọ rẹ ninu ibi ipamọ data, kọ si ibi ipamọ data lẹhinna sọ fun gbogbo eniyan. Ohun gbogbo dara titi, ni akoko gbigbasilẹ, eniyan keji wa si ọdọ rẹ ti o fẹ gbasilẹ ohun kanna - ati pe o dina, ati pe eyi ti buru tẹlẹ. Nitorinaa, ti o ba le gbe iran ti diẹ ninu awọn ID si alabara (ibaramu si data), o dara lati ṣe eyi.

O jẹ pipe fun wa lati lo MD5 lati ọrọ - ibeere, ero, awoṣe,... A ṣe iṣiro rẹ ni ẹgbẹ agbowọ, ati “tú” ID ti a ti ṣetan sinu ibi ipamọ data. Gigun ti MD5 ati ipinpin ojoojumọ gba wa laaye lati ma ṣe aniyan nipa awọn ikọlu ti o ṣeeṣe.

Imudara pupọ ti awọn ibeere PostgreSQL. Kirill Borovikov (Tensor)

Ṣugbọn lati ṣe igbasilẹ gbogbo eyi ni kiakia, a nilo lati yi ilana igbasilẹ naa funrararẹ.

Bawo ni o ṣe n kọ data nigbagbogbo? A ni diẹ ninu iru dataset, a pin si awọn tabili pupọ, lẹhinna daakọ rẹ - akọkọ sinu akọkọ, lẹhinna sinu keji, sinu ẹkẹta… Ko ṣe aibalẹ, nitori a dabi pe a nkọ ṣiṣan data kan ni awọn igbesẹ mẹta. lesese. Aigbadun. Njẹ o le ṣe ni yarayara bi? Le!

Lati ṣe eyi, o to lati decompose awọn ṣiṣan wọnyi ni afiwe pẹlu ara wọn. O wa ni jade pe a ni awọn aṣiṣe, awọn ibeere, awọn awoṣe, awọn idinamọ, ... fò ni awọn okun ọtọtọ - ati pe a kọ gbogbo rẹ ni afiwe. To fun eyi tọju ikanni COPY nigbagbogbo ṣii fun tabili ibi-afẹde kọọkan.

Imudara pupọ ti awọn ibeere PostgreSQL. Kirill Borovikov (Tensor)

Iyẹn ni, ni agbowọ ṣiṣan nigbagbogbo wa, sinu eyiti MO le kọ data ti Mo nilo. Ṣugbọn ki ibi-ipamọ data rii data yii, ati pe ẹnikan ko ni diduro fun kikọ data yii, COPY gbọdọ wa ni idilọwọ ni awọn aaye arin kan. Fun wa, akoko ti o munadoko julọ jẹ nipa 100ms - a pa a ati lẹsẹkẹsẹ ṣii lẹẹkansi si tabili kanna. Ati pe ti a ko ba ni sisan kan ti o to lakoko diẹ ninu awọn oke giga, lẹhinna a ṣe ikojọpọ titi di opin kan.

Ni afikun, a rii pe fun iru profaili fifuye, eyikeyi akojọpọ, nigbati awọn igbasilẹ ba gba ni awọn ipele, jẹ buburu. Classic ibi ni INSERT ... VALUES ati siwaju 1000 igbasilẹ. Nitoripe ni akoko yẹn o ni tente oke kikọ lori media, ati pe gbogbo eniyan miiran ti n gbiyanju lati kọ nkan si disk yoo duro.

Lati yọ iru awọn aiṣedeede kuro, nìkan maṣe ṣajọpọ ohunkohun, maṣe fipamọ rara. Ati pe ti ififunni si disk ba waye (da, API ṣiṣan ni Node.js gba ọ laaye lati wa jade) - sun asopọ yii siwaju. Nigbati o ba gba iṣẹlẹ kan pe o jẹ ọfẹ lẹẹkansi, kọ si rẹ lati isinyi ti o ṣajọpọ. Ati nigba ti o nšišẹ, mu ọkan ọfẹ ti o tẹle lati inu adagun omi ki o kọ si.

Ṣaaju ki o to ṣafihan ọna yii si gbigbasilẹ data, a ni isunmọ 4K kikọ ops, ati ni ọna yii a dinku fifuye nipasẹ awọn akoko 4. Bayi wọn ti dagba ni igba 6 miiran nitori awọn apoti isura data abojuto tuntun - to 100MB/s. Ati ni bayi a tọju awọn akọọlẹ fun awọn oṣu 3 to kọja ni iwọn ti o to 10-15TB, nireti pe ni oṣu mẹta nikan eyikeyi oluṣe idagbasoke yoo ni anfani lati yanju eyikeyi iṣoro.

A loye awọn iṣoro naa

Ṣugbọn nirọrun gbigba gbogbo data yii dara, wulo, wulo, ṣugbọn ko to - o nilo lati ni oye. Nitoripe iwọnyi jẹ awọn miliọnu oriṣiriṣi awọn ero fun ọjọ kan.

Imudara pupọ ti awọn ibeere PostgreSQL. Kirill Borovikov (Tensor)

Ṣugbọn awọn miliọnu ko le ṣakoso, a gbọdọ kọkọ ṣe “kere”. Ati pe, ni akọkọ, o nilo lati pinnu bi o ṣe le ṣeto nkan “kere” yii.

A ti ṣe idanimọ awọn aaye pataki mẹta:

  • tani rán yi ìbéèrè
    Iyẹn ni, lati ohun elo wo ni o “de”: wiwo wẹẹbu, ẹhin, eto isanwo tabi nkan miiran.
  • nibi ti o ṣẹlẹ
    Lori ohun ti pato olupin? Nitori ti o ba ni awọn olupin pupọ labẹ ohun elo kan, ati lojiji ọkan “lọ aimọgbọnwa” (nitori “disk jẹ rotten”, “iranti ti jo”, diẹ ninu awọn iṣoro miiran), lẹhinna o nilo lati koju olupin naa ni pataki.
  • bi o iṣoro naa farahan ararẹ ni ọna kan tabi omiiran

Lati loye “ẹniti” ti o fi ibeere ranṣẹ si wa, a lo ọpa boṣewa kan - ṣeto oniyipada igba kan: SET application_name = '{bl-host}:{bl-method}'; - a firanṣẹ orukọ ti agbalejo oye iṣowo lati eyiti ibeere naa wa, ati orukọ ọna tabi ohun elo ti o bẹrẹ.

Lẹhin ti a ti kọja “eni” ti ibeere naa, o gbọdọ jẹjade si log - fun eyi a tunto oniyipada naa. log_line_prefix = ' %m [%p:%v] [%d] %r %a'. Fun awon ti nife, boya wo ni Afowoyikini gbogbo rẹ tumọ si. O wa ni pe a rii ninu akọọlẹ:

  • время
  • ilana ati idunadura identifiers
  • database orukọ
  • IP ti eniyan ti o firanṣẹ ibeere yii
  • ati orukọ ọna

Imudara pupọ ti awọn ibeere PostgreSQL. Kirill Borovikov (Tensor)

Lẹhinna a rii pe ko nifẹ pupọ lati wo ibamu fun ibeere kan laarin awọn olupin oriṣiriṣi. Kii ṣe nigbagbogbo pe o ni ipo kan nibiti ohun elo kan ṣe sẹsẹ ni dọgbadọgba nibi ati nibẹ. Ṣugbọn paapaa ti o ba jẹ kanna, wo eyikeyi awọn olupin wọnyi.

Nitorina eyi ni gige naa "Olupin kan - ọjọ kan" o wa ni to fun wa fun eyikeyi onínọmbà.

Ni igba akọkọ ti analitikali apakan jẹ kanna "apẹẹrẹ" - ẹya abbreviated fọọmu ti igbejade ti awọn ètò, nso ti gbogbo nomba ifi. Awọn keji gige ni awọn ohun elo tabi ọna, ati awọn kẹta ge ni awọn kan pato ipade ètò ti o ṣẹlẹ wa isoro.

Nigbati a ba gbe lati awọn apẹẹrẹ kan pato si awọn awoṣe, a ni awọn anfani meji ni ẹẹkan:

  • idinku pupọ ninu nọmba awọn nkan fun itupalẹ
    A ni lati ṣe itupalẹ iṣoro naa kii ṣe nipasẹ ẹgbẹẹgbẹrun awọn ibeere tabi awọn ero, ṣugbọn nipasẹ awọn dosinni ti awọn awoṣe.
  • aago
    Iyẹn ni, nipa ṣoki awọn “awọn otitọ” laarin apakan kan, o le ṣafihan irisi wọn lakoko ọjọ. Ati nibi o le loye pe ti o ba ni iru apẹẹrẹ ti o ṣẹlẹ, fun apẹẹrẹ, lẹẹkan ni wakati kan, ṣugbọn o yẹ ki o ṣẹlẹ lẹẹkan ni ọjọ kan, o yẹ ki o ronu nipa ohun ti ko tọ - tani o fa ati idi, boya o yẹ ki o wa nibi. ko yẹ. Eyi jẹ miiran ti kii ṣe oni-nọmba, wiwo nikan, ọna itupalẹ.

Imudara pupọ ti awọn ibeere PostgreSQL. Kirill Borovikov (Tensor)

Awọn ọna ti o ku da lori awọn itọkasi ti a yọ jade lati inu ero naa: melo ni iru apẹẹrẹ kan waye, lapapọ ati akoko apapọ, iye data ti a ka lati disk, ati melo ni lati iranti…

Nitori, fun apẹẹrẹ, o wa si oju-iwe atupale fun agbalejo, wo - ohun kan n bẹrẹ lati ka pupọ lori disiki naa. Disiki lori olupin ko le mu - tani ka lati inu rẹ?

Ati pe o le lẹsẹsẹ nipasẹ ọwọn eyikeyi ki o pinnu kini iwọ yoo ṣe pẹlu ni bayi - fifuye lori ero isise tabi disk, tabi nọmba lapapọ ti awọn ibeere… ti yiyi ẹya tuntun ti ohun elo naa.
[iwe fidio]

Ati lẹsẹkẹsẹ o le rii awọn ohun elo oriṣiriṣi ti o wa pẹlu awoṣe kanna lati ibeere bii SELECT * FROM users WHERE login = 'Vasya'. Frontend, backend, processing... Ati awọn ti o Iyanu idi ti processing yoo ka olumulo ti o ba ti o ko ni nlo pẹlu rẹ.

Ọna idakeji ni lati rii lẹsẹkẹsẹ lati ohun elo ohun ti o ṣe. Fun apẹẹrẹ, iwaju iwaju ni eyi, eyi, eyi, ati eyi lẹẹkan ni wakati kan (akoko akoko ṣe iranlọwọ). Ati pe ibeere naa waye lẹsẹkẹsẹ: o dabi pe kii ṣe iṣẹ iwaju lati ṣe nkan lẹẹkan ni wakati kan ...

Imudara pupọ ti awọn ibeere PostgreSQL. Kirill Borovikov (Tensor)

Lẹhin akoko diẹ, a rii pe a ko ni akojọpọ awọn iṣiro nipasẹ awọn apa eto. A ya sọtọ lati awọn ero nikan awọn apa ti o ṣe nkan pẹlu data ti awọn tabili funrararẹ (ka / kọ wọn nipasẹ atọka tabi rara). Ni otitọ, abala kan nikan ni a ṣafikun ni ibatan si aworan ti tẹlẹ - awọn igbasilẹ melo ni ipade yii mu wa?, ati melo ni a danu (Awọn ori ila ti a yọ kuro nipasẹ Ajọ).

O ko ni itọka ti o yẹ lori awo, o ṣe ibeere si rẹ, o fo kọja atọka naa, ṣubu sinu Seq Scan… o ti ṣe àlẹmọ gbogbo awọn igbasilẹ ayafi ọkan. Kini idi ti o nilo 100M awọn igbasilẹ asẹ fun ọjọ kan? Ṣe ko dara lati yi atọka naa soke?

Imudara pupọ ti awọn ibeere PostgreSQL. Kirill Borovikov (Tensor)

Lẹhin ti ṣe atupale gbogbo awọn ero ipade nipasẹ ipade, a rii pe diẹ ninu awọn ẹya aṣoju wa ninu awọn ero ti o ṣeeṣe pupọ lati wo ifura. Ati pe yoo dara lati sọ fun olupilẹṣẹ naa: “Ọrẹ, nibi o kọkọ ka nipasẹ atọka, lẹhinna too, lẹhinna ge” - gẹgẹbi ofin, igbasilẹ kan wa.

Gbogbo eniyan ti o kọ awọn ibeere ti ṣe alabapade aṣa yii: “Fun mi ni aṣẹ ti o kẹhin fun Vasya, ọjọ rẹ.” Ati pe ti o ko ba ni atọka nipasẹ ọjọ, tabi ko si ọjọ kan ninu atọka ti o lo, lẹhinna o yoo tẹ̀ síwájú gan-an “àwárí” kan náà.

Ṣugbọn a mọ pe eyi jẹ “awari” - nitorinaa kilode ti o ko sọ lẹsẹkẹsẹ fun idagbasoke ohun ti o yẹ ki o ṣe. Gẹgẹ bẹ, nigba ṣiṣi eto kan ni bayi, oluṣe idagbasoke wa lẹsẹkẹsẹ wo aworan ẹlẹwa kan pẹlu awọn imọran, nibiti wọn ti sọ fun u lẹsẹkẹsẹ pe: “O ni awọn iṣoro nibi ati nibẹ, ṣugbọn wọn yanju ni ọna yii ati bẹ.”

Bi abajade, iye iriri ti o nilo lati yanju awọn iṣoro ni ibẹrẹ ati ni bayi ti lọ silẹ ni pataki. Eyi ni iru irinṣẹ ti a ni.

Imudara pupọ ti awọn ibeere PostgreSQL. Kirill Borovikov (Tensor)

orisun: www.habr.com

Fi ọrọìwòye kun