ʻO ka loiloi nui o nā nīnau PostgreSQL. Kirill Borovikov (Tensor)

Hōʻike ka hōʻike i kekahi mau ala e hiki ai e nānā i ka hana o nā nīnau SQL inā he miliona o lākou i kēlā me kēia lā, a he mau haneli o nā kikowaena PostgreSQL i nānā ʻia.

He aha nā ʻenehana loea e ʻae iā mākou e hoʻoponopono pono i ka nui o ka ʻike, a pehea e maʻalahi ai ke ola o kahi mea hoʻomohala maʻamau?


ʻO wai ka hoihoi? ka nānā ʻana i nā pilikia kikoʻī a me nā ʻano loea loiloi like ʻole Nā nīnau SQL a me ka hoʻoponopono ʻana i nā pilikia DBA maʻamau ma PostgreSQL - hiki iā ʻoe heluhelu i ka mooolelo ma keia kumuhana.

ʻO ka loiloi nui o nā nīnau PostgreSQL. Kirill Borovikov (Tensor)
ʻO Kirill Borovikov koʻu inoa, ke kū nei au Hui Tensor. ʻO ke kikoʻī, loea wau i ka hana ʻana me nā ʻikepili i kā mākou hui.

I kēia lā, e haʻi wau iā ʻoe pehea mākou e hoʻomaikaʻi ai i nā nīnau, inā ʻaʻole pono ʻoe e "koho" i ka hana o kahi nīnau hoʻokahi, akā e hoʻoponopono i ka pilikia ma ka lehulehu. Ke loaʻa nā miliona o nā noi, a pono ʻoe e ʻimi i kekahi hoʻokokoke i ka hoʻonā keia pilikia nui.

Ma ka laulā, ʻo Tensor no ka miliona o kā mākou mea kūʻai aku ʻO VLSI kā mākou noi: ka hui kaiaulu, nā hoʻonā no ke kamaʻilio wikiō, no ka holo palapala i loko a me waho, nā ʻōnaehana helu no ka helu helu a me nā hale kūʻai, ... ʻo ia hoʻi, he "mega-hui" no ka hoʻokele ʻoihana hoʻohui, aia ma mua o 100 mau ʻokoʻa. nā papahana kūloko.

No ka hōʻoia ʻana e hana lākou a hoʻomohala maʻamau, loaʻa iā mākou 10 mau kikowaena hoʻomohala a puni ka ʻāina, me nā mea hou aku i loko o lākou 1000 mea hoʻomohala.

Ua hana pū mākou me PostgreSQL mai ka makahiki 2008 a ua hōʻiliʻili i ka nui o nā mea a mākou e hana ai - ka ʻikepili o ka mea kūʻai aku, helu helu, analytical, ʻikepili mai nā ʻōnaehana ʻike waho - ʻoi aku ma mua o 400TB. Aia ma kahi o 250 mau kikowaena i ka hana wale ʻana, a ma ka huina he 1000 mau kikowaena waihona a mākou e nānā ai.

ʻO ka loiloi nui o nā nīnau PostgreSQL. Kirill Borovikov (Tensor)

ʻO SQL kahi ʻōlelo hoʻolaha. ʻAʻole ʻoe e wehewehe "pehea" e hana ai kekahi mea, akā "he aha" āu e makemake ai e hoʻokō. ʻIke maikaʻi ka DBMS pehea e hana ai i kahi JOIN - pehea e hoʻopili ai i kāu mau papaʻaina, he aha nā kūlana e kau ai, he aha ka mea e hele ai i ka index, he aha ka mea ʻole ...

Ua ʻae kekahi mau DBMS i nā ʻōlelo aʻoaʻo: "ʻAʻole, e hoʻopili i kēia mau papa ʻelua i kēlā me kēia laina," akā ʻaʻole hiki i PostgreSQL ke hana i kēia. ʻO kēia ke kūlana noʻonoʻo o nā mea hoʻomohala alakaʻi: "Makemake mākou e hoʻopau i ka huli ʻimi noiʻi ma mua o ka ʻae ʻana i nā mea hoʻomohala e hoʻohana i kekahi ʻano hōʻailona."

Akā, ʻoiai ʻaʻole ʻae ʻo PostgreSQL i ka "waho" e hoʻomalu iā ia iho, hiki iā ia ke ʻae e ʻike i nā mea e hana nei i loko onake holo ʻoe i kāu nīnau, a ma hea e pilikia ai.

ʻO ka loiloi nui o nā nīnau PostgreSQL. Kirill Borovikov (Tensor)

Ma keʻano laulā, he aha nā pilikia maʻamau i loaʻa i kahi mea hoʻomohala [i kahi DBA]? “Maanei ua hooko makou i ke noi, a lohi nā mea a pau me mākou, ke kau nei nā mea a pau, ke hana nei kekahi mea... Kekahi ʻano pilikia!”

Ua aneane like na kumu:

  • algorithm nīnau kūpono ʻole
    Mea hoʻomohala: "I kēia manawa ke hāʻawi nei au iā ia i nā papa 10 ma SQL ma o JOIN ..." - a ke manaʻo nei e hoʻokō maikaʻi ʻia kāna mau kūlana "hoʻopaʻa ʻia" a loaʻa koke iā ia nā mea āpau. Akā ʻaʻole hiki ke hana mana, a ʻo kēlā me kēia ʻōnaehana me kēlā ʻano like ʻole (10 papa i hoʻokahi FROM) hāʻawi mau i kekahi ʻano hewa. ['atikala]
  • ʻikepili pili ʻole
    He mea pili loa kēia wahi no PostgreSQL, i ka wā i "nini ai" ʻoe i kahi ʻikepili nui ma luna o ke kikowaena, e noi, a "sexcans" kāu papa. No ka mea i nehinei he 10 mau moʻolelo i loko, a i kēia lā he 10 miliona, akā ʻaʻole ʻike ʻo PostgreSQL i kēia, a pono mākou e haʻi e pili ana iā ia. ['atikala]
  • "hoʻopili" i nā kumuwaiwai
    Ua hoʻokomo ʻoe i kahi ʻikepili nui a paʻa nui i kahi kikowaena nāwaliwali ʻaʻole lawa ka disk, ka hoʻomanaʻo, a i ʻole ka hana ʻōnaehana. A ʻo ia wale nō ... Aia ma kahi o kahi keʻena hana ma luna a hiki ʻole iā ʻoe ke lele hou.
  • ke ālai ʻana
    He wahi paʻakikī kēia, akā pili lākou i nā nīnau hoʻololi like ʻole (INSERT, UPDATE, DELETE) - he kumuhana nui kaʻawale kēia.

Loaʻa i kahi hoʻolālā

...A no nā mea ʻē aʻe a mākou pono i kahi hoʻolālā! Pono mākou e ʻike i ka mea e hana nei i loko o ke kikowaena.

ʻO ka loiloi nui o nā nīnau PostgreSQL. Kirill Borovikov (Tensor)

ʻO kahi hoʻolālā hoʻokō nīnau no PostgreSQL kahi lāʻau o ka algorithm hoʻokō nīnau ma ka hōʻike kikokikona. ʻO ia ka algorithm i ʻike ʻia ʻo ia ka hopena o ka nānā ʻana e ka mea hoʻolālā.

ʻO kēlā me kēia kumu lāʻau kahi hana: kiʻi ʻana i ka ʻikepili mai ka papaʻaina a i ʻole ka papa kuhikuhi, ke kūkulu ʻana i kahi bitmap, ka hoʻohui ʻana i ʻelua papa, hoʻohui, intersecting, a haʻalele paha i nā koho. ʻO ka hoʻokō ʻana i kahi nīnau e pili ana i ka hele ʻana ma nā ʻōpū o kēia kumulāʻau.

No ka loaʻa ʻana o ka hoʻolālā nīnau, ʻo ke ala maʻalahi ke hoʻokō i ka ʻōlelo EXPLAIN. No ka loaʻa ʻana o nā ʻano maoli āpau, ʻo ia hoʻi, e hoʻokō maoli i kahi nīnau ma ke kumu - EXPLAIN (ANALYZE, BUFFERS) SELECT ....

ʻO ka ʻāpana maikaʻi ʻole: i ka wā e holo ai ʻoe, hiki mai "ma ʻaneʻi a i kēia manawa", no laila kūpono wale ia no ka debugging kūloko. Inā ʻoe e lawe i kahi kikowaena hoʻouka nui ʻia ma lalo o kahi kahe ikaika o nā loli ʻikepili, a ʻike ʻoe: "Oh! Eia kā mākou hana lohixia noi." ʻO ka hapalua hola, hoʻokahi hola i hala aku nei - ʻoiai ʻoe e holo ana a loaʻa kēia noi mai nā lāʻau, e hoʻihoʻi ana iā ia i ke kikowaena, ua hoʻololi ʻia kāu ʻikepili a me nā helu. Holo ʻoe iā ia e debug - a holo wikiwiki! A ʻaʻole hiki iā ʻoe ke hoʻomaopopo i ke kumu, no ke aha e lohi.

ʻO ka loiloi nui o nā nīnau PostgreSQL. Kirill Borovikov (Tensor)

I mea e hoʻomaopopo ai i ka mea i hana ʻia i ka manawa i hoʻokō ʻia ai ka noi ma ke kikowaena, kākau nā poʻe akamai auto_explain module. Aia ia ma kahi kokoke i nā māhele PostgreSQL maʻamau, a hiki ke hoʻāla ʻia i ka faila config.

Inā ʻike ʻo ia e holo lōʻihi ana kekahi noi ma mua o ka palena āu i haʻi ai iā ia, e hana ia "paʻi kiʻi" o ka hoʻolālā o kēia noi a kākau iā lākou i loko o ka log.

ʻO ka loiloi nui o nā nīnau PostgreSQL. Kirill Borovikov (Tensor)

Me he mea lā ua maikaʻi nā mea a pau i kēia manawa, hele mākou i ka lāʻau a ʻike i laila ... [text footcloth]. Akā ʻaʻole hiki iā mākou ke ʻōlelo i kekahi mea e pili ana iā ia, ʻokoʻa ka mea he hoʻolālā maikaʻi loa ia no ka mea he 11ms e hoʻokō ai.

Me he mea lā ua maikaʻi nā mea a pau - akā ʻaʻohe mea i maopopo i ka mea i hana maoli ʻia. Ma waho aʻe o ka manawa maʻamau, ʻaʻole mākou ʻike i kekahi mea. No ka mea, ʻaʻole ʻike ʻia ka nānā ʻana i kēlā "hipa" o ka kikokikona maʻamau.

Akā inā ʻaʻole maopopo, ʻoiai inā paʻakikī, aia nā pilikia koʻikoʻi:

  • Hōʻike ka node ka huina o nā kumuwaiwai o ke kumulāʻau holoʻokoʻa malalo ona. ʻO ia hoʻi, ʻaʻole hiki iā ʻoe ke ʻike i ka nui o ka manawa i hoʻopau ʻia ma kēia Index Scan inā aia kekahi ʻano nested ma lalo o ia. Pono mākou e nānā pono e ʻike inā aia nā "keiki" a me nā ʻano hoʻololi kūlana, nā CTE i loko - a unuhi i kēia "i loko o ko mākou mau manaʻo".
  • ʻO ka helu ʻelua: ʻo ka manawa i hōʻike ʻia ma ka node manawa hoʻokō node hoʻokahi. Inā hoʻokō ʻia kēia node ma muli o, no ka laʻana, e hoʻopaʻa ʻia kahi loop ma ka papa i nā manawa he nui, a laila e piʻi aʻe ka helu o nā puka lou—pōkole o kēia node—i ka papahana. Akā ʻo ka manawa hoʻokō atomic ponoʻī e like me ke ʻano o ka hoʻolālā. ʻO ia, no ka hoʻomaopopo ʻana i ka lōʻihi o ka hana ʻana o kēia node, pono ʻoe e hoʻonui i hoʻokahi mea me kekahi - hou, "i kou poʻo."

Ma ia mau kūlana, e hoʻomaopopo "ʻO wai ka loulou nāwaliwali?" aneane hiki ole. No laila, ʻo nā mea hoʻomohala iā lākou iho e kākau i ka "manual" i kēlā "ʻO ka hoʻomaopopo ʻana i kahi hoʻolālā he mea noʻonoʻo pono e aʻo ʻia, ʻike ...".

Akā, loaʻa iā mākou nā mea hoʻomohala 1000, a ʻaʻole hiki iā ʻoe ke haʻi i kēia ʻike i kēlā me kēia o lākou. ʻO wau, ʻo ʻoe, ʻike ʻo ia, akā ʻaʻole ʻike hou kekahi ma laila. E aʻo paha ʻo ia, a ʻaʻole paha, akā pono ʻo ia e hana i kēia manawa - a ma hea kahi e loaʻa ai kēia ʻike?

Hoʻolālā hoʻolālā

No laila, ua ʻike mākou i mea e hoʻoponopono ai i kēia mau pilikia, pono mākou ʻike maikaʻi i ka papahana. [ʻatikala]

ʻO ka loiloi nui o nā nīnau PostgreSQL. Kirill Borovikov (Tensor)

Ua hele mua mākou "ma ka mākeke" - e nānā mākou ma ka Pūnaewele e ʻike i nā mea e noho nei.

Akā ua ʻike ʻia he liʻiliʻi loa nā hopena "ola" i ʻoi aku a liʻiliʻi paha ka ulu ʻana - ʻoiaʻiʻo, hoʻokahi wale nō: explain.depesz.com na Hubert Lubaczewski. Ke komo ʻoe i ke kahua "feed" i kahi kikokikona o ka hoʻolālā, hōʻike ia iā ʻoe i kahi papa me nā ʻikepili i hoʻopaʻa ʻia:

  • ka manawa hana pono'ī o ka node
  • manawa piha no ka subtree holoʻokoʻa
  • ka helu o nā moʻolelo i kiʻi ʻia i manaʻo ʻia ma ka helu
  • ke kino node ponoi

Hiki i kēia lawelawe ke kaʻana like i kahi waihona o nā loulou. Ua hoʻolei ʻoe i kāu hoʻolālā i laila a ʻōlelo ʻoe: "ʻAe, Vasya, eia kahi loulou, aia kekahi mea ma laila."

ʻO ka loiloi nui o nā nīnau PostgreSQL. Kirill Borovikov (Tensor)

Akā, aia kekahi mau pilikia liʻiliʻi.

ʻO ka mea mua, ka nui o ka "kopi-paʻi". Lawe ʻoe i kahi ʻāpana o ka lāʻau, hoʻopaʻa i laila, a hou, a hou.

ʻO ka lua, ʻaʻole ka nānā ʻana i ka nui o ka ʻikepili i heluhelu ʻia - nā pale hoʻokahi i hoʻopuka EXPLAIN (ANALYZE, BUFFERS), ʻaʻole mākou ʻike ma ʻaneʻi. ʻAʻole ʻike ʻo ia i ka wehe ʻana iā lākou, hoʻomaopopo iā lākou a hana pū me lākou. Ke heluhelu nei ʻoe i nā ʻikepili he nui a ʻike ʻoe e kuhi hewa paha ʻoe i ka disk a me ka cache hoʻomanaʻo, he mea nui kēia ʻike.

ʻO ke kolu o ka manaʻo maikaʻi ʻole ʻo ia ka nāwaliwali loa o ka hoʻomohala ʻana o kēia papahana. He liʻiliʻi loa nā hana, maikaʻi inā hoʻokahi manawa i kēlā me kēia ʻeono mahina, a aia ke code ma Perl.

ʻO ka loiloi nui o nā nīnau PostgreSQL. Kirill Borovikov (Tensor)

Akā ʻo kēia nā "lyrics", hiki iā mākou ke ola me kēia, akā aia kekahi mea i hoʻohuli nui iā mākou mai kēia lawelawe. He mau hewa kēia i ka nānā ʻana o Common Table Expression (CTE) a me nā node ikaika like ʻole e like me InitPlan/SubPlan.

Inā manaʻoʻiʻo ʻoe i kēia kiʻi, a laila ʻoi aku ka nui o ka manawa hoʻokō o kēlā me kēia node ma mua o ka manawa hoʻokō o ka noi holoʻokoʻa. He maʻalahi - ʻaʻole i unuhi ʻia ka manawa hana o kēia CTE mai ka CTE Scan node. No laila, ʻaʻole mākou ʻike hou i ka pane pololei i ka lōʻihi o ka lawe ʻana i ka CTE scan ponoʻī.

ʻO ka loiloi nui o nā nīnau PostgreSQL. Kirill Borovikov (Tensor)

A laila ʻike mākou ua hiki i ka manawa e kākau i kā mākou iho - hurray! Wahi a kēlā me kēia mea hoʻomohala: "I kēia manawa e kākau mākou i kā mākou iho, e maʻalahi loa!"

Lawe mākou i kahi waihona maʻamau no nā lawelawe pūnaewele: kahi kumu i hoʻokumu ʻia ma Node.js + Express, hoʻohana iā Bootstrap a me D3.js no nā kiʻi nani. A ua hoʻāpono piha ʻia kā mākou mau manaʻolana - ua loaʻa iā mākou ka prototype mua i 2 mau pule:

  • parser hoʻolālā maʻamau
    ʻO ia, i kēia manawa hiki iā mākou ke hoʻokaʻawale i kekahi hoʻolālā mai nā mea i hana ʻia e PostgreSQL.
  • ka nānā pono ʻana i nā node dynamic - CTE Scan, InitPlan, SubPlan
  • ka nānā 'ana i ka pu'unaue pale - kahi e heluhelu ʻia ai nā ʻaoʻao ʻikepili mai ka hoʻomanaʻo ʻana, kahi mai ka cache kūloko, kahi mai kahi disk
  • loaa ka maopopo
    No laila,ʻaʻole e "eli" i kēia mau mea a pau i ka lāʻau, akā eʻike i ka "loulou nāwaliwali" koke i ke kiʻi.

ʻO ka loiloi nui o nā nīnau PostgreSQL. Kirill Borovikov (Tensor)

Loaʻa iā mākou kekahi mea e like me kēia, me ka syntax highlighting. Akā ma ka maʻamau, ʻaʻole hana hou kā mākou mea hoʻomohala me kahi hōʻike piha o ka hoʻolālā, akā me kahi pōkole. Ma hope o nā mea a pau, ua paʻi mākou i nā helu āpau a hoʻolei iā lākou i ka hema a me ka ʻākau, a ma ka waena mākou i waiho wale ai i ka laina mua, he aha ke ʻano o ka node: CTE Scan, CTE generation or Seq Scan e like me kekahi hōʻailona.

ʻO kēia ka hōʻike pōkole a mākou e kapa nei papa hoʻolālā.

ʻO ka loiloi nui o nā nīnau PostgreSQL. Kirill Borovikov (Tensor)

He aha hou aʻe e maʻalahi? He mea maʻalahi ke ʻike i ka mahele o kā mākou manawa holoʻokoʻa i hāʻawi ʻia i kahi node - a "hoʻopili" wale i ka ʻaoʻao. pakuhi pai.

Kuhi mākou i ka node a ʻike - ua ʻike ʻia ua lawe ʻo Seq Scan i ka hapaha o ka manawa a pau, a ua lawe ʻia ke koena 3/4 e CTE Scan. Weliweli! He palapala liʻiliʻi kēia e pili ana i ka "rate of fire" o CTE Scan inā hoʻohana ikaika ʻoe iā lākou i kāu mau nīnau. ʻAʻole wikiwiki loa lākou - ua haʻahaʻa lākou i ka nānā ʻana i ka papaʻaina maʻamau. [ʻatikala] [ʻatikala]

Akā ʻo ka maʻamau, ʻoi aku ka hoihoi, ʻoi aku ka paʻakikī o ia mau kiʻi, ke kuhikuhi koke mākou i kahi ʻāpana a ʻike, no ka laʻana, ʻoi aku ma mua o ka hapalua o ka manawa "ʻai" kekahi Seq Scan. Eia kekahi, aia kekahi ʻano kānana i loko, nui nā moʻolelo i hoʻolei ʻia e like me ia ... Hiki iā ʻoe ke hoʻolei pololei i kēia kiʻi i ka mea hoʻomohala a ʻōlelo: "Vasya, hewa nā mea āpau iā ʻoe! E noʻonoʻo, e nānā - ua hewa kekahi!"

ʻO ka loiloi nui o nā nīnau PostgreSQL. Kirill Borovikov (Tensor)

Ma keʻano maʻamau, aia kekahi mau "rake" i komo.

ʻO ka mea mua a mākou i ʻike ai ʻo ia ka pilikia pōʻai. Hōʻike ʻia ka manawa o kēlā me kēia node i ka hoʻolālā me ka pololei o 1 μs. A i ka wā i ʻoi aku ka nui o nā pōʻai node, no ka laʻana, 1000 - ma hope o ka hoʻokō ʻia ʻana ʻo PostgreSQL i puʻunaue "i loko o ka pololei", a laila i ka helu ʻana i hope loaʻa iā mākou ka manawa holoʻokoʻa "ma kahi o 0.95ms a me 1.05ms". Ke hele ka helu i microseconds, ua maikaʻi, akā inā ua [mili] kekona, pono ʻoe e noʻonoʻo i kēia ʻike i ka wā e "wehe" ai i nā kumuwaiwai i nā nodes o ka papahana "nāna i pau".

ʻO ka loiloi nui o nā nīnau PostgreSQL. Kirill Borovikov (Tensor)

ʻO ka helu ʻelua, ʻoi aku ka paʻakikī, ʻo ia ka hāʻawi ʻana i nā kumuwaiwai (ʻo ia mau buffers) ma waena o nā nodes ikaika. ʻO kēia ke kumu kūʻai iā mākou i nā pule 2 mua o ka prototype me 4 mau pule.

He mea maʻalahi ka loaʻa ʻana o kēia ʻano pilikia - hana mākou i kahi CTE a manaʻo ʻia e heluhelu i kekahi mea i loko. ʻO ka ʻoiaʻiʻo, he "akamai" ʻo PostgreSQL a ʻaʻole e heluhelu pololei i kekahi mea ma laila. A laila lawe mākou i ka moʻolelo mua mai ia mea, a iā ia ka hoʻokahi haneli a me ka mua mai ka CTE hoʻokahi.

ʻO ka loiloi nui o nā nīnau PostgreSQL. Kirill Borovikov (Tensor)

Nānā mākou i ka hoʻolālā a hoʻomaopopo - he mea ʻē, loaʻa iā mākou 3 buffers (ʻaoʻao ʻikepili) "hoʻopau ʻia" ma Seq Scan, 1 hou aʻe ma CTE Scan, a he 2 hou aku i ka lua o ka CTE Scan. ʻO ia hoʻi, inā mākou e hōʻuluʻulu wale i nā mea a pau, e loaʻa iā mākou ka 6, akā mai ka papa i heluhelu mākou i 3 wale nō! ʻAʻole heluhelu ʻo CTE Scan i kekahi mea mai nā wahi ʻē aʻe, akā hana pololei me ka hoʻomanaʻo kaʻina hana. ʻO ia hoʻi, ua hewa kekahi mea ma ʻaneʻi!

ʻOiaʻiʻo, ua ʻike ʻia eia kēlā mau ʻaoʻao 3 o ka ʻikepili i noi ʻia mai Seq Scan, noi mua ʻo 1 i ka 1st CTE Scan, a laila ʻo ka 2nd, a he 2 hou aʻe i heluhelu ʻia iā ia. ʻO ia ka huina o Ua heluhelu ʻia nā ʻaoʻao 3, ʻaʻole 6.

ʻO ka loiloi nui o nā nīnau PostgreSQL. Kirill Borovikov (Tensor)

A ua alakaʻi kēia kiʻi iā mākou i ka hoʻomaopopo ʻana ʻaʻole he kumu lāʻau ka hoʻokō ʻana i kahi hoʻolālā, akā he ʻano kiʻi acyclic wale nō. A loaʻa iā mākou kahi kiʻi e like me kēia, i maopopo ai iā mākou "ka mea i hele mai i hea ma kahi mua." ʻO ia hoʻi, ma ʻaneʻi mākou i hana i kahi CTE mai pg_class, a noi ʻelua iā ia, a aneane pau ko mākou manawa i ka lālā ke noi mākou iā ia i ka manawa 2. Akaka ka heluhelu ʻana i ka helu 101 i ʻoi aku ke kumukūʻai ma mua o ka heluhelu ʻana i ka helu 1st mai ka papa.

ʻO ka loiloi nui o nā nīnau PostgreSQL. Kirill Borovikov (Tensor)

Ua hanu mākou no kekahi manawa. ʻĪ maila lākou: “E Neo, ʻike ʻoe i ka kung fu! I kēia manawa ua pololei kā mākou ʻike ma kāu pale. I kēia manawa hiki iā ʻoe ke hoʻohana. " [ʻatikala]

Hoʻohui lāʻau

ʻO kā mākou mea hoʻomohala 1000 i hanu i ka ʻoluʻolu. Akā ua hoʻomaopopo mākou he mau haneli wale nō o nā kikowaena "kaua", a ʻo kēia "kopi-paʻi" āpau ma ka ʻaoʻao o nā mea hoʻomohala ʻaʻole kūpono loa. Ua ʻike mākou pono mākou e hōʻiliʻili iā mākou iho.

ʻO ka loiloi nui o nā nīnau PostgreSQL. Kirill Borovikov (Tensor)

Ma keʻano laulā, aia kahi module maʻamau e hiki ke hōʻiliʻili i nā helu helu, akā naʻe, pono e hoʻāla ʻia i ka config - kēia module pg_stat_statements. Akā ʻaʻole ia i kūpono iā mākou.

ʻO ka mea mua, hāʻawi ia i nā nīnau like me ka hoʻohana ʻana i nā ʻōnaehana like ʻole i loko o ka waihona like ʻokoʻa QueryIds. ʻO ia, inā ʻoe e hana mua SET search_path = '01'; SELECT * FROM user LIMIT 1;a laila SET search_path = '02'; a me ka noi like, a laila e loaʻa i nā helu helu o kēia module nā ​​helu ʻokoʻa, a ʻaʻole hiki iaʻu ke hōʻiliʻili i nā helu helu maʻamau i loko o ka pōʻaiapili o kēia noi noi, me ka nānā ʻole ʻana i nā papahana.

ʻO ka lua o ka mea i pale iā mākou mai ka hoʻohana ʻana nele o na manao. ʻO ia hoʻi, ʻaʻohe hoʻolālā, aia wale nō ke noi ponoʻī. ʻIke mākou i ka mea e lohi nei, akā ʻaʻole maopopo mākou i ke kumu. A eia ke hoʻi nei mākou i ka pilikia o ka hoʻololi wikiwiki ʻana i ka ʻikepili.

A ʻo ka manawa hope loa - nele i nā "ʻoiaʻiʻo". ʻO ia hoʻi, ʻaʻole hiki iā ʻoe ke kamaʻilio i kahi ʻano kikoʻī o ka hoʻokō ʻana i ka nīnau - ʻaʻohe, aia wale nō nā helu helu. ʻOiai hiki ke hana me kēia, paʻakikī wale nō.

ʻO ka loiloi nui o nā nīnau PostgreSQL. Kirill Borovikov (Tensor)

No laila, ua hoʻoholo mākou e hakakā i ka kope-paste a hoʻomaka e kākau luna lawe.

Hoʻopili ka mea ʻohi ma o SSH, hoʻokumu i kahi pilina paʻa i ke kikowaena me ka waihona me ka hoʻohana ʻana i kahi palapala hōʻoia, a tail -F "pili" iā ia ma ka waihona log. No laila i kēia kau loaʻa iā mākou kahi "mirror" piha o ka faila log holoʻokoʻa, ka mea a ke kikowaena e hana ai. He mea liʻiliʻi ka ukana ma ka server ponoʻī, no ka mea ʻaʻole mākou e hoʻokaʻawale i kekahi mea ma laila, e hoʻohālike wale mākou i ke kaʻa.

No ka mea ua hoʻomaka mākou e kākau i ka interface ma Node.js, ua hoʻomau mākou i ke kākau ʻana i ka ʻohi i loko. A ua hoʻāpono kēia ʻenehana iā ia iho, no ka mea he mea maʻalahi loa ka hoʻohana ʻana i ka JavaScript e hana me nā ʻikepili kikokikona nāwaliwali, ʻo ia ka log. A ʻo ka ʻōnaehana Node.js ponoʻī ma ke ʻano he backend platform e hiki ai iā ʻoe ke hana maʻalahi a maʻalahi me nā pili pūnaewele, a ʻoiaʻiʻo me nā kahawai ʻikepili.

No laila, "hoʻolōʻihi" mākou i ʻelua mau pilina: ʻo ka mua e "hoʻolohe" i ka lāʻau ponoʻī a lawe iā mākou iho, a ʻo ka lua e nīnau pinepine i ke kumu. "Akā, ke hōʻike nei ka log ua pāpā ʻia ka hōʻailona me ka oid 123," akā ʻaʻole ia he mea i ka mea hoʻomohala, a he mea maikaʻi ke nīnau i ka waihona, "He aha ka OID = 123?" A no laila ke nīnau pinepine nei mākou i ke kumu i ka mea a mākou i ʻike ʻole ai e pili ana iā mākou iho.

ʻO ka loiloi nui o nā nīnau PostgreSQL. Kirill Borovikov (Tensor)

"Hoʻokahi wale nō mea āu i noʻonoʻo ʻole ai, aia kekahi ʻano o ka elephant-like bees!.." Hoʻomaka mākou e hoʻomohala i kēia ʻōnaehana ke makemake mākou e nānā i nā kikowaena 10. ʻO ka mea koʻikoʻi loa i ko mākou hoʻomaopopo ʻana, kahi i kū mai ai kekahi mau pilikia i paʻakikī ke hoʻoponopono. Akā i ka hapaha mua, ua loaʻa iā mākou he haneli no ka nānā ʻana - no ka mea ua hana ka ʻōnaehana, makemake nā mea a pau, ʻoluʻolu nā mea a pau.

Pono e hoʻohui ʻia kēia mau mea a pau, nui ka kahe o ka ʻikepili. ʻO ka ʻoiaʻiʻo, ʻo ka mea a mākou e nānā ai, ka mea hiki iā mākou ke hana, ʻo ia ka mea a mākou e hoʻohana ai. Hoʻohana pū mākou i ka PostgreSQL ma ke ʻano he waihona ʻikepili. Aʻaʻohe mea wikiwiki e "ninini" i kaʻikepili i loko o ia mea ma mua o ka mea hoʻohana COPY Koe aku.

Akā ʻaʻole ʻo kā mākou ʻenehana wale nō ka "ninini" ʻikepili. No ka mea inā loaʻa iā ʻoe ma kahi o 50k mau noi i kēlā me kēia kekona ma hoʻokahi haneli mau kikowaena, a laila e hana kēia i 100-150GB o nā lāʻau i kēlā me kēia lā. No laila, pono mākou e "ʻoki" pono i ke kumu.

ʻO ka mea mua, ua hana mākou ka mahele ana i ka la, no ka mea, ma ka nui, ʻaʻohe mea hoihoi i ka pilina ma waena o nā lā. He aha ka ʻokoʻa i ka mea i loaʻa iā ʻoe i nehinei, inā i kēia pō ua hoʻopuka ʻoe i kahi mana hou o ka noi - a ua loaʻa kekahi mau helu helu hou.

ʻO ka lua, ua aʻo mākou (ua koi ʻia) wikiwiki loa e kākau me ka hoʻohana ʻana COPY. ʻO ia hoʻi, ʻaʻole wale COPYno ka mea, ua oi aku kona mama mamua o INSERT, a ʻoi aku ka wikiwiki.

ʻO ka loiloi nui o nā nīnau PostgreSQL. Kirill Borovikov (Tensor)

ʻO ke kolu o ka helu - pono wau haʻalele i nā mea hoʻokani, kēlā me kēia, a me nā kī haole. ʻO ia hoʻi, ʻaʻohe o mākou kūpaʻa kuhikuhi. No ka mea, inā he papa ʻaina kāu mau FK, a ʻōlelo ʻoe i loko o ka waihona waihona "eia kahi moʻolelo log i kuhikuhi ʻia e FK, no ka laʻana, i kahi hui o nā moʻolelo," a laila ke hoʻokomo ʻoe iā ia, PostgreSQL ʻAʻohe mea i koe akā pehea e lawe ai a hana pololei SELECT 1 FROM master_fk1_table WHERE ... me ka mea hōʻike āu e hoʻāʻo nei e hoʻokomo - e nānā wale i kēia moʻolelo aia ma laila, ʻaʻole ʻoe e "haki" i kēia kī haole me kāu hoʻokomo.

Ma kahi o hoʻokahi moʻolelo i ka papa kuhikuhi a me kāna mau kuhikuhi, loaʻa iā mākou ka pōmaikaʻi hou o ka heluhelu ʻana mai nā papa āpau e pili ana. Akā ʻaʻole pono mākou i kēia - ʻo kā mākou hana ka hoʻopaʻa ʻana i ka mea hiki a me ka wikiwiki me ka liʻiliʻi loa. No laila FK - iho!

ʻO ka helu aʻe ʻo ka hōʻuluʻulu a me ka hashing. I ka wā mua, ua hoʻokō mākou iā lākou i loko o ka waihona - ma hope o nā mea a pau, hiki ke maʻalahi, i ka wā e hiki mai ai kahi moʻolelo, e hana ia ma kekahi ʻano papa. "hoʻohui i hoʻokahi" pololei i ke kumu. ʻAe, maʻalahi, akā ʻo ka mea maikaʻi ʻole - hoʻokomo ʻoe i hoʻokahi moʻolelo, akā koi ʻia ʻoe e heluhelu a kākau i kahi mea ʻē aʻe mai kahi papa ʻē aʻe. Eia kekahi, ʻaʻole wale ʻoe e heluhelu a kākau, hana ʻoe i kēlā me kēia manawa.

E noʻonoʻo ʻoe he papaʻaina kāu e helu wale ai i ka helu o nā noi i hala ma kahi kikowaena kikoʻī: +1, +1, +1, ..., +1. A ʻo ʻoe, ma ke kumu, ʻaʻole pono kēia - hiki ke hiki huina i ka hoomanao ma ka ohi a hoʻouna i ka waihona i hoʻokahi hele +10.

ʻAe, inā loaʻa kekahi mau pilikia, hiki i kāu ʻoiaʻiʻo pono ke "hāʻule", akā he hihia kūpono ʻole kēia - no ka mea he kikowaena maʻamau kāu, aia kahi pākaukau i ka mea hoʻoponopono, loaʻa iā ʻoe kahi log transaction, kahi log ma ka ʻōnaehana waihona... Ma ka laulā, ʻaʻole pono ia. ʻAʻole kūpono ka lilo o ka huahana i loaʻa iā ʻoe mai ka holo ʻana i nā triggers/FK i ka uku āu e loaʻa ai.

Ua like ia me ka hashing. Ke lele nei kekahi noi iā ʻoe, e helu ʻoe i kahi mea ʻike mai ia mea i loko o ka waihona, e kākau iā ia i ka waihona a laila e haʻi i nā mea a pau. Maikaʻi nā mea a pau a hiki i ka manawa o ka hoʻopaʻa ʻana, hele mai kekahi kanaka ʻelua iā ʻoe e makemake ana e hoʻopaʻa i ka mea like - a paʻa ʻoe, a ua hewa kēia. No laila, inā hiki iā ʻoe ke hoʻololi i ka hanauna o kekahi mau ID i ka mea kūʻai aku (pili i ka waihona), ʻoi aku ka maikaʻi o ka hana ʻana i kēia.

He mea kūpono ia no mākou e hoʻohana i ka MD5 mai ka kikokikona - noi, hoʻolālā, template, ... E helu mākou ma ka ʻaoʻao ʻohi, a " ninini" i ka ID i mākaukau i loko o ka waihona. ʻO ka lōʻihi o MD5 a me ka hoʻokaʻawale ʻana i kēlā me kēia lā e ʻae iā mākou ʻaʻole hopohopo e pili ana i nā hui ʻana.

ʻO ka loiloi nui o nā nīnau PostgreSQL. Kirill Borovikov (Tensor)

Akā i mea e hoʻopaʻa koke ai i kēia mau mea a pau, pono mākou e hoʻololi i ke kaʻina hana hoʻopaʻa.

Pehea ʻoe e kākau mau ai i ka ʻikepili? Loaʻa iā mākou kekahi ʻano waihona, hoʻokaʻawale mākou iā ia i loko o nā papa, a laila COPY ia - mua i ka mua, a laila i ka lua, i ke kolu ... He mea kūpono ʻole, no ka mea, ke kākau nei mākou i hoʻokahi kahawai data i ʻekolu mau ʻanuʻu. kaʻina. ʻoluʻolu ʻole. Hiki ke hana wikiwiki? Hiki!

No ka hana ʻana i kēia, ua lawa wale ka hoʻoheheʻe ʻana i kēia mau kahe e like me kekahi. ʻIke ʻia he mau hewa kā mākou, noi, hoʻohālike, blockings, ... lele i nā kaula kaʻawale - a kākau mākou i nā mea a pau i ka like. Ua lawa no keia e wehe mau i kahi kaila COPY no kēlā me kēia pākaukau.

ʻO ka loiloi nui o nā nīnau PostgreSQL. Kirill Borovikov (Tensor)

ʻO ia hoʻi, ma ka ʻohi he kahawai mau, kahi e hiki ai iaʻu ke kākau i ka ʻikepili aʻu e pono ai. Akā, i ʻike ka ʻikepili i kēia ʻikepili, a ʻaʻole paʻa kekahi i ke kali ʻana i kēia ʻikepili e kākau ʻia. Pono e hooki ia COPY i kekahi mau manawa. No mākou, ʻo ka manawa kūpono loa ma kahi o 100ms - pani mākou a wehe koke iā ia i ka papaʻaina hoʻokahi. A inā ʻaʻole lawa kā mākou kahe hoʻokahi i ka wā o kekahi mau piko, a laila hoʻohui mākou i kahi palena.

Eia hou, ua ʻike mākou no kēlā ʻano hoʻoili ukana, ʻo ka hōʻuluʻulu ʻana, ke hōʻiliʻili ʻia nā moʻolelo i nā pūʻulu, he hewa. ʻO ka hewa kahiko INSERT ... VALUES a he 1000 hou aku. No ka mea, i kēlā manawa, loaʻa iā ʻoe kahi kiʻekiʻe kākau ma ka media, a ʻo nā mea ʻē aʻe e hoʻāʻo nei e kākau i kahi mea i ka disk e kali ana.

No ka hoʻopau ʻana i nā anomalies, mai hōʻuluʻulu i kekahi mea, mai pale iki. A inā loaʻa ka hoʻopaʻa ʻana i ka disk (ʻoi aku ka maikaʻi, ʻo ka Stream API ma Node.js hiki iā ʻoe ke ʻike) - hoʻopanee i kēia pili. Ke loaʻa iā ʻoe kahi hanana i manuahi hou, e kākau iā ia mai ka pila i hōʻiliʻili ʻia. A ʻoiai ʻo ia e paʻahana, e lawe i ka mea hou aʻe mai ka loko wai a kākau iā ia.

Ma mua o ka hoʻokomo ʻana i kēia ala i ka hoʻopaʻa ʻikepili, ua loaʻa iā mākou ma kahi o 4K kākau ops, a ma kēia ʻano ua hoʻemi mākou i ka ukana ma 4 mau manawa. I kēia manawa ua ulu hou lākou i 6 mau manawa ma muli o nā ʻikepili i nānā ʻia - a hiki i 100MB/s. A i kēia manawa mālama mākou i nā lāʻau no nā mahina 3 i hala ma kahi o 10-15TB, me ka manaʻo e hiki i kekahi mea hoʻomohala ke hoʻoponopono i kekahi pilikia.

Maopopo mākou i nā pilikia

Akā ʻo ka hōʻiliʻili wale ʻana i kēia ʻikepili he maikaʻi, pono, pili, akā ʻaʻole lawa - pono e hoʻomaopopo ʻia. No ka mea he mau miliona kēia o nā hoʻolālā like ʻole i kēlā me kēia lā.

ʻO ka loiloi nui o nā nīnau PostgreSQL. Kirill Borovikov (Tensor)

Akā ʻaʻole hiki ke hoʻokele ʻia nā miliona, pono mākou e hana mua i ka "liʻiliʻi". A, ʻo ka mea mua, pono ʻoe e hoʻoholo pehea ʻoe e hoʻonohonoho ai i kēia "mea liʻiliʻi".

Ua ʻike mākou i ʻekolu mau mea nui:

  • ai la hoʻouna i kēia noi
    ʻO ia hoʻi, mai ka mea noi i "hiki mai": pūnaewele pūnaewele, backend, ʻōnaehana uku a i ʻole kekahi mea ʻē aʻe.
  • kahi ua hiki mai
    Ma kahi kikowaena kiko'ī? No ka mea inā loaʻa iā ʻoe kekahi mau kikowaena ma lalo o hoʻokahi noi, a hikiwawe kekahi "hele naʻaupō" (no ka mea, ua popopo ka "disk", "leaked ka hoʻomanaʻo", kekahi pilikia ʻē aʻe), a laila pono ʻoe e hoʻoponopono kikoʻī i ke kikowaena.
  • pehea ʻike ʻia ka pilikia ma kekahi ʻano a i ʻole

No ka hoʻomaopopo ʻana iā "nā wai" i hoʻouna mai iā mākou i kahi noi, hoʻohana mākou i kahi mea hana maʻamau - hoʻonohonoho i kahi ʻano hoʻololi kau: SET application_name = '{bl-host}:{bl-method}'; - Hoʻouna mākou i ka inoa o ka ʻoihana loiloi ʻoihana kahi e hele mai ai ka noi, a me ka inoa o ke ʻano a i ʻole ka noi i hoʻomaka ai.

Ma hope o ko mākou hala ʻana i ka "mea nona" o ka noi, pono ia e hoʻopuka i ka log - no kēia mea mākou e hoʻonohonoho i ka loli log_line_prefix = ' %m [%p:%v] [%d] %r %a'. No ka poe hoihoi paha e nana ma ka manualehe aha ke ʻano o ia mea. Ua ʻike mākou i ka log:

  • ka manawa
  • kaʻina hana a me nā mea hōʻike kālā
  • inoa waihona
  • IP o ka mea nāna i hoʻouna i kēia noi
  • a me ka inoa hana

ʻO ka loiloi nui o nā nīnau PostgreSQL. Kirill Borovikov (Tensor)

A laila ua ʻike mākou ʻaʻole hoihoi loa ka nānā ʻana i ka correlation no hoʻokahi noi ma waena o nā kikowaena like ʻole. ʻAʻole pinepine ʻoe i kahi kūlana kahi e wili like ai kahi noi ma ʻaneʻi a ma laila. Akā inā like ia, e nānā i kekahi o kēia mau kikowaena.

No laila, eia ka ʻoki "hoʻokahi kikowaena - hoʻokahi lā" ua lawa ia no mākou no kekahi anamanaʻo.

Ua like ka pauku analytical mua "la'ana" - he ʻano hōʻike pōkole o ka hoʻolālā, hoʻomaʻemaʻe ʻia mai nā hōʻailona helu āpau. ʻO ka ʻoki ʻelua ka noi a i ʻole ke ʻano, a ʻo ke kolu o ka ʻoki ʻana ʻo ia ka node hoʻolālā kikoʻī i pilikia ai mākou.

Ke neʻe mākou mai nā manawa kikoʻī i nā templates, loaʻa iā mākou ʻelua mau pōmaikaʻi i ka manawa hoʻokahi:

  • hoemi nui i ka heluna o na mea no ka noonoo ana
    Pono mākou e loiloi i ka pilikia ʻaʻole e nā kaukani nīnau a i ʻole nā ​​​​hoʻolālā, akā ma o nā ʻano hoʻohālike.
  • laina manawa
    ʻO ia, ma ka hōʻuluʻulu ʻana i nā "ʻoiaʻiʻo" i loko o kekahi ʻāpana, hiki iā ʻoe ke hōʻike i ko lākou helehelena i ka lā. A ma ʻaneʻi hiki iā ʻoe ke hoʻomaopopo inā loaʻa iā ʻoe kekahi ʻano hiʻohiʻona e hiki mai ana, no ka laʻana, hoʻokahi manawa i ka hola, akā pono e hana i hoʻokahi manawa i ka lā, pono ʻoe e noʻonoʻo e pili ana i ka mea i hewa - ʻo wai ka mea i hana a no ke aha, aia paha ma ʻaneʻi. ʻaʻole pono. ʻO kēia kekahi ʻano helu helu ʻole, ʻike maka wale ʻia.

ʻO ka loiloi nui o nā nīnau PostgreSQL. Kirill Borovikov (Tensor)

Hoʻokumu ʻia nā ʻano hana i koe i nā hōʻailona a mākou e unuhi ai mai ka hoʻolālā: ehia mau manawa i loaʻa ai ke ʻano o ia ʻano, ka nui a me ka manawa awelika, pehea ka nui o ka ʻikepili i heluhelu ʻia mai ka disk, a pehea ka nui mai ka hoʻomanaʻo ʻana...

No ka mea, no ka laʻana, hele mai ʻoe i ka ʻaoʻao analytics no ka mea hoʻokipa, e nānā - ke hoʻomaka nei kekahi mea e heluhelu nui ma ka disk. ʻAʻole hiki i ka disk ma ke kikowaena ke lawelawe - ʻo wai ka mea heluhelu mai ia mea?

A hiki iā ʻoe ke hoʻokaʻawale i kēlā me kēia kolamu a hoʻoholo i kāu mea e hana ai i kēia manawa - ka ukana ma ka kaʻina hana a i ʻole ka disk, a i ʻole ka nui o nā noi ... Ua hoʻokaʻawale mākou, nānā i nā mea "luna", hoʻoponopono a ua hoʻopuka i kahi mana hou o ka noi.
[haʻi wikiō]

A hiki koke iā ʻoe ke ʻike i nā noi like ʻole e hele mai me ka hoʻohālike like mai kahi noi like SELECT * FROM users WHERE login = 'Vasya'. Frontend, backend, processing... A noʻonoʻo ʻoe no ke aha e heluhelu ai ka hana ʻana i ka mea hoʻohana inā ʻaʻole ia e launa pū me ia.

ʻO ke ala ʻē aʻe e ʻike koke mai ka noi i kāna hana. No ka laʻana, ʻo ka frontend ʻo kēia, kēia, kēia, a me kēia hoʻokahi manawa i ka hola (kōkua ka timeline). A ua kū koke ka nīnau: me he mea lā ʻaʻole ia ka hana o ka frontend e hana i hoʻokahi mea i hoʻokahi hola ...

ʻO ka loiloi nui o nā nīnau PostgreSQL. Kirill Borovikov (Tensor)

Ma hope o kekahi manawa, ʻike mākou ua nele mākou i ka hui ʻikepili e nā node hoʻolālā. Hoʻokaʻawale mākou mai nā hoʻolālā i kēlā mau nodes e hana i kekahi mea me ka ʻikepili o nā papa ponoʻī (heluhelu / kākau iā lākou ma ka index a i ʻole). ʻOiaʻiʻo, hoʻokahi wale nō ʻaoʻao i hoʻohui ʻia e pili ana i ke kiʻi mua - ʻEhia mau moʻolelo i lawe mai kēia node iā mākou?, a ʻehia ka nui i hoʻolei ʻia (Wehe ʻia nā lālani ma ke kānana).

ʻAʻohe āu papa kuhikuhi kūpono ma ka pā, noi ʻoe iā ia, lele ia ma mua o ka index, hāʻule i loko o Seq Scan ... ua kānana ʻoe i nā moʻolelo āpau koe wale nō. No ke aha ʻoe e pono ai i nā moʻolelo kānana 100M i kēlā me kēia lā? ʻAʻole ʻoi aku ka maikaʻi o ka ʻōwili ʻana i ka papa kuhikuhi?

ʻO ka loiloi nui o nā nīnau PostgreSQL. Kirill Borovikov (Tensor)

Ma hope o ka nānā ʻana i nā node o nā hoʻolālā āpau, ua ʻike mākou aia kekahi mau hale maʻamau i loko o nā hoʻolālā e ʻike ʻia paha he kānalua. A he mea maikaʻi e haʻi aku i ka mea hoʻomohala: "E ka hoaaloha, eia ʻoe e heluhelu mua ma ka index, a laila ʻoki ʻia, a laila ʻoki" - ma ke ʻano he kānāwai, aia kahi moʻolelo.

Ua ʻike paha ka poʻe a pau i kākau i nā nīnau i kēia ʻano: "E hāʻawi mai iaʻu i ke kauoha hope loa no Vasya, kona lā." A inā ʻaʻohe āu kuhikuhi ma ka lā, a i ʻole ʻaʻohe lā ma ka papa kuhikuhi āu i hoʻohana ai, a laila e hana ʻoe hehi ma ka "rake" like.

Akā ʻike mākou he "rake" kēia - no ke aha e haʻi koke ʻole ai i ka mea hoʻomohala i kāna mea e hana ai. No laila, i ka wā e wehe ai i kahi hoʻolālā i kēia manawa, ʻike koke kā mākou mea hoʻomohala i kahi kiʻi nani me nā ʻōlelo aʻoaʻo, kahi e haʻi koke ai lākou iā ia: "He pilikia kou ma ʻaneʻi a ma laila, akā ua hoʻoholo ʻia ma kēia ala a pēlā."

ʻO ka hopena, ʻo ka nui o ka ʻike i pono e hoʻoponopono i nā pilikia i ka hoʻomaka a i kēia manawa ua hāʻule nui. ʻO kēia ke ʻano o ka mea paahana i loaʻa iā mākou.

ʻO ka loiloi nui o nā nīnau PostgreSQL. Kirill Borovikov (Tensor)

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka