Te arotautanga nui o nga patai PostgreSQL. Kirill Borovikov (Tensor)

Kei te ripoata etahi huarahi ka taea aroturuki i te mahi o nga patai SQL ina he miriona o ratou ia ra, a he rau o nga tūmau PostgreSQL e aroturukihia ana.

He aha nga otinga hangarau e taea ai e tatou te whakahaere tika i te nui o nga korero, me te pehea e ngawari ai te oranga o te kaiwhakawhanake noa?


Ko wai te hiahia? tātaritanga o nga raru motuhake me nga momo tikanga arotautanga Uiui SQL me te whakaoti rapanga DBA angamaheni i PostgreSQL - ka taea hoki e koe panuihia he raupapa tuhinga mo tenei kaupapa.

Te arotautanga nui o nga patai PostgreSQL. Kirill Borovikov (Tensor)
Ko Kirill Borovikov toku ingoa, he kanohi ahau kamupene Tensor. Inaa, he tohunga ahau ki te mahi me nga papaa raraunga i roto i ta maatau kamupene.

I tenei ra ka korero atu ahau ki a koe me pehea e arotau ai nga paatai, kaore koe e hiahia ki te "whakawehe" i te mahinga o te patai kotahi, engari ka whakaoti i te raru nui. Ina he miriona nga tono, me rapu e koe etahi huarahi ki te otinga tenei raruraru nui.

I te nuinga o te waa, ko Tensor mo te miriona o taatau kaihoko Ko VLSI ta maatau tono: whatunga hapori rangatōpū, otinga mo te whakawhitiwhiti ataata, mo te rere o nga tuhinga o roto me waho, nga punaha kaute mo te kaute me nga whare putunga,... Ara, he "mega-combine" mo te whakahaere pakihi whakauru, kei roto i te 100 nga rereke rereke. kaupapa o roto.

Kia pai ai te mahi me te whanake o ratou katoa, he 10 nga pokapu whakawhanaketanga puta noa i te motu, he maha ake 1000 nga kaihanga.

Kua mahi tahi matou me PostgreSQL mai i te tau 2008, kua kohia e matou he maha o nga mea e tukatukahia ana e matou - nga raraunga kiritaki, tatauranga, tātari, raraunga mai i nga punaha korero o waho - neke atu i te 400TB. Tata ki te 250 nga kaitoro kei roto i nga mahi hanga noa, a, ko te katoa kei te tata ki te 1000 nga kaitoro putunga korero e aro turukihia ana e matou.

Te arotautanga nui o nga patai PostgreSQL. Kirill Borovikov (Tensor)

Ko te SQL he reo whakapuaki. Kaore koe e whakaahua "me pehea" te mahi o tetahi mea, engari "he aha" e hiahia ana koe ki te whakatutuki. He pai ake te mohio o te DBMS me pehea te hono - me pehea te hono i o ripanga, he aha nga tikanga ka tukuna, he aha te haere i roto i te taurangi, he aha e kore...

Ko etahi o nga DBMS e whakaae ana ki nga tohu: "Kao, hono enei ripanga e rua ki roto i te rarangi penei," engari kaore e taea e PostgreSQL tenei. Koinei te tuunga mohio o nga kaiwhakawhanake rangatira: "He pai ke atu taatau ki te whakaoti i te arotau patai kaore i te tuku i nga kaiwhakawhanake ki te whakamahi i etahi momo tohu."

Engari, ahakoa te mea kaore a PostgreSQL e tuku i te "waho" ki te whakahaere i a ia ano, ka taea e ia tirohia nga mea kei roto i a iai te wa e whakahaere ana koe i to patai, me te waahi ka raru.

Te arotautanga nui o nga patai PostgreSQL. Kirill Borovikov (Tensor)

I te nuinga o te waa, he aha nga raru matarohia ka tae mai ki te kaiwhakawhanake [ki te DBA]? “I konei ka whakatutukihia e matou te tono, a he puhoi nga mea katoa ki a matou, kei te iri nga mea katoa, kei te tupu tetahi mea... He ahua raruraru!”

He rite tonu nga take:

  • hātepe uiui huakore
    Kaiwhakawhanake: "Na, ka hoatu e ahau ki a ia nga tepu 10 i roto i te SQL ma te JOIN ..." - me te tumanako ka tino "rere" ana tikanga, ka tere te whiwhi i nga mea katoa. Engari karekau he merekara e puta, a ko tetahi punaha he rerekee (10 nga tepu i roto i te kotahi MEI) ka puta he momo hapa. [tuhinga]
  • nga tatauranga kore
    He tino tika tenei tohu mo te PostgreSQL, ina "rihia" e koe he huinga raraunga nui ki runga i te tūmau, tono tono, ka "sexcanits" to papa. Na te mea inanahi 10 nga rekoata kei roto, a i tenei ra 10 miriona, engari kaore ano a PostgreSQL i te mohio ki tenei, a me korero e matou mo taua mea. [tuhinga]
  • "mono" ki nga rauemi
    Kua tāutahia e koe he pātengi raraunga nui me te utaina nui ki runga i te tūmau ngoikore kaore i te nui te kōpae, te mahara, te mahi tukatuka ranei. Na ko te mea katoa ... Kei tetahi waahi he tuanui mahi kei runga ake e kore e taea e koe te peke.
  • ārai
    He waahi uaua tenei, engari he mea tino tika mo nga momo patai whakarereke (KUKU, WHAKAUPAPA, WHAKAMUU) - he kaupapa nui motuhake tenei.

Te tiki mahere

...A mo era atu mea katoa me whai mahere! Me kite tatou he aha te mahi i roto i te tūmau.

Te arotautanga nui o nga patai PostgreSQL. Kirill Borovikov (Tensor)

Ko te mahere mahi uiui mo PostgreSQL he rakau o te algorithm mahi uiui i roto i te whakaaturanga kuputuhi. Koia tonu te algorithm, na te tātaritanga a te kaiwhakamahere, i kitea ko te tino whai hua.

Ko ia node rakau he mahi: te tiki raraunga mai i te ripanga, te taupū ranei, te hanga mapi moka, te hono i nga ripanga e rua, te hono, te whakawhiti, te whakakore ranei i nga whiringa. Ko te mahi uiui ko te hikoi i nga pona o tenei rakau.

Ki te tiki i te mahere patai, ko te huarahi ngawari ko te whakahaere i te korero EXPLAIN. Ki te whiwhi me nga huanga tuturu katoa, ara, ki te mahi i tetahi patai i runga i te turanga - EXPLAIN (ANALYZE, BUFFERS) SELECT ....

Ko te waahanga kino: ka rere koe, ka tupu "i konei me inaianei", na reira he pai mo te patuiro o te rohe. Mena ka tango koe i tetahi tūmau tino utaina kei raro i te rerenga kaha o nga huringa raraunga, ka kite koe: "Aue! I konei he puhoi te mahixia tono." Hawhe haora, he haora ki muri - i a koe e oma ana me te tiki mai i tenei tono mai i nga raarangi, ka whakahokia mai ki te tūmau, ka huri katoa to huingararaunga me to tatauranga. Ka rere koe ki te patuiro - ka tere te rere! A kaore koe e mohio he aha, he aha ko pōturi

Te arotautanga nui o nga patai PostgreSQL. Kirill Borovikov (Tensor)

Kia mohio ai koe he aha te mea i puta i te wa i tukuna ai te tono ki runga i te kaimau, i tuhi nga tangata mohio auto_whakamarama kōwae. Kei roto i te nuinga o nga tohatoha PostgreSQL tino noa, ka taea noa te whakahohe i te konae whirihora.

Mena ka mohio ia kei te roa ake te haere o etahi tono i te tepe i kiia e koe, ka mahia "whakaahua" o te mahere o tenei tono me te tuhi tahi ki te raarangi.

Te arotautanga nui o nga patai PostgreSQL. Kirill Borovikov (Tensor)

Kei te pai nga mea katoa inaianei, ka haere matou ki te poro rakau ka kite i reira... [text footcloth]. Engari kaore e taea e matou te korero mo tena, i tua atu i te meka he mahere pai na te mea he 11ms te roa o te mahi.

Te ahua nei kei te pai nga mea katoa - engari karekau he maarama he aha nga mea i tupu. I tua atu i te waa whanui, kaore matou e tino kite i tetahi mea. No te mea ko te titiro ki taua "reme" o nga tuhinga maamaa kaore he tirohanga.

Engari ahakoa kaore i te maarama, ahakoa he raru, he raru nui ake:

  • Ka tohu te node te tapeke o nga rauemi o te rakau iti katoa i raro i a ia. Arā, e kore e taea e koe te mohio noa e hia te wa i whakapaua mo tenei Matawai Taurangi mena he ahua kohanga kei raro. Me titiro kaha tatou ki te kite mena he "tamariki" me nga taurangi herenga, nga CTE kei roto - me te tango i enei katoa "i o tatou hinengaro".
  • Ko te tohu tuarua: ko te wa e tohuhia ana ki te node te wa mahi node kotahi. Mēnā i mahia tēnei kōpuku nā te mea, hei tauira, he rekoata tepu i roto i te ripanga i nga wa maha, ka piki ake te maha o nga koropiko—huringa o tenei pona—i roto i te mahere. Engari ko te wa mahi ngota e noho rite tonu ana mo te mahere. Arā, kia mohio ai koe ki te roa o te mahi o tenei pona, me whakarea e koe tetahi mea ki tetahi atu - ano, "i to mahunga."

I enei ahuatanga, kia mohio koe "Ko wai te hononga ngoikore?" tata kore e taea. Na reira, ara nga kaiwhakawhanake i tuhi i roto i te "manual" e “Ko te mohio ki te mahere he mahi toi me ako, wheako...”.

Engari kei a matou 1000 nga kaihanga, a kaore e taea e koe te kawe i tenei wheako ki ia tangata. Ko ahau, ko koe, kei te mohio ia, engari ko tetahi o tera kua kore e mohio. Akene ka ako ia, kaore ranei, engari me mahi ia inaianei - a kei hea e whiwhi ai ia i tenei wheako?

Mahere tirohanga

No reira, i mohio matou ki te whakatutuki i enei raruraru, me hiahia te tirohanga pai o te mahere. [tuhinga]

Te arotautanga nui o nga patai PostgreSQL. Kirill Borovikov (Tensor)

I haere tuatahi matou "ma te maakete" - me titiro ki runga ipurangi kia kite he aha nga mea e noho ana.

Engari i puta mai he iti noa nga rongoa "ora" ka nui ake, iti ake ranei te whakawhanake - ko te tikanga, kotahi anake: whakamārama.depesz.com na Hubert Lubaczewski. Ka uru ana koe ki te mara "whangai" he whakaaturanga kuputuhi mo te mahere, ka whakaatu koe i tetahi ripanga me nga raraunga kua tohua:

  • te wa tukatuka o te node
  • te wa katoa mo te rakau iti katoa
  • te maha o nga rekoata i tikina mai i tumanakohia
  • te tinana node ake

Kei tenei ratonga hoki te kaha ki te tiri i tetahi puranga hononga. I makahia e koe to mahere ki reira ka kii: "E, Vasya, he hononga tenei, he he kei reira."

Te arotautanga nui o nga patai PostgreSQL. Kirill Borovikov (Tensor)

Engari he iti ano nga raruraru.

Tuatahi, he nui te "kopi-whakapiri". Ka mau koe i tetahi wahi o te poro, ka mau ki roto, ka hoki ano, ka hoki ano.

Tuarua, kahore he tātaritanga o te nui o nga raraunga ka panuitia — ko nga parepare e whakaputa ana EXPLAIN (ANALYZE, BUFFERS), kaore matou e kite i konei. Kaore ia e mohio ki te whakakore i a raatau, ki te mohio ki a raatau me te mahi tahi me ratou. Ina panui koe i te maha o nga raraunga me te mohio kei te pohehe koe i te kopae me te keteroki mahara, he mea nui enei korero.

Ko te tuatoru o nga tohu kino ko te tino ngoikore o te whanaketanga o tenei kaupapa. He iti rawa nga mahi, he pai mena kotahi ia ono marama, kei Perl te waehere.

Te arotautanga nui o nga patai PostgreSQL. Kirill Borovikov (Tensor)

Engari he "waiata" katoa tenei, ka taea e taatau te noho me tenei, engari tera ano tetahi mea i tino tahuri ke atu tatou i tenei ratonga. He hapa enei i roto i te tātaritanga o te Whakaaturanga Ripanga Taunoa (CTE) me nga momo pona hihiri penei i a InitPlan/SubPlan.

Mena ka whakapono koe ki tenei pikitia, ka nui ake te tapeke o te wa mahi o ia pona takitahi i te tapeke o te wa mahi o te tono katoa. He ngawari noa - ko te wa whakatipuranga o tenei CTE kaore i tangohia mai i te CTE Scan node. No reira, kua kore matou e mohio ki te whakautu tika mo te roa o te karapa CTE ake.

Te arotautanga nui o nga patai PostgreSQL. Kirill Borovikov (Tensor)

Katahi matou ka mohio kua tae ki te wa ki te tuhi i a maatau ake - hurray! Ka kii nga kaiwhakawhanake: "Na, ka tuhia e maatau ake, ka tino ngawari!"

I tangohia e matou he puranga mo nga ratonga tukutuku: he matua i runga i te Node.js + Express, i whakamahia a Bootstrap me D3.js mo nga hoahoa ataahua. A i tino tika o maatau tumanako - ka whiwhi matou i te tauira tuatahi i roto i nga wiki e 2:

  • kaitoha mahere ritenga
    Arā, inaianei ka taea e tatou te tarai i tetahi mahere mai i nga mea i hangaia e PostgreSQL.
  • te tātari tika o nga pona hihiri - CTE Scan, InitPlan, Subplan
  • te tātaritanga o te tohatoha parare - kei hea nga wharangi raraunga ka panuihia mai i te mahara, kei hea mai i te keteroki rohe, kei hea mai i te kōpae
  • kua marama
    Kia kore ai e "keri" enei mea katoa i roto i te raarangi, engari kia kite tonu i te "hononga ngoikore" i te pikitia.

Te arotautanga nui o nga patai PostgreSQL. Kirill Borovikov (Tensor)

I whiwhi matou i tetahi mea penei, me te tohu wetereo kei roto. Engari i te nuinga o te waa kaore a maatau kaiwhakawhanake e mahi me te whakaaturanga katoa o te mahere, engari me te mea poto ake. I muri i nga mea katoa, kua oti ke i a maatau nga nama katoa ka whiua ki te taha maui me te taha matau, kei waenganui ka waiho ko te rarangi tuatahi anake, he aha te ahua o te node: CTE Scan, CTE generation or Seq Scan e ai ki etahi tohu.

Koinei te tohu whakapoto e kiia nei e matou tauira mahere.

Te arotautanga nui o nga patai PostgreSQL. Kirill Borovikov (Tensor)

He aha atu ka watea? He pai ki te kite he aha te wahanga o to tatou wa katoa ka tohatohahia ki te kohanga - ka "piri" ki te taha mahere papa.

Ka tohu matou ki te node ka kite - ka kitea he iti iho i te hauwha o te wa katoa a Seq Scan, a ko te toenga 3/4 i tangohia e CTE Scan. Te wehi! He korero iti tenei mo te "tere o te ahi" o CTE Scan mena ka kaha koe ki te whakamahi i a raatau i o patai. Kaore i te tino tere - he iti ake i te matawai tepu i ia wa. [tuhinga] [tuhinga]

Engari i te nuinga o te waa he pai ake, he uaua ake, ka tohu tonu tatou ki tetahi waahanga ka kite, hei tauira, neke atu i te haurua o te waa ka "kai" etahi Seq Scan. I tua atu, he ahua o te Tatari i roto, he maha nga rekoata i whakakorehia e ai ki a ia ... Ka taea e koe te maka tika i tenei pikitia ki te kaiwhakawhanake me te kii: "Vasya, he kino nga mea katoa i konei mo koe! Whakaarohia, titiro - kei te he tetahi!"

Te arotautanga nui o nga patai PostgreSQL. Kirill Borovikov (Tensor)

Ko te tikanga, i uru etahi "rake".

Ko te mea tuatahi i kitea e matou ko te raruraru whakaawhiwhi. Ko te wa o ia node takitahi i roto i te mahere ka tohuhia me te tika o te 1 μs. A, ka nui ake te maha o nga huringa node, hei tauira, 1000 - i muri i te mahi ka wehewehea a PostgreSQL "i roto i te tika", katahi ka tatauhia te hokinga ka whiwhi tatou i te wa katoa "i waenganui i te 0.95ms me te 1.05ms". Ka eke te tatau ki nga microhekona, ka pai tena, engari i te mea kua [mili] hēkona, me whai whakaaro koe ki enei korero ka "tango" nga rauemi ki nga pona o te mahere "na wai i pau".

Te arotautanga nui o nga patai PostgreSQL. Kirill Borovikov (Tensor)

Ko te take tuarua, he uaua ake, ko te tohatoha o nga rauemi (ena putunga) i waenga i nga pona hihiri. He utu tenei mo nga wiki 2 tuatahi o te tauira me etahi atu wiki e 4.

He tino ngawari ki te tiki i tenei momo raru - ka mahia e matou he CTE me te mahara ka panuihia tetahi mea kei roto. Inaa, he "mohio" a PostgreSQL, kaore e panui i tetahi mea ki reira. Na ka tangohia e matou te rekoata tuatahi mai i a ia, me te kotahi rau tuatahi mai i te CTE kotahi.

Te arotautanga nui o nga patai PostgreSQL. Kirill Borovikov (Tensor)

Ka titiro matou ki te mahere me te maarama - he mea rereke, e 3 nga papa (whrangi raraunga) "kua pau" ki te Seq Scan, 1 ki te CTE Scan, me te 2 ki te tuarua o te CTE Scan. Arā, ki te whakarāpopotohia ngā mea katoa, ka whiwhi 6, engari mai i te papa e 3 noa iho te panui! Kaore a CTE Scan e panui i tetahi mea mai i hea, engari ka mahi tika me te mahara o te tukanga. Arā, he tino he kei konei!

Ko te tikanga, ka puta ko enei katoa nga wharangi e 3 o nga raraunga i tonoa mai i a Seq Scan, tuatahi 1 i tono mo te 1st CTE Scan, katahi ko te 2nd, me te 2 atu i panuitia ki a ia. E 3 nga wharangi i panuihia nga raraunga, ehara i te 6.

Te arotautanga nui o nga patai PostgreSQL. Kirill Borovikov (Tensor)

A, na tenei pikitia i mohio tatou ko te mahinga o te mahere ehara i te rakau, engari he momo kauwhata acyclic noa. Na ka whiwhi tatou i tetahi hoahoa penei, kia mohio tatou "he aha te take i puta mai i te tuatahi." Arā, i konei i hangahia e matou he CTE mai i te pg_class, ka tono kia rua nga wa, a tata katoa o matou wa i pau i runga i te peka i te tono tuarua. E marama ana ko te panui i te urunga 2 he nui ake te utu i te panui noa i te urunga tuatahi mai i te papa.

Te arotautanga nui o nga patai PostgreSQL. Kirill Borovikov (Tensor)

Ka pupuhi matou mo tetahi wa. Ka mea ratou: “Na, Neo, e mohio ana koe ki te kung fu! Inaianei kua tika to maatau wheako ki to mata. Inaianei ka taea e koe te whakamahi." [tuhinga]

Te whakatōpū rangitaki

Ko o matou kaiwhakawhanake 1000 te manawa o te manawa. Engari i mohio matou he rau noa nga kaitoro "whawhai", a ko enei "kape-whakapiri" katoa i te taha o nga kaihanga kaore i te watea. I mohio matou me kohi e matou.

Te arotautanga nui o nga patai PostgreSQL. Kirill Borovikov (Tensor)

I te nuinga o te waa, he waahanga paerewa ka taea te kohi tatauranga, heoi, me whakahohe ano i roto i te whirihora - tenei kōwae pg_stat_statements. Engari kaore ia i pai ki a maatau.

Tuatahi, ka tautapa ki nga patai kotahi ma te whakamahi i nga kaupapa rereke i roto i te papaunga raraunga kotahi UiuiId rereke. Arā, ki te mahi tuatahi koe SET search_path = '01'; SELECT * FROM user LIMIT 1;a muri iho SET search_path = '02'; me te tono ano, katahi ka rereke nga rekoata o nga tatauranga o tenei waahanga, kaore au e kaha ki te kohi tatauranga whanui i roto i te horopaki o tenei whaarangi tono, me te kore e whai whakaaro ki nga kaupapa.

Ko te take tuarua i aukati i a maatau ki te whakamahi ko te kore o nga mahere. Arā, karekau he mahere, ko te tono anake. Ka kite matou he aha te mea i puhoi haere, engari kaore matou e mohio he aha. Na i konei ka hoki ano tatou ki te raru o te huinga raraunga tere huri.

Na te wa whakamutunga - kore o "meka". Arā, kaore e taea e koe te whakatika i tetahi tauira o te mahi uiui - kaore he mea, he tatauranga whakahiato anake. Ahakoa ka taea te mahi me tenei, he tino uaua.

Te arotautanga nui o nga patai PostgreSQL. Kirill Borovikov (Tensor)

Na reira, i whakatau matou ki te whawhai ki te kape-piri ka timata ki te tuhi kohikohi.

Ka hono te kaikohi ma te SSH, ka whakatuu he hononga haumaru ki te tūmau me te pātengi raraunga mā te whakamahi i te tiwhikete, me te tail -F "piri" ki a ia i roto i te konae rangitaki. Na i tenei wahanga whiwhi tatou i te "whakaata" oti o te kōnae rangitaki katoa, ka mahia e te tūmau. He iti noa te kawenga i runga i te kaimau, na te mea kaore matou e tarai i tetahi mea ki reira, ka whakaata noa matou i nga waka.

I te mea kua timata matou ki te tuhi i te atanga ki Node.js, i haere tonu matou ki te tuhi i te kaikohi ki roto. Na tenei hangarau kua whakatika ake, no te mea he tino watea ki te whakamahi i te JavaScript ki te mahi me nga raraunga kuputuhi whakahōputu ngoikore, ko te raarangi. A ko te hangahanga Node.js ake ano he papamuri ka taea e koe te mahi ngawari me te watea ki nga hononga whatunga, me nga awa raraunga.

Na reira, ka "totoro" nga hononga e rua: ko te tuatahi ki te "whakarongo" ki te raarangi ka mau ki a tatou ano, ko te tuarua ki te patai i te turanga. "Engari ko te raarangi e whakaatu ana kua aukatihia te tohu me te oid 123," engari kaore tenei e whai tikanga ki te kaiwhakawhanake, a he pai ki te patai ki te paataka raraunga, "He aha te OID = 123?" Na ka patai taatau ki te turanga kaore ano kia mohiohia mo tatou ano.

Te arotautanga nui o nga patai PostgreSQL. Kirill Borovikov (Tensor)

"Kotahi noa te mea kaore koe i aro, he momo pi rite ki te arewhana!.." I timata matou ki te whakawhanake i tenei punaha i te wa e hiahia ana matou ki te aro turuki i nga kaitoro 10. Ko te mea tino nui i roto i to maatau maarama, i puta mai etahi raru he uaua ki te whakatutuki. Engari i te hauwhā tuatahi, kotahi rau i whakawhiwhia ki a matou mo te aro turuki - na te mea i mahi te punaha, i pirangi nga tangata katoa, i pai te katoa.

Ko enei mea katoa me taapiri ake, he nui te rere o te raraunga me te kaha. Ko te mea pono, ko ta tatou e aro turuki ana, ko nga mea ka taea e tatou te mahi, ko ta tatou e whakamahi. Ka whakamahia ano e matou te PostgreSQL hei rokiroki raraunga. A kaore he mea tere ki te "ringihia" nga raraunga ki roto i te kaiwhakahaere COPY Kaore ano.

Engari ko te "ringihanga" noa nga raraunga ehara i ta maatau hangarau. Na te mea mena kei a koe te 50k tono mo ia hekona i runga i te rau tūmau, ka puta mai he 100-150GB o nga raarangi ia ra. Na reira, me ata "tapahia" te turanga.

Tuatahi, i mahia e matou wehewehe i te ra, no te mea, i te nuinga o te waa, kaore he tangata e aro ki te hononga i waenga i nga ra. He aha te rereketanga o nga mea i riro ia koe inanahi, mena i tenei po ka tukuna e koe he putanga hou o te tono - me etahi tatauranga hou.

Tuarua, i ako matou (i akina) tino, tino tere ki te tuhi ma te whakamahi COPY. Arā, ehara i te mea noa COPYno te mea he tere ake ia INSERT, me te tere ake.

Te arotautanga nui o nga patai PostgreSQL. Kirill Borovikov (Tensor)

Ko te tuatoru o nga korero - me tika ahau whakarerea nga keu, ia, me nga taviri ke. Arā, karekau he tapatahi tohutoro. No te mea mena he ripanga kei a koe he rua o nga FK, a ka kii koe i roto i te hanganga papaa raraunga "enei he rekoata rangitaki e tohuhia ana e FK, hei tauira, ki te roopu o nga rekoata," katahi ka whakauruhia e koe, PostgreSQL kaore he mea i toe engari me pehea te tango me te mahi pono SELECT 1 FROM master_fk1_table WHERE ... me te tohu tohu e ngana ana koe ki te whakauru - ki te tirotiro kei te noho tenei rekoata ki reira, kei "waahi" tenei Kī Tawahi me to whakauru.

Engari i te rekoata kotahi ki te teepu whainga me ona tohu, ka whiwhi tatou i te painga taapiri o te panui mai i nga ripanga katoa e korero ana. Engari kaore matou e hiahia ana - ko ta matou mahi ko te tuhi i nga mea e taea ana me te tere me te iti rawa o te kawenga. No reira FK - ki raro!

Ko te waahi e whai ake nei ko te whakahiato me te hashing. I te timatanga, i whakatinanahia e matou i roto i te papaaarangi - i muri i nga mea katoa, he pai ki te wa tonu, ka tae mai he rekoata, mahia i roto i etahi momo papa. "me te tahi" tika i roto i te keu. Ae, he watea, engari ko te mea kino ano - ka whakauru koe i tetahi rekoata, engari ka akiaki koe ki te panui me te tuhi i tetahi atu mea mai i tetahi atu tepu. I tua atu, ehara i te mea ko koe anake te panui me te tuhi, kei te mahi ano koe i nga wa katoa.

Inaianei whakaarohia he ripanga kei a koe te tatau noa i te maha o nga tono kua paahitia e tetahi kaihautu motuhake: +1, +1, +1, ..., +1. A ko koe, ko te tikanga, kaore e hiahiatia tenei - ka taea katoa moni i roto i te mahara i runga i te kaikohi ka tuku ki te papaa raraunga i te wa kotahi +10.

Ae, mena ka raru etahi raru, ka "pakaru" to pono arorau, engari he keehi tino kore tenei - na te mea he tūmau noa koe, he pākahiko kei roto i te kaiwhakahaere, kei a koe he raarangi tauwhitinga, he raarangi kei runga pūnaha kōnae... I te nuinga, ehara i te mea utu. Ko te ngaronga o te hua ka riro mai i a koe mai i te whakahaere keu/FK kare he utu mo nga whakapaunga ka utua e koe.

He rite ano ki te hashing. Ka rere atu tetahi tono ki a koe, ka tatauhia e koe tetahi tohu i roto i te paataka raraunga, tuhia ki te paataka korero ka korero ki te katoa. Kei te pai nga mea katoa tae noa ki te wa o te rekoata, ka tae mai tetahi tangata tuarua ki a koe e hiahia ana ki te tuhi i taua mea ano - ka aukatia koe, he kino kee tenei. Na reira, ki te taea e koe te whakawhiti i te whakatipuranga o etahi ID ki te kiritaki (e pa ana ki te paataka raraunga), he pai ake te mahi i tenei.

He tino pai mo matou ki te whakamahi i te MD5 mai i te tuhinga - tono, mahere, tauira,... Ka tatauhia e matou ki te taha kaikohi, ka "ringihia" te ID kua oti te hanga ki roto i te paataka raraunga. Ko te roa o te MD5 me te wehewehe i ia ra ka taea e matou te kore e awangawanga mo nga tukinga ka taea.

Te arotautanga nui o nga patai PostgreSQL. Kirill Borovikov (Tensor)

Engari kia tere te tuhi i enei mea katoa, me whakarereke e matou te tikanga tuhi.

Me pehea te tuhi raraunga i te nuinga o te waa? Kei a matou etahi momo huingararaunga, ka wehewehea kia maha nga ripanga, katahi ka TAPUIA - tuatahi ki te tuatahi, katahi ki te tuarua, ki te tuatoru... He rawe, na te mea kei te tuhi matou i tetahi awa raraunga kia toru nga kaupae. raupapa. He kino. Ka taea te tere ake? Ka taea!

Ki te mahi i tenei, he nui noa ki te whakarara i enei rerenga kia rite ki a raatau ano. Te ahua nei kei a matou he hapa, he tono, he tauira, he aukati, ... e rere ana i roto i nga miro motuhake - ka tuhia katoatia ki te whakarara. Kati mo tenei kia tuwhera tonu he hongere KAUPAPA mo ia ripanga whainga takitahi.

Te arotautanga nui o nga patai PostgreSQL. Kirill Borovikov (Tensor)

Arā, i te kaikohi he awa tonu, ka taea e au te tuhi i nga raraunga e hiahiatia ana e au. Engari kia kite te putunga raraunga i enei raraunga, kia kore ai tetahi e mau ki te tatari kia tuhia enei raraunga, Me haukotia te COPY i etahi wa. Ki a matou, ko te waa tino whai hua ko te 100ms - ka kati ka whakatuwherahia ano ki te teepu kotahi. A, ki te kore e ranea te rere kotahi i te waa o etahi tihi, katahi ka whakahiato tatou ki tetahi rohe.

I tua atu, i kitea e maatau mo te ahua o te utaina, he kino nga whakahiatotanga, ina kohia nga rekoata ki nga roopu. Ko te kino tawhito INSERT ... VALUES me etahi atu rekoata 1000. Na te mea i tera wa kei a koe te tihi tuhi i runga i te papapāho, ko te hunga katoa e ngana ana ki te tuhi i tetahi mea ki te kōpae ka tatari.

Hei whakakore i enei momo rereke, kaua e whakahiato noa tetahi mea, kaua rawa e parepare. A, ki te puta mai te aukati ki te kōpae (waimarie, ko te Stream API i Node.js ka taea e koe te mohio) - whakaroa tenei hononga. Ina whiwhi koe i tetahi huihuinga kua kore utu ano, tuhia mai i te rarangi whakaemi. A, i te wa e pukumahi ana, tangohia te mea kore utu i muri mai i te puna kaukau ka tuhi ki a ia.

I mua i te whakauru i tenei huarahi ki te tuhi raraunga, tata ki te 4K nga mahi tuhi, a na tenei huarahi i whakaitihia e matou te kawenga ma te 4 nga wa. Inaianei kua piki ake ano e 6 nga wa na runga i nga papaunga raraunga hou kua tirohia - tae atu ki te 100MB/s. Inaianei kei te rongoa matou i nga raarangi mo nga marama 3 kua hipa i roto i te 10-15TB te rahi, me te tumanako i roto i nga marama e toru ka taea e tetahi kaiwhakawhanake te whakaoti rapanga.

E mohio ana matou ki nga raruraru

Engari ko te kohikohi noa i enei raraunga katoa he pai, he whai hua, he whaitake, engari kaore i te nui - me mohio. No te mea he miriona nga mahere rereke i ia ra.

Te arotautanga nui o nga patai PostgreSQL. Kirill Borovikov (Tensor)

Engari he maha nga miriona kaore e taea te whakahaere, me mahi "iti". A, tuatahi, me whakatau koe me pehea e whakarite ai koe i tenei mea "iti".

Kua kitea e matou e toru nga kaupapa matua:

  • ko wai i tukuna tenei tono
    Arā, he aha te tono i "tae mai": te atanga tukutuku, te tuara, te punaha utu, tetahi atu mea ranei.
  • te wahi tupu te reira
    I runga i tehea tūmau motuhake? Na te mea he maha o nga kaitoro i raro i te tono kotahi, a ka ohorere tetahi "ka porangi" (na te mea "kua pirau te kōpae", "kua paheke te mahara", he raru ke atu), katahi ka hiahia koe ki te whakatika i te tūmau.
  • pehea i puta mai te raruraru i tetahi huarahi

Kia mohio ai "na wai" i tuku tono mai, ka whakamahia e matou he taputapu paerewa - te whakarite i te taurangi wahanga: SET application_name = '{bl-host}:{bl-method}'; - ka tukuna e matou te ingoa o te kaihautu arorau pakihi i puta mai ai te tono, me te ingoa o te tikanga, te tono ranei i timata ai.

I muri i to maatau tuku i te "rangatira" o te tono, me whakaputa ki te raarangi - mo tenei ka whirihorahia e matou te taurangi log_line_prefix = ' %m [%p:%v] [%d] %r %a'. Mo te hunga hiahia, pea titiro i roto i te pukapukahe aha te tikanga katoa. Te ahua nei ka kite tatou i te raarangi:

  • время
  • tukanga me nga tohu tauwhitinga
  • ingoa pātengi raraunga
  • IP o te tangata nana tenei tono
  • me te ingoa tikanga

Te arotautanga nui o nga patai PostgreSQL. Kirill Borovikov (Tensor)

Na ka mohio matou ehara i te mea tino pai ki te titiro ki te hononga mo te tono kotahi i waenga i nga kaitoro rereke. Ehara i te nuinga o nga wa kei a koe tetahi ahuatanga ka huri noa tetahi tono ki konei, ki reira. Engari ahakoa he rite tonu, tirohia tetahi o enei tūmau.

Na konei te tapahi "kotahi tūmau - kotahi ra" i puta mai he nui mo tatou mo tetahi tātaritanga.

He rite tonu te waahanga tātari tuatahi "tauira" - he ahua whakapoto o te whakaaturanga o te mahere, kua whakakorehia nga tohu tau katoa. Ko te tapahi tuarua ko te tono, tikanga ranei, ko te tapahi tuatoru ko te pona mahere motuhake i raru ai matou.

I te neke mai i nga waahanga motuhake ki nga tauira, e rua nga painga i te wa kotahi:

  • te whakahekenga maha i te maha o nga mea hei tātari
    Me tātarihia e tatou te raru, kaua ma nga mano o nga patai, ma nga mahere ranei, engari ma te maha o nga tauira.
  • rārangi wā
    Arā, ma te whakarāpopoto i nga "meka" i roto i tetahi waahanga, ka taea e koe te whakaatu i o raatau ahua i te ra. I konei ka mohio koe mena he momo tauira kei a koe, hei tauira, kotahi i te haora, engari me mahi kotahi i ia ra, me whakaaro koe he aha te he - na wai te take me te aha, tera pea kei konei. kaua e tika. Koinei tetahi atu tikanga tātari kore-tau, he tirohanga noa.

Te arotautanga nui o nga patai PostgreSQL. Kirill Borovikov (Tensor)

Ko nga tikanga e toe ana kei runga i nga tohu ka tangohia mai i te mahere: e hia nga wa i puta mai ai taua tauira, te tapeke me te wa toharite, te nui o nga raraunga i panuitia mai i te kōpae, me te nui o te mahara...

No te mea, hei tauira, ka tae mai koe ki te wharangi tātaritanga mo te kaihautu, titiro - kei te timata tetahi mea ki te panui nui rawa atu i runga i te kōpae. Kare e taea e te kopae kei runga i te tūmau te whakahaere - ma wai e panui mai?

A ka taea e koe te whakariterite ma tetahi pou ka whakatau he aha taau e mahi i tenei wa - ko te kawenga i runga i te tukatuka, i te kopae ranei, te tapeke ranei o nga tono... I tohua e matou, i titiro ki nga mea "runga", whakatika ka i hurihia he putanga hou o te tono.
[kauhau ataata]

Na ka kite koe i nga tono rereke ka tae mai me te tauira ano mai i te tono penei SELECT * FROM users WHERE login = 'Vasya'. Tuhinga o mua, tuara, tukatuka ... A ka miharo koe he aha te tukatuka ka panui te kaiwhakamahi ki te kore ia e taunekeneke ki a ia.

Ko te huarahi rereke ko te kite tonu mai i te tono he aha tana mahi. Hei tauira, ko te pito o mua ko tenei, ko tenei, ko tenei, ko tenei kotahi i te haora (ka awhina te rarangi waahi). Na ka puta ake te patai: te ahua nei ehara i te mahi a te mua ki te mahi i tetahi mea kotahi i te haora ...

Te arotautanga nui o nga patai PostgreSQL. Kirill Borovikov (Tensor)

I muri i etahi wa, ka mohio matou kua kore matou e whakahiato tatauranga ma nga pona mahere. I wehea e matou mai i nga mahere ko nga pona anake e mahi ana me nga raraunga o nga ripanga ake (panui/tuhia ma te taurangi, kaore ranei). Inaa, kotahi noa te waahanga ka taapirihia ki te pikitia o mua - e hia nga rekoata i kawea mai e tenei pona ki a matou?, me te maha i makahia (Nga Rarangi i Tangohia e te Tatari).

Karekau he taurangi tika i runga i te pereti, ka tono koe, ka rere ki mua i te taurangi, ka taka ki Seq Scan... kua tātarihia e koe nga rekoata katoa engari kotahi. He aha koe e hiahia ai kia 100M nga rekoata kua tātarihia ia ra? Ehara i te mea pai ake te huri i te taurangi?

Te arotautanga nui o nga patai PostgreSQL. Kirill Borovikov (Tensor)

I te wetewete i te katoa o nga mahere node i te node, ka mohio matou tera ano etahi hanganga angamaheni kei roto i nga mahere e tino kitea ana he pohehe. A he pai ki te korero ki te kaiwhakawhanake: "E hoa, i konei ka panui koe ma te taurangi, ka tohua, ka tapahia" - hei tikanga, he rekoata kotahi.

Ko nga tangata katoa i tuhi patai kua pa ki tenei tauira: "Homai ki ahau te ota whakamutunga mo Vasya, tona ra." A, ki te kore koe e whai taurangi mo te ra, kaore ranei he ra i roto i te taurangi i whakamahia e koe, katahi koe ka takahanga i runga i te rite tonu "rake" .

Engari e mohio ana matou he "rake" tenei - na te aha e kore e korero wawe ki te kaiwhakawhanake me aha ia. Na reira, i te wa e whakatuwhera ana i tetahi mahere inaianei, ka kite tonu to maatau kaiwhakawhanake i tetahi pikitia ataahua me nga tohutohu, ka kii tonu ratou ki a ia: "He raruraru kei a koe, engari kua whakatauhia i tenei huarahi me tera."

Ko te mutunga, ko te nui o nga wheako i hiahiatia hei whakaoti rapanga i te timatanga, a inaianei kua tino heke. Koinei te momo taputapu kei a matou.

Te arotautanga nui o nga patai PostgreSQL. Kirill Borovikov (Tensor)

Source: will.com

Tāpiri i te kōrero