Hoʻopili ʻo PostgreSQL a me JDBC i ka wai a pau. ʻO Vladimir Sitnikov

Manaʻo wau e heluhelu ʻoe i ka transcript o Vladimir Sitnikov's early 2016 report "PostgreSQL and JDBC are squeezing out all juice"

Hoʻopili ʻo PostgreSQL a me JDBC i ka wai a pau. ʻO Vladimir Sitnikov

Hoʻopili ʻo PostgreSQL a me JDBC i ka wai a pau. ʻO Vladimir Sitnikov

Aloha awakea, Aloha Auinalā ʻO Vladimir Sitnikov koʻu inoa. Ua hana au no NetCracker no 10 mau makahiki. A ʻo wau ka hapa nui o ka huahana. ʻO nā mea a pau e pili ana iā Java, nā mea a pau e pili ana i SQL ka mea aʻu i aloha ai.

A i kēia lā e kamaʻilio wau e pili ana i ka mea a mākou i hālāwai ai i ka hui i ka wā i hoʻomaka ai mākou e hoʻohana i PostgreSQL ma ke ʻano he kikowaena waihona. A hana nui mākou me Java. Akā ʻo kaʻu e haʻi aku nei iā ʻoe i kēia lā ʻaʻole ia e pili ana iā Java. E like me ka hoʻomaʻamaʻa i hōʻike ʻia, loaʻa kēia ma nā ʻōlelo ʻē aʻe.

Hoʻopili ʻo PostgreSQL a me JDBC i ka wai a pau. ʻO Vladimir Sitnikov

E kamaʻilio mākou:

  • e pili ana i ka laʻana ʻikepili.
  • E pili ana i ka mālama ʻana i ka ʻikepili.
  • A e pili ana i ka hana.
  • A e pili ana i nā rake ma lalo o ka wai i kanu ʻia ma laila.

Hoʻopili ʻo PostgreSQL a me JDBC i ka wai a pau. ʻO Vladimir Sitnikov

E hoʻomaka kākou me kahi nīnau maʻalahi. Koho mākou i hoʻokahi lālani mai ka pākaukau ma muli o ke kī mua.

Hoʻopili ʻo PostgreSQL a me JDBC i ka wai a pau. ʻO Vladimir Sitnikov

Aia ka waihona ma ka pūʻali hoʻokahi. A he 20 milliseconds kēia mahiʻai a pau.

Hoʻopili ʻo PostgreSQL a me JDBC i ka wai a pau. ʻO Vladimir Sitnikov

He nui kēia mau 20 milliseconds. Inā loaʻa iā ʻoe he 100 o ia mau noi, a laila hoʻolilo ʻoe i ka manawa i kēlā me kēia kekona i ka ʻōwili ʻana i kēia mau noi, ʻo ia hoʻi, ke hoʻopau nei mākou i ka manawa.

ʻAʻole mākou makemake e hana i kēia a nānā i ka mea a ke kumu e hāʻawi ai iā mākou no kēia. Hāʻawi ka waihona iā mākou i ʻelua koho no ka hoʻokō ʻana i nā nīnau.

Hoʻopili ʻo PostgreSQL a me JDBC i ka wai a pau. ʻO Vladimir Sitnikov

ʻO ka koho mua he noi maʻalahi. He aha ka maikaʻi o ia mea? ʻO ka ʻoiaʻiʻo e lawe mākou a hoʻouna aku, ʻaʻohe mea ʻē aʻe.

Hoʻopili ʻo PostgreSQL a me JDBC i ka wai a pau. ʻO Vladimir Sitnikov

https://github.com/pgjdbc/pgjdbc/pull/478

Loaʻa i ka ʻikepili kahi nīnau kiʻekiʻe, ʻoi aku ka paʻakikī, akā ʻoi aku ka hana. Hiki iā ʻoe ke hoʻouna i kahi noi no ka parsing, execution, variable binding, etc.

ʻO ka nīnau nui loa kahi mea ʻaʻole mākou e uhi i ka hōʻike o kēia manawa. Makemake paha mākou i kahi mea mai ka waihona a aia kahi papa inoa makemake i hoʻokumu ʻia ma kekahi ʻano, ʻo ia ka mea a mākou e makemake ai, akā hiki ʻole i kēia manawa a i ka makahiki e hiki mai ana. No laila, hoʻopaʻa wale mākou a hele mākou e lulu i ka poʻe nui.

Hoʻopili ʻo PostgreSQL a me JDBC i ka wai a pau. ʻO Vladimir Sitnikov

A ʻo ka mea hiki iā mākou ke hana he nīnau maʻalahi a me ka nīnau hoʻonui.

He aha ka mea kūikawā o kēlā me kēia ala?

Maikaʻi kahi nīnau maʻalahi no ka hoʻokō hoʻokahi manawa. Pau ka hana a poina. Aʻo ka pilikia,ʻaʻole ia e kākoʻo i ka hōpiliʻikepili binary,ʻo ia hoʻi,ʻaʻole kūpono ia no kekahi mau pūnaewele hana kiʻekiʻe.

Hoʻopili ʻo PostgreSQL a me JDBC i ka wai a pau. ʻO Vladimir Sitnikov

Nīnau lōʻihi - hiki iā ʻoe ke mālama i ka manawa ma ka parsing. ʻO kēia kā mākou i hana ai a hoʻomaka e hoʻohana. Ua kōkua maoli kēia iā mākou. ʻAʻole wale ka mālama kālā ma ka parsing. Loaʻa ka mālama kālā ma ka hoʻoili ʻikepili. ʻOi aku ka maikaʻi o ka hoʻoili ʻana i ka ʻikepili ma ke ʻano binary.

Hoʻopili ʻo PostgreSQL a me JDBC i ka wai a pau. ʻO Vladimir Sitnikov

E neʻe kākou i ka hoʻomaʻamaʻa. ʻO kēia ke ʻano o kahi noi maʻamau. Hiki iā Java, etc.

Ua hana mākou i ka ʻōlelo. Hoʻokō i ke kauoha. Hana ʻia kokoke. Auhea ka hewa maanei? He aha ka pilikia? ʻaʻole pilikia. ʻO kēia ka mea i ʻōlelo ʻia ma nā puke a pau. Penei ke kakau ana. Inā makemake ʻoe i ka hana ʻoi loa, e kākau e like me kēia.

Hoʻopili ʻo PostgreSQL a me JDBC i ka wai a pau. ʻO Vladimir Sitnikov

Akā, ua hōʻike ka hoʻomaʻamaʻa ʻaʻole pono kēia. No ke aha mai? No ka mea he ʻano "kokoke" kā mākou. A ke hana mākou i kēia, mai ka ʻaoʻao o ka ʻikepili e ʻike ʻia e like me ka mea puhi puhi e hana ana me kahi waihona. Ua ʻōlelo mākou "PARSE EXECUTE DEALLOCATE".

No ke aha kēia hana hou a me ka wehe ʻana i nā ʻōlelo? ʻAʻohe mea e pono ai iā lākou. Akā ʻo ka mea maʻamau i PreparedStatements ke pani mākou iā lākou, pani lākou i nā mea āpau ma ka waihona. ʻAʻole kēia ka mea a mākou e makemake ai.

Hoʻopili ʻo PostgreSQL a me JDBC i ka wai a pau. ʻO Vladimir Sitnikov

Makemake mākou, e like me nā kānaka olakino, e hana pū me ka waihona. Lawe mākou a hoʻomākaukau i kā mākou ʻōlelo i hoʻokahi manawa, a laila hoʻokō mākou i nā manawa he nui. ʻO kaʻoiaʻiʻo, i nā manawa he nui - hoʻokahi kēia i ke ola holoʻokoʻa o nā noi - ua paʻi ʻia lākou. A hoʻohana mākou i ka id ʻōlelo like ma nā REST like ʻole. ʻO kā mākou pahuhopu kēia.

Hoʻopili ʻo PostgreSQL a me JDBC i ka wai a pau. ʻO Vladimir Sitnikov

Pehea e hiki ai iā mākou ke hoʻokō i kēia?

Hoʻopili ʻo PostgreSQL a me JDBC i ka wai a pau. ʻO Vladimir Sitnikov

He mea maʻalahi loa - ʻaʻole pono e pani i nā ʻōlelo. Kākau mākou penei: "hoʻomākaukau" "hoʻokō".

Hoʻopili ʻo PostgreSQL a me JDBC i ka wai a pau. ʻO Vladimir Sitnikov

Hoʻopili ʻo PostgreSQL a me JDBC i ka wai a pau. ʻO Vladimir Sitnikov

Inā mākou e hoʻomaka i kahi mea e like me kēia, a laila maopopo e kahe ana kekahi mea ma kahi. Inā ʻaʻole maopopo, hiki iā ʻoe ke hoʻāʻo. E kākau kākou i kahi hōʻailona e hoʻohana ana i kēia ʻano maʻalahi. E hana i kahi ʻōlelo. Hoʻokuʻu mākou iā ia ma kekahi ʻano o ka mea hoʻokele a ʻike ua hāʻule koke ia me ka nalowale o nā hoʻomanaʻo āpau i loaʻa iā ia.

Ua maopopo ka hoʻoponopono maʻalahi o ia mau hewa. ʻAʻole wau e kamaʻilio e pili ana iā lākou. Akā e ʻōlelo wau he ʻoi aku ka wikiwiki o ka hana hou. He lapuwale ke ʻano, akā naʻe.

Hoʻopili ʻo PostgreSQL a me JDBC i ka wai a pau. ʻO Vladimir Sitnikov

Pehea e hana pono ai? He aha kā mākou e hana ai no kēia?

I ka ʻoiaʻiʻo, hoʻopili mau nā noi i nā ʻōlelo. Ma nā puke a pau e ʻōlelo ai lākou e pani iā ​​​​ia, inā ʻaʻole e kahe ka hoʻomanaʻo.

A ʻaʻole ʻike ʻo PostgreSQL pehea e hūnā i nā nīnau. Pono e hana kēlā me kēia kau i kēia cache nona iho.

A ʻaʻole mākou makemake e hoʻopau i ka manawa ma ka parsing.

Hoʻopili ʻo PostgreSQL a me JDBC i ka wai a pau. ʻO Vladimir Sitnikov

A e like me ka maʻamau, ʻelua mau koho.

ʻO ka koho mua e lawe mākou a ʻōlelo mākou e kāʻei i nā mea āpau ma PgSQL. Aia kahi huna ma laila. Mālama ia i nā mea a pau. E lilo ana i mea nui. Ua ʻike mākou i kēia. Loaʻa iā mākou 100500 noi. Aʻole hana. ʻAʻole mākou ʻae e hoʻololi i nā noi i mau kaʻina hana me ka lima. ʻAʻole ʻaʻole.

Loaʻa iā mākou kahi koho lua - e lawe a ʻoki iā mākou iho. Wehe mākou i nā kumu a hoʻomaka eʻoki. Ua ʻike mākou a ʻike. Ua ʻike ʻia ʻaʻole paʻakikī ke hana.

Hoʻopili ʻo PostgreSQL a me JDBC i ka wai a pau. ʻO Vladimir Sitnikov

https://github.com/pgjdbc/pgjdbc/pull/319

Ua ʻike ʻia kēia ma ʻAukake 2015. I kēia manawa aia kahi mana hou. A maikaʻi nā mea a pau. Hana maikaʻi ia ʻaʻole mākou e hoʻololi i kekahi mea ma ka noi. A ua ho'ōki mākou i ka noʻonoʻo ʻana i ka PgSQL, ʻo ia hoʻi, ua lawa kēia no mākou e hōʻemi i nā kumukūʻai overhead āpau i aneane ʻole.

No laila, ho'āla ʻia nā ʻōlelo i hoʻomākaukau ʻia e Server ma ka hoʻokō 5th i mea e pale ʻole ai i ka hoʻomanaʻo ʻana i ka waihona ma kēlā me kēia noi hoʻokahi manawa.

Hoʻopili ʻo PostgreSQL a me JDBC i ka wai a pau. ʻO Vladimir Sitnikov

E nīnau paha ʻoe - aia nā helu? He aha kāu e loaʻa ai? A maʻaneʻiʻaʻole wau e hāʻawi i nā helu, no ka mea, aia kēlā me kēia noi i kāna pono'ī.

ʻO kā mākou mau nīnau i hoʻohana ʻia ma kahi o 20 milliseconds ma ka hoʻopaʻa ʻana i nā nīnau OLTP. He 0,5 milliseconds no ka ho'okō 'ana, 20 milliseconds no ka parsing. Noi - 10 KiB o ka kikokikona, 170 laina o ka hoʻolālā. He noi OLTP kēia. Noi ia i 1, 5, 10 laina, i kekahi manawa hou aku.

Akā ʻaʻole mākou makemake e hoʻopau i ka 20 milliseconds. Ua hoemi makou i ka 0. Nui nā mea a pau.

He aha kāu e lawe ai mai ʻaneʻi? Inā loaʻa iā ʻoe ʻo Java, a laila lawe ʻoe i ka mana hou o ka mea hoʻokele a hauʻoli.

Inā ʻōlelo ʻoe i kahi ʻōlelo ʻokoʻa, a laila e noʻonoʻo - pono paha ʻoe i kēia? No ka mea, mai ka manaʻo o ka ʻōlelo hope, no ka laʻana, inā PL 8 a i ʻole ʻoe iā LibPQ, a laila ʻaʻole maopopo iā ʻoe ke hoʻolilo nei ʻoe i ka manawa ʻaʻole ma ka hoʻokō, ma ka parsing, a he mea pono kēia e nānā. Pehea? Ua noa nā mea a pau.

Hoʻopili ʻo PostgreSQL a me JDBC i ka wai a pau. ʻO Vladimir Sitnikov

Koe nae na hewa a me kekahi mau ano. A e kamaʻilio mākou e pili ana iā lākou i kēia manawa. ʻO ka hapa nui o ia mea e pili ana i ka archeology ʻenehana, e pili ana i nā mea i loaʻa iā mākou, nā mea a mākou i ʻike ai.

Hoʻopili ʻo PostgreSQL a me JDBC i ka wai a pau. ʻO Vladimir Sitnikov

Inā hoʻoulu ʻia ka noi. Ia hana. Hoʻopili kekahi i nā kaula, e hopena i kahi nīnau SQL.

No ke aha ʻo ia i hewa ai? He ʻino ia no ka mea i kēlā me kēia manawa mākou e hoʻopau i kahi kaula ʻokoʻa.

A pono e heluhelu hou ʻia ka hashCode o kēia string ʻokoʻa. He hana CPU maoli kēia - ʻaʻole maʻalahi ka loaʻa ʻana o kahi kikokikona noi lōʻihi i loko o kahi hash. No laila, maʻalahi ka hopena - mai hana i nā noi. E mālama iā lākou i hoʻokahi hoʻololi. A hauʻoli.

Hoʻopili ʻo PostgreSQL a me JDBC i ka wai a pau. ʻO Vladimir Sitnikov

Pilikia aʻe. He mea nui nā ʻano ʻikepili. Aia nā ORM e ʻōlelo nei ʻaʻole pili i ke ʻano o ka NULL, e waiho i kekahi ʻano. Inā Int, a laila ʻōlelo mākou setInt. A inā NULL, e waiho mau ʻia ʻo VARCHAR. A he aha ka ʻokoʻa i ka hopena he aha ka NULL ma laila? ʻO ka ʻikepili ponoʻī e hoʻomaopopo i nā mea āpau. A ʻaʻole hana kēia kiʻi.

Ma ka hoʻomaʻamaʻa, ʻaʻole mālama iki ka waihona. Inā ʻoe i ʻōlelo i ka manawa mua he helu kēia, a ʻo ka lua o ka manawa āu i ʻōlelo ai he VARCHAR, a laila hiki ʻole ke hoʻohana hou i nā ʻōlelo i hoʻomākaukau ʻia e Server. A i kēia hihia, pono mākou e hana hou i kā mākou ʻōlelo.

Hoʻopili ʻo PostgreSQL a me JDBC i ka wai a pau. ʻO Vladimir Sitnikov

Inā ʻoe e hoʻokō nei i ka nīnau like, e hōʻoia ʻaʻole huikau nā ʻano ʻikepili i kāu kolamu. Pono ʻoe e makaʻala no NULL. He hewa maʻamau kēia i loaʻa iā mākou ma hope o ka hoʻomaka ʻana e hoʻohana i PreparedStatements

Hoʻopili ʻo PostgreSQL a me JDBC i ka wai a pau. ʻO Vladimir Sitnikov

ʻAe, ua hoʻā. Ua lawe paha lākou i ke kalaiwa. A hāʻule ka huahana. Ua hewa nā mea.

Pehea e hana ai kēia? He kuhi paha kēia? ʻO ka mea pōʻino, ʻaʻole hiki ke hoʻomaopopo ʻia inā he bug a he hiʻohiʻona paha kēia. Akā aia kahi hiʻohiʻona maʻalahi loa no ka hana hou ʻana i kēia pilikia. Ua hoʻohālua ʻo ia iā mākou me ka manaʻo ʻole. A loaʻa iā ia ka laʻana maoli mai ka papa hoʻokahi. ʻOiaʻiʻo, ua loaʻa iā mākou nā noi like ʻole. Ma ke ʻano maʻamau, ua hoʻokomo lākou i ʻelua a ʻekolu paha papa, akā aia kahi ʻano pāʻani pāʻani. Lawe i kekahi mana mai kāu waihona a pāʻani.

Hoʻopili ʻo PostgreSQL a me JDBC i ka wai a pau. ʻO Vladimir Sitnikov

https://gist.github.com/vlsi/df08cbef370b2e86a5c1

ʻO ka manaʻo, ʻelua kā mākou kolamu, ua kuhikuhi ʻia kēlā me kēia. He miliona lālani i hoʻokahi kolamu NULL. A ʻo ke kolamu ʻelua he 20 laina wale nō. Ke hoʻokō mākou me ka ʻole o nā mea hoʻololi paʻa, hana maikaʻi nā mea a pau.

Inā hoʻomaka mākou e hoʻokō me nā mea hoʻololi paʻa, ʻo ia hoʻi, hoʻokō mākou i ka "?" a i ʻole “$1” no kā mākou noi, he aha kā mākou e loaʻa ai?

Hoʻopili ʻo PostgreSQL a me JDBC i ka wai a pau. ʻO Vladimir Sitnikov

https://gist.github.com/vlsi/df08cbef370b2e86a5c1

ʻO ka hoʻokō mua e like me ka mea i manaʻo ʻia. ʻOi aku ka wikiwiki o ka lua. Ua hūnā ʻia kekahi mea. ʻEkolu, ʻehā, ʻelima. A laila bang - a me kekahi mea like. A ʻo ka mea pōʻino loa ke hana ʻia kēia ma ke ono o ka hoʻokō. ʻO wai ka mea i ʻike he pono ke hana pololei ʻeono i mea e maopopo ai ke ʻano o ka hoʻolālā hoʻokō maoli?

Hoʻopili ʻo PostgreSQL a me JDBC i ka wai a pau. ʻO Vladimir Sitnikov

ʻO wai ka hewa? He aha i hana ai? Aia ka ʻikepili i ka optimization. A me he mea lā ua optimized no ka generic hihia. A, no laila, e hoʻomaka ana i kekahi manawa, ua hoʻololi ʻo ia i kahi hoʻolālā maʻamau, ʻo ka mea pōʻino, hiki ke lilo i ʻokoʻa. He like paha ia, a he ʻokoʻa paha. A aia kekahi ʻano waiwai paepae e alakaʻi ai i kēia ʻano.

He aha kāu e hana ai no ia mea? Eia, ʻoiaʻiʻo, ʻoi aku ka paʻakikī o ka lawe ʻana i kekahi mea. Aia kahi hoʻonā maʻalahi a mākou e hoʻohana ai. ʻO kēia ka +0, OFFSET 0. ʻOiaʻiʻo ua ʻike ʻoe i kēlā mau hoʻonā. Lawe wale mākou a hoʻohui i ka "+0" i ka noi a ua maikaʻi nā mea a pau. E hōʻike aku au iā ʻoe ma hope.

A aia kekahi koho - e nānā pono i nā hoʻolālā. ʻAʻole pono ka mea hoʻomohala e kākau i kahi noi, akā e ʻōlelo pū ʻo "wehewehe ana i ka loiloi" 6 mau manawa. Inā he 5, ʻaʻole ia e hana.

A aia kahi koho ʻekolu - e kākau i kahi leka i nā pgsql-hackers. Ua kākau wau, akā naʻe, ʻaʻole maopopo i kēia manawa he bug a he hiʻohiʻona paha kēia.

Hoʻopili ʻo PostgreSQL a me JDBC i ka wai a pau. ʻO Vladimir Sitnikov

https://gist.github.com/vlsi/df08cbef370b2e86a5c1

ʻOiai mākou e noʻonoʻo nei inā he bug a he hiʻohiʻona paha kēia, e hoʻoponopono mākou. E lawe i kā mākou noi a hoʻohui i "+0". Ua maikaʻi nā mea a pau. ʻElua mau hōʻailona a ʻaʻole pono ʻoe e noʻonoʻo e pili ana i ke ʻano a i ʻole ia. Maʻalahi loa. Ua pāpā wale mākou i ka ʻikepili mai ka hoʻohana ʻana i kahi kuhikuhi ma kēia kolamu. ʻAʻohe o mākou papa kuhikuhi ma ka kolamu "+0" a ʻo ia, ʻaʻole hoʻohana ka waihona i ka index, maikaʻi nā mea a pau.

Hoʻopili ʻo PostgreSQL a me JDBC i ka wai a pau. ʻO Vladimir Sitnikov

ʻO kēia ka lula o 6 wehewehe. I kēia manawa i nā mana o kēia manawa, pono ʻoe e hana i nā manawa 6 inā loaʻa iā ʻoe nā mea hoʻololi. Inā ʻaʻohe āu mau hoʻololi paʻa, eia kā mākou e hana ai. A ʻo ka hopena, ʻo ia nō kēia noi i hāʻule. ʻAʻole ia he mea paʻakikī.

Me he mea lā, pehea ka nui e hiki ai? He kuʻekuʻe ma ʻaneʻi, he ʻino ma laila. ʻOiaʻiʻo, aia ka bug ma nā wahi a pau.

Hoʻopili ʻo PostgreSQL a me JDBC i ka wai a pau. ʻO Vladimir Sitnikov

E nānā pono kākou. No ka laʻana, loaʻa iā mākou ʻelua schema. ʻO ka papahana A me ka papa S a me ke kiʻikuhi B me ka papa S. Nīnau – koho i ka ʻikepili mai kahi pākaukau. He aha kā mākou e loaʻa ai i kēia hihia? E loaʻa iā mākou kahi hewa. E loaʻa iā mākou nā mea a pau i luna. ʻO ke kānāwai - aia kahi ʻōpala ma nā wahi āpau, e loaʻa iā mākou nā mea a pau i luna.

Hoʻopili ʻo PostgreSQL a me JDBC i ka wai a pau. ʻO Vladimir Sitnikov

ʻO kēia ka nīnau: "No ke aha?" Me he mea lā aia nā palapala inā loaʻa iā mākou kahi schema, a laila aia kahi ʻano "search_path" e haʻi iā mākou i kahi e ʻimi ai i ka papaʻaina. Me he mea lā aia kekahi ʻano hoʻololi.

He aha ka pilikia? ʻO ka pilikia, ʻaʻole manaʻo nā ʻōlelo i hoʻomākaukau ʻia e ka server e hiki ke hoʻololi ʻia ka search_path e kekahi. Ke mau nei kēia waiwai, me he mea lā, no ka waihona. A ʻaʻole hiki i kekahi mau ʻāpana ke ʻohi i nā manaʻo hou.

Hoʻopili ʻo PostgreSQL a me JDBC i ka wai a pau. ʻO Vladimir Sitnikov

ʻOiaʻiʻo, pili kēia i ka mana āu e hoʻāʻo nei. Ma muli o ka ʻokoʻa koʻikoʻi o kāu mau papaʻaina. A e hoʻokō wale ka mana 9.1 i nā noi kahiko. Hiki i nā mana hou ke hopu i ka ʻōpala a haʻi iā ʻoe he kino kāu.

Hoʻopili ʻo PostgreSQL a me JDBC i ka wai a pau. ʻO Vladimir Sitnikov

E hoʻonoho i ka hulina_path + nā ʻōlelo i hoʻomākaukau ʻia e ke kikowaena =
ʻAʻole pono e hoʻololi ke ʻano hopena i ka hoʻolālā cache

Pehea e mālama ai? Aia kahi meaʻai maʻalahi - mai hana. ʻAʻohe pono e hoʻololi i ka search_path i ka wā e holo ana ka polokalamu. Inā hoʻololi ʻoe, ʻoi aku ka maikaʻi o ka hana ʻana i kahi pilina hou.

Hiki iā ʻoe ke kūkākūkā, ʻo ia hoʻi, wehe, kūkākūkā, hoʻohui. Hiki paha iā mākou ke hōʻoiaʻiʻo i nā mea hoʻomohala waihona i ka wā e hoʻololi ai kekahi i kahi waiwai, pono e haʻi ka waihona i ka mea kūʻai aku e pili ana i kēia: “E nānā, ua hōʻano hou ʻia kāu waiwai ma aneʻi. Pono paha ʻoe e hoʻonohonoho hou i nā ʻōlelo a hana hou iā lākou? " I kēia manawa, hana malū ka waihona a ʻaʻole hōʻike i kekahi ʻano ua loli nā ʻōlelo ma kahi o loko.

A e hoʻoikaika hou wau - he mea maʻamau kēia no Java. E ʻike mākou i ka mea like ma PL/pgSQL hoʻokahi i hoʻokahi. Akā e hana hou ʻia ma laila.

Hoʻopili ʻo PostgreSQL a me JDBC i ka wai a pau. ʻO Vladimir Sitnikov

E ho'āʻo kākou i kahi koho ʻikepili hou aʻe. Koho mākou a koho. Loaʻa iā mākou kahi papaʻaina me kahi miliona lālani. He kilobyte kēlā me kēia laina. Ma kahi o kahi gigabyte o ka ʻikepili. A loaʻa iā mākou kahi hoʻomanaʻo hana ma ka mīkini Java o 128 megabytes.

ʻO mākou, e like me ka mea i ʻōlelo ʻia ma nā puke āpau, hoʻohana i ka hana kahawai. ʻO ia hoʻi, wehe mākou i ka resultSet a heluhelu liʻiliʻi i ka ʻikepili mai laila. E hana anei? E hāʻule anei mai ka hoʻomanaʻo ʻana? E heluhelu liʻiliʻi paha ʻoe? E hilinaʻi kākou i ka waihona, e hilinaʻi kākou iā Postgres. ʻAʻole mākou manaʻoʻiʻo. E hāʻule anei mākou iā OutOFMemory? ʻO wai ka mea i ʻike iā OutOfMemory? ʻO wai ka mea i hoʻoponopono ma hope o kēlā? Ua hoʻoponopono kekahi.

Inā he miliona lālani kāu, ʻaʻole hiki iā ʻoe ke koho a koho wale. OFFSET/LIMIT pono. ʻO wai no kēia koho? A ʻo wai ka mea makemake e pāʻani me autoCommit?

Maʻaneʻi, e like me ka mea maʻamau,ʻo ka koho i manaʻoʻoleʻia e lilo i pololei. A inā hoʻopau koke ʻoe i ka autoCommit, e kōkua ia. No ke aha ia? ʻAʻole ʻike ʻo ʻepekema i kēia.

Hoʻopili ʻo PostgreSQL a me JDBC i ka wai a pau. ʻO Vladimir Sitnikov

Akā ma ka maʻamau, kiʻi nā mea kūʻai aku a pau i kahi waihona Postgres i ka ʻikepili holoʻokoʻa. ʻAʻole ʻokoʻa ʻo PgJDBC ma kēia ʻano; koho ia i nā lālani a pau.

Aia kekahi ʻano like ʻole ma ka FetchSize theme, ʻo ia hoʻi, hiki iā ʻoe ke ʻōlelo ma ke kiʻekiʻe o kahi ʻōlelo ʻokoʻa ma aneʻi, e ʻoluʻolu e koho i ka ʻikepili e 10, 50. Akā ʻaʻole hana kēia a hiki i ka hoʻopau ʻana i ka autoCommit. Hoʻopau i ka autoCommit - hoʻomaka ka hana.

Akā ʻaʻole kūpono ka hele ʻana i ke code a me ka hoʻonohonoho setFetchSize ma nā wahi āpau. No laila, ua hana mākou i kahi hoʻonohonoho e ʻōlelo i ka waiwai paʻamau no ka pili holoʻokoʻa.

Hoʻopili ʻo PostgreSQL a me JDBC i ka wai a pau. ʻO Vladimir Sitnikov

ʻO ia kā mākou i ʻōlelo ai. Ua hoʻonohonoho ʻia ka ʻāpana. A he aha ka mea i loaʻa iā mākou? Inā koho mākou i nā mea liʻiliʻi, inā, no ka laʻana, koho mākou i nā lālani 10 i ka manawa, a laila loaʻa iā mākou nā kumukūʻai nui loa. No laila, pono e hoʻonoho ʻia kēia waiwai ma kahi o hoʻokahi haneli.

Hoʻopili ʻo PostgreSQL a me JDBC i ka wai a pau. ʻO Vladimir Sitnikov

ʻO ke kūpono, ʻoiaʻiʻo, pono ʻoe e aʻo pehea e kaupalena ʻia i nā bytes, akā ʻo kēia ka mea ʻai: hoʻonoho i ka defaultRowFetchSize i ʻoi aku ma mua o hoʻokahi haneli a hauʻoli.

Hoʻopili ʻo PostgreSQL a me JDBC i ka wai a pau. ʻO Vladimir Sitnikov

E neʻe kākou i ka hoʻokomo ʻana i ka ʻikepili. He maʻalahi ka hoʻokomo ʻana, aia nā koho ʻokoʻa. No ka laʻana, INSERT, VALUES. He koho maikaʻi kēia. Hiki iā ʻoe ke ʻōlelo "INSERT SELECT". Ma ka hana, he mea like ia. ʻAʻohe ʻokoʻa i ka hana.

Wahi a nā puke pono ʻoe e hoʻokō i kahi ʻōlelo Batch, ʻōlelo nā puke e hiki iā ʻoe ke hoʻokō i nā kauoha paʻakikī me kekahi mau pale. A he hiʻohiʻona maikaʻi ko Postgres - hiki iā ʻoe ke hana COPY, ʻo ia hoʻi.

Hoʻopili ʻo PostgreSQL a me JDBC i ka wai a pau. ʻO Vladimir Sitnikov

Inā ʻoe e ana, hiki iā ʻoe ke hana hou i kekahi mau mea hoihoi. Pehea mākou e makemake ai e hana kēia? Makemake mākou ʻaʻole e hoʻopau a hoʻokō i nā kauoha pono ʻole.

Hoʻopili ʻo PostgreSQL a me JDBC i ka wai a pau. ʻO Vladimir Sitnikov

Ma ka hana, ʻaʻole ʻae ʻo TCP iā mākou e hana i kēia. Inā paʻahana ka mea kūʻai aku i ka hoʻouna ʻana i kahi noi, a laila ʻaʻole heluhelu ka waihona i nā noi i ka hoʻāʻo ʻana e hoʻouna iā mākou i nā pane. ʻO ka hopena, ke kali ka mea kūʻai aku i ka waihona e heluhelu i ka noi, a ke kali ka waihona i ka mea kūʻai aku e heluhelu i ka pane.

Hoʻopili ʻo PostgreSQL a me JDBC i ka wai a pau. ʻO Vladimir Sitnikov

A no laila koi ʻia ka mea kūʻai aku e hoʻouna i kēlā me kēia manawa i kahi ʻeke hoʻonohonoho. ʻO nā pilina pūnaewele keu, hoʻopau manawa.

Hoʻopili ʻo PostgreSQL a me JDBC i ka wai a pau. ʻO Vladimir SitnikovA ʻoi aku ka nui o kā mākou hoʻohui ʻana iā lākou, ʻoi aku ka ʻino. Manaʻo nui ka mea hoʻokele a hoʻohui pinepine iā lākou, ma kahi o hoʻokahi manawa i kēlā me kēia 200 laina, ma muli o ka nui o nā laina, etc.

Hoʻopili ʻo PostgreSQL a me JDBC i ka wai a pau. ʻO Vladimir Sitnikov

https://github.com/pgjdbc/pgjdbc/pull/380

Ke hoʻoponopono nei ʻoe i hoʻokahi laina a e wikiwiki nā mea āpau i 10 mau manawa. Ia hana. No ke aha mai? E like me ka mea maʻamau, ua hoʻohana ʻia kahi mea mau e like me kēia ma kekahi wahi. A ʻo ka waiwai "128" ʻaʻole ia e hoʻohana i ka batching.

Hoʻopili ʻo PostgreSQL a me JDBC i ka wai a pau. ʻO Vladimir Sitnikov

ʻO ke kaula microbenchmark Java

Maikaʻi ʻaʻole i hoʻokomo ʻia kēia i ka mana kūhelu. ʻIke ʻia ma mua o ka hoʻomaka ʻana o ka hoʻokuʻu ʻana. ʻO nā manaʻo a pau aʻu e hāʻawi nei ma muli o nā mana hou.

Hoʻopili ʻo PostgreSQL a me JDBC i ka wai a pau. ʻO Vladimir Sitnikov

E hoao kakou. Ana mākou iā InsertBatch maʻalahi. Ana mākou iā InsertBatch i nā manawa he nui, ʻo ia hoʻi ka mea like, akā nui nā waiwai. He neʻe paʻakikī. ʻAʻole hiki i nā mea a pau ke hana i kēia, akā he neʻe maʻalahi ia, ʻoi aku ka maʻalahi ma mua o COPY.

Hoʻopili ʻo PostgreSQL a me JDBC i ka wai a pau. ʻO Vladimir Sitnikov

Hiki iā ʻoe ke hana COPY.

Hoʻopili ʻo PostgreSQL a me JDBC i ka wai a pau. ʻO Vladimir Sitnikov

A hiki iā ʻoe ke hana i kēia ma nā hale. E haʻi i ke ʻano paʻamau o ka mea hoʻohana, e hāʻawi i ka array a INSERT pololei i ka papaʻaina.

Inā wehe ʻoe i ka loulou: pgjdbc/ubenchmsrk/InsertBatch.java, a laila aia kēia code ma GitHub. Hiki iā ʻoe ke ʻike kikoʻī i nā noi i hana ʻia ma laila. He mea ʻole ia.

Hoʻopili ʻo PostgreSQL a me JDBC i ka wai a pau. ʻO Vladimir Sitnikov

Hoʻokuʻu mākou. A ʻo ka mea mua a mākou i ʻike ai ʻaʻole hiki ke hoʻohana i ka batch. ʻO nā koho batching a pau he zero, ʻo ia hoʻi, ʻo ka manawa hoʻokō he mea ʻole ka hoʻohālikelike ʻia me ka hoʻokō hoʻokahi manawa.

Hoʻopili ʻo PostgreSQL a me JDBC i ka wai a pau. ʻO Vladimir Sitnikov

Hoʻokomo mākou i ka ʻikepili. He papaʻaina maʻalahi loa. ʻEkolu kolamu. A he aha kā mākou e ʻike nei ma ʻaneʻi? ʻIke mākou he ʻano like nā ʻekolu o kēia mau koho. A ʻoi aku ka maikaʻi o COPY.

Hoʻopili ʻo PostgreSQL a me JDBC i ka wai a pau. ʻO Vladimir Sitnikov

ʻO kēia ka wā e hoʻokomo ai mākou i nā ʻāpana. I ko mākou ʻōlelo ʻana i hoʻokahi waiwai VALUES, ʻelua mau waiwai VALUES, ʻekolu mau waiwai VALUES, a i ʻole mākou i hōʻike i 10 o lākou i hoʻokaʻawale ʻia e kahi koma. He paepae wale kēia i kēia manawa. 1, 2, 4, 128. Hiki ke ʻike ʻia ʻo ka Batch Insert, i kaha ʻia me ka uliuli, e ʻoi aku ka maikaʻi o kona manaʻo. ʻO ia hoʻi, ke hoʻokomo ʻoe i hoʻokahi i ka manawa a i ʻole ke hoʻokomo ʻoe i ʻehā i ka manawa hoʻokahi, lilo ia i ʻelua ʻoi aku ka maikaʻi, no ka mea, ua hoʻonui iki mākou i ka VALUES. He liʻiliʻi nā hana EXECUTE.

ʻO ka hoʻohana ʻana i COPY ma nā puke liʻiliʻi he mea ʻole loa ia. ʻAʻole au i kaha kiʻi i nā mea mua ʻelua. Hele lākou i ka lani, ʻo ia hoʻi kēia mau helu ʻōmaʻomaʻo no COPY.

Pono e hoʻohana ʻia COPY inā loaʻa iā ʻoe he haneli mau lālani ʻikepili. He nui ke poʻo o ka wehe ʻana i kēia pili. A ʻo ka ʻoiaʻiʻo, ʻaʻole wau i ʻeli i kēia ʻaoʻao. Ua hoʻonui au i ka Batch, akā ʻaʻole COPY.

He aha kā mākou e hana ai? Ua ho'āʻo mākou. Hoʻomaopopo mākou pono mākou e hoʻohana i nā hale a i ʻole kahi bacth akamai e hoʻohui i kekahi mau manaʻo.

Hoʻopili ʻo PostgreSQL a me JDBC i ka wai a pau. ʻO Vladimir Sitnikov

He aha kāu e lawe ai mai ka hōʻike o kēia lā?

  • ʻO PreparedStatement kā mākou mea āpau. Hāʻawi kēia i ka nui no ka huahana. Hāʻawi ia i kahi flop nui i ka ʻaila.
  • A pono ʻoe e hana EXPLAIN ANALYZE 6 mau manawa.
  • A pono mākou e hoʻoheheʻe i ka OFFSET 0, a me nā hoʻopunipuni e like me +0 i mea e hoʻoponopono ai i ke koena pākēneka o kā mākou mau nīnau pilikia.

Source: www.habr.com

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