Ko taku whakaaro kia panui koe i te tuhinga o te purongo a Vladimir Sitnikov i te timatanga o te tau 2016 "Kei te pehia e PostgreSQL me JDBC nga wai katoa"
Kia pai te ahiahi Ko Vladimir Sitnikov toku ingoa. Kua 10 tau ahau e mahi ana mo NetCracker. A ko ahau te nuinga ki te hua. Ko nga mea katoa e pa ana ki a Java, ko nga mea katoa e pa ana ki a SQL ko taku e pai ana.
A i tenei ra ka korero ahau mo nga mea i tutakihia e matou i roto i te kamupene i te wa i timata ai matou ki te whakamahi i te PostgreSQL hei tūmau pātengi raraunga. A ko te nuinga o taatau mahi me Java. Engari ko taku korero i tenei ra ehara i te mea mo Java anake. Ka rite ki nga mahi kua whakaatuhia, ka puta ano tenei i etahi atu reo.
Ka korero tatou:
- mo te tauira raraunga.
- Mo te tiaki raraunga.
- Na mo te mahi.
- A mo nga rake raro wai e tanumia ana ki reira.
Me timata ma te patai ngawari. Ka tohua e matou tetahi rarangi mai i te ripanga i runga i te matua matua.
Kei te kaihautu kotahi te papaunga raraunga. A ko enei mahi ahuwhenua katoa e 20 milliseconds.
He nui enei 20 milliseconds. Mena he 100 nga tono penei, ka pau koe i te wa mo ia hekona ki te panuku i enei tono, ara kei te moumou taima.
Kaore matou e pai ki te mahi i tenei me te titiro ki nga mea e tukuna ana e te turanga mo tenei. E rua nga whiringa ka tukuna e te papaunga raraunga mo te whakahaere patai.
Ko te whiringa tuatahi he tono ngawari. He aha te pai mo tena? Ko te meka ka tangohia e matou ka tukuna, kaore he mea ke atu.
He uinga matatau ano te papaunga raraunga, he uaua ake, engari he pai ake te mahi. Ka taea e koe te tuku motuhake he tono mo te poroporoaki, te mahi, te here taurangi, aha atu.
Ko te patai tino roa he mea kare e korerohia e matou i roto i te ripoata o naianei. Kei te pirangi pea matou i tetahi mea mai i te paataka korero, a, he rarangi hiahia kua oti te hanga i etahi ahua, ara, koinei ta matou e hiahia ana, engari kare e taea inaianei me te tau e haere ake nei. Na ka tuhi noa matou ka huri haere matou ki te wiri i nga tangata matua.
Ko te mea ka taea e matou he patai ngawari me te patai roa.
He aha te mea motuhake mo ia huarahi?
He pai te patai ngawari mo te mahi kotahi. Ka oti ka wareware. A ko te raruraru ko te kore e tautoko i te whakatakotoranga raraunga rua, ara, kaore e pai mo etahi punaha mahi nui.
Uiui roa – ka taea e koe te penapena wa mo te poroporoaki. Koinei te mea i mahia e matou ka timata te whakamahi. I tino awhina tenei i a matou. Ehara i te mea he penapena noa mo te poroporoaki. He penapena mo te whakawhiti raraunga. He pai ake te whakawhiti raraunga ki te whakatakotoranga rua.
Me haere tatou ki te parakatihi. Koinei te ahua o te tono angamaheni. Ko Java pea, etc.
I hanga korero matou. I mahia te whakahau. I hanga tata. Kei hea te he i konei? He aha te raruraru? Kaore he raruraru. Koinei te korero i roto i nga pukapuka katoa. Me penei te tuhi. Mena kei te pirangi koe ki te tino mahi, tuhia penei.
Engari kua whakaatuhia e nga mahi kaore tenei e whai hua. He aha? No te mea he tikanga "tata" ta tatou. A, ka mahia e matou tenei, mai i te tirohanga o te papaarangi ka puta he rite ki te kaipaipa e mahi ana me te papaarangi. I kii matou "PARSE EXECUTE DEALLOCATE".
He aha enei mea hanga katoa me te wetewete i nga korero? Kaore he tangata e hiahia ana ki a raatau. Engari ko te mea ka puta i PreparedStatements ko te wa ka kati tatou, ka kati nga mea katoa i runga i te paataka raraunga. Ehara tenei i ta matou e hiahia ana.
E hiahia ana matou, penei i nga tangata hauora, ki te mahi me te turanga. Kotahi tonu ta matou tango me te whakarite i ta matou korero, katahi ka mahia e matou he maha nga wa. Inaa, he maha nga wa - he kotahi tenei i roto i te oranga katoa o nga tono - kua pahemohia. A ka whakamahia e matou te taua korero id mo nga REST rereke. Ko ta matou whainga tenei.
Me pehea e tutuki ai tenei?
He tino ngawari - kaore e tika kia kati nga korero. Ka tuhia e matou penei: "whakarite" "whakahaere".
Mena ka whakarewahia e tatou tetahi mea penei, katahi ka marama ka puhake tetahi mea ki tetahi waahi. Mena kaore i te marama, ka taea e koe te whakamatau. Me tuhi he tohu tohu e whakamahi ana i tenei tikanga ngawari. Waihangahia he korero. Ka whakarewahia e matou i runga i etahi putanga o te taraiwa, ka kitea he tere te tukinga me te ngaro o nga mahara katoa kei a ia.
E marama ana he ngawari te whakatika i aua hapa. E kore ahau e korero mo ratou. Engari ka kii ahau he tere ake te mahi o te putanga hou. He poauau te tikanga, engari tonu.
Me pehea te mahi tika? Me aha tatou mo tenei?
I roto i te meka, ka kati tonu nga tono i nga korero. I roto i nga pukapuka katoa e kii ana ratou kia kati, ki te kore ka pakaru te mahara.
A kaore a PostgreSQL e mohio ki te keteroki patai. Me hanga e ia wahanga tenei keteroki mo ia ano.
A kaore matou e pai ki te moumou taima ki te paahi.
Ka rite ki o mua e rua nga whiringa.
Ko te kowhiringa tuatahi ko te tango me te kii me takai nga mea katoa ki te PgSQL. He keteroki kei reira. Ka huna e ia nga mea katoa. Ka puta te pai. I kite matou i tenei. 100500 nga tono kei a matou. Kaore e mahi. Kare matou e whakaae ki te huri i nga tono ki nga tikanga whakahaere. Kao kaore.
He whiringa tuarua ta maatau - tangohia ka tapahia ma tatou ano. Ka whakatuwherahia e matou nga puna ka timata ki te tapahi. I kite matou, i kite. I puta mai kaore he uaua ki te mahi.
I puta tenei i Akuhata 2015. Inaianei he putanga hou ake. A he rawe nga mea katoa. He pai te mahi kia kore matou e huri i tetahi mea i roto i te tono. Ka mutu ano ta matou whakaaro ki te huarahi o PgSQL, ara, he tino nui tenei mo matou ki te whakaheke i nga utu o runga ki te tata kore.
No reira, ka whakahohehia nga tauākī kua whakaritea e te Tūmau i te 5th execution kia kore ai e moumou mahara i roto i te pātengi raraunga mo ia tono kotahi.
Ka patai pea koe – kei hea nga nama? He aha ta koe e whiwhi? Na konei e kore ahau e hoatu tau, no te mea kei ia tono tona ake.
Ko o matou patai he rite ki te 20 mitamano hēkona i pau i a matou ki te tarai i nga patai OLTP. He 0,5 milliseconds mo te mahi, 20 milliseconds mo te parsing. Tono – 10 KiB o te tuhinga, 170 rarangi mahere. He tono OLTP tenei. Ka tonohia nga rarangi 1, 5, 10, i etahi wa ka nui ake.
Engari kaore matou i pai ki te moumou i te 20 milliseconds. I whakaitihia e matou ki te 0. He rawe nga mea katoa.
He aha e taea e koe te tango mai i konei? Mena kei a koe a Java, ka tango koe i te putanga hou o te taraiwa me te koa.
Mena he reo ke to korero, katahi ka whakaaro - me penei ano pea koe? Na te mea mai i te tirohanga o te reo whakamutunga, hei tauira, mena kei a koe te PL 8, kei a koe ranei te LibPQ, na kaore koe i te mohio kei te whakapau koe i te waa kaore i te mahi, i runga i te panui, a he mea tika kia tirohia. Me pehea? He kore utu nga mea katoa.
Engari he hapa me etahi ahuatanga. A ka korero tatou mo ratou inaianei. Ko te nuinga o nga korero mo te whaipara ahumahi, mo nga mea i kitea e matou, nga mea i kitea e matou.
Ki te hanga hihiri te tono. Ka tupu. Ka whakapirihia e tetahi nga aho, ka puta he patai SQL.
He aha ia i kino ai? He kino na te mea i ia wa ka mutu he aho rereke.
A me panui ano te HashCode o tenei aho rereke. He tino mahi PTM tenei - ehara i te mea ngawari te rapu kupu tono roa i roto i te hash. Na reira, he ngawari te whakatau - kaua e whakaputa tono. Whakaorangia ki tetahi taurangi. A koa.
Raruraru muri. He mea nui nga momo raraunga. He ORM e kii ana kaore he aha te ahua o te NULL kei reira, me waiho he ahua. Ki te Int, ka kii tatou setInt. A, ki te NULL, me waiho tonu ko VARCHAR. He aha te rereketanga o te mutunga he aha te NULL? Ko te papaunga raraunga ake ka mohio ki nga mea katoa. A kaore tenei pikitia e mahi.
I roto i te mahi, karekau te paataka korero e aro. Mena i kii koe i te wa tuatahi he nama tenei, a i te wa tuarua i kii koe he VARCHAR, kaore e taea te whakamahi ano i nga korero kua whakaritea e te Tūmau. A, i tenei keehi, me hanga ano ta tatou korero.
Mena kei te whakahaere koe i taua patai, me mohio kei te rangirua nga momo raraunga kei to poupou. Me mataara koe mo NULL. He hapa noa tenei i a matou i muri i te tiimata ki te whakamahi PreparedStatements
Ka pai, kua whakakā. I mauria pea e ratou te kaitaraiwa. Na ka heke te hua. I kino nga mea.
Me pehea e tupu ai? He bug, he ahuatanga ranei tenei? Kia aroha mai, kaore i taea te mohio he bug, he ahuatanga ranei tenei. Engari he ahuatanga tino ngawari mo te whakaputa i tenei raru. I tino whakapaea e ia i a matou. A ko te tauira mai i te teepu kotahi. Ko te tikanga, he maha atu nga tono penei i a maatau. Ko te tikanga, e rua, e toru nga teepu i whakauruhia, engari he ahuatanga purei ano. Tangohia tetahi putanga mai i to papaunga raraunga ka purei.
Ko te mea nui e rua a matou pou, kua taurangihia ia waahanga. He miriona nga rarangi kei roto i te pou NULL kotahi. A ko te pou tuarua e 20 noa nga rarangi. Ka mahia e matou kaore he taurangi here, ka pai nga mea katoa.
Mena ka timata tatou ki te mahi me nga taurangi herea, ara ka mahia e tatou te "?" "$1" ranei mo ta tatou tono, he aha te mutunga ka riro mai?
Ko te mahi tuatahi ka rite ki te tumanako. Ko te tuarua he tere ake. I keteroki tetahi mea. Tuatoru, tuawha, tuarima. Katahi ka pupuhi - me tetahi mea pera. Ko te mea kino rawa atu ko tenei ka tupu i te ono o nga whiunga. Ko wai i mohio e tika ana kia ono nga mahi whakamate kia mohio ai koe he aha te tino mahere mahi?
Ko wai te hara? He aha te mea i tupu? Kei te pātengi raraunga te arotautanga. A ko te ahua kua arotauhia mo te keehi whanui. A, no reira, ka timata i tetahi wa, ka huri ia ki tetahi mahere whanui, engari, karekau he rereke. Ka puta he rite tonu, he rereke ranei. A tera ano etahi momo uara paepae e arai ana ki tenei whanonga.
He aha ta koe e mahi ai? I konei, o te akoranga, he uaua ake ki te mau i tetahi mea. He otinga ngawari ka whakamahia e matou. Ko te +0 tenei, OFFSET 0. He pono kei te mohio koe ki enei otinga. Ka tangohia noa e matou ka taapiri "+0" ki te tono ka pai nga mea katoa. Ka whakaatu ahau ki a koe i muri mai.
A tera ano tetahi atu whiringa - kia ata titiro ki nga mahere. Ko te kaiwhakawhanake me tuhi tono anake, engari me kii ano "whakamaramahia te tātari" kia 6 nga wa. Mena he 5, kaore e mahi.
A he whiringa tuatoru - tuhia he reta ki nga pgsql-hackers. I tuhituhi ahau, heoi, kare ano i te maarama he pepeha tenei, he ahuatanga ranei.
I a maatau e whakaaro ana he pepeha, he ahuatanga ranei tenei, me whakatika. Me tango ta tatou tono me te taapiri "+0". He pai nga mea katoa. E rua nga tohu kaore koe e whai whakaaro mo te pehea, he aha ranei. Tino ngawari. I aukati noa matou i te paatengi raraunga ki te whakamahi i te taurangi i runga i tenei pou. Karekau he taurangi i runga i te pourangi "+0" ka mutu, kaore te papaaarangi e whakamahi ana i te taurangi, he pai nga mea katoa.
Ko te ture tenei o te 6 whakamaramatia. Inaianei i roto i nga putanga o naianei me mahi e koe kia 6 nga wa mena kua herea e koe nga taurangi. Mena karekau he taurangi here, koinei ta matou mahi. A, i te mutunga ko tenei tono ka taka. Ehara i te mea uaua.
Te ahua nei, e hia nga mea ka taea? He pepeke i konei, he pepeke kei kona. Inaa, kei nga waahi katoa te bug.
Kia ata titiro tatou. Hei tauira, e rua a matou kaupapa. Kaupapa A me te ripanga S me te hoahoa B me te ripanga S. Uiui – tīpako raraunga mai i te ripanga. He aha ta tatou mo tenei keehi? Ka he tatou. Ka whiwhi tatou i nga mea katoa o runga ake nei. Ko te ture - kei nga waahi katoa he pepeha, kei a tatou nga mea katoa o runga ake nei.
Inaianei ko te patai: "He aha?" Te ahua nei he tuhinga kei a maatau te kaupapa, katahi ano he taurangi "search_path" e whakaatu ana ki a maatau te waahi rapu mo te ripanga. Te ahua nei he taurangi.
He aha te raruraru? Ko te raru ko nga korero kua whakaritea e te tūmau karekau e whakapae ka taea e te tangata te huri i te ara_search. Ka noho tonu tenei uara, penei, mo te paataka raraunga. A ko etahi o nga waahanga kaore pea e tango i nga tikanga hou.
Ko te tikanga, ka whakawhirinaki tenei ki te putanga e whakamatautauhia ana e koe. Kei runga i te tino rerekee o o ripanga. A ko te putanga 9.1 ka mahia noa nga patai tawhito. Ka mau pea nga putanga hou i te pepeha me te korero ki a koe kei a koe he pepeke.
Me pehea te rongoa? He tohutaka ngawari - kaua e mahia. Karekau he take ki te huri i te rapu_ara i te wa e rere ana te tono. Mena ka huri koe, he pai ake te hanga hononga hou.
Ka taea e koe te korerorero, ara, tuwhera, korero, taapiri. Tena pea ka taea e tatou te whakapumau i nga kaiwhakawhanake putunga korero mena ka huri te tangata i tetahi uara, me korero te paataka korero ki te kaihoko mo tenei: "Nana, kua whakahoutia to uara ki konei. Tena pea me tautuhi ano koe i nga korero me te hanga ano?" Inaianei kei te noho puku te putunga korero me te kore e whakaatu i nga ahuatanga kua rereke nga korero i tetahi waahi o roto.
A ka whakanui ano ahau - he mea ehara tenei i te ahua mo Java. Ka kite tatou i te mea ano i roto i te PL/pgSQL kotahi ki tetahi. Engari ka whakaputahia ki reira.
Kia tamata tatou i etahi atu whiringa raraunga. Ka whiriwhiri tatou ka whiriwhiri. He tepu ta matou me te miriona rarangi. He kiropaita ia raina. Tata ki te gigabyte o nga raraunga. Na kei a matou he mahara mahi i roto i te miihini Java o 128 megabytes.
Ko matou, pera i te mea e taunakihia ana i roto i nga pukapuka katoa, ka whakamahi i te tukatuka awa. Arā, ka whakatuwherahia te huaSet ka panuihia nga raraunga mai i reira iti. Ka whai hua? Ka taka mai i te mahara? Ka panui koe i te iti? Kia whirinaki tatou ki te paataka raraunga, kia whakawhirinaki ki Postgres. Kare matou e whakapono ana. Ka hinga tatou i OutOFMemory? Ko wai i kite i OutOfMemory? Na wai i whakatika i muri i tera? I taea e tetahi te whakatika.
Mena he miriona rarangi koe, kaore e taea e koe te kowhiri me te kowhiri. OFFSET/LIMIT e hiahiatia ana. Ko wai mo tenei whiringa? A ko wai kei te pai ki te takaro me te AutoCommit?
I konei, pera i nga wa o mua, ko te whiringa tino ohorere ka puta he tika. A, ki te whakaweto ohorere koe i te AutoCommit, ka awhina. He aha tera? Karekau te Pūtaiao e mohio ki tenei.
Engari ma te taunoa, ko nga kaihoko katoa e hono ana ki te paataka raraunga a Postgres te tiki i nga raraunga katoa. Ko te PgJDBC he mea rereke mo tenei ahuatanga; ka tohua e ia nga rarangi katoa.
He rereketanga kei runga i te kaupapa FetchSize, ara, ka taea e koe te kii i te taumata o te korero motuhake kei konei, tohua nga raraunga ma te 10, 50. Engari kaore tenei e mahi kia whakawetohia e koe te autoCommit. Kua whakawetohia te AutoCommit - ka timata te mahi.
Engari ko te haere i roto i te waehere me te tautuhi i te setFetchSize i nga waahi katoa kaore e pai. Na reira, i hanga e matou he tautuhinga e kii ana te uara taunoa mo te hononga katoa.
Koia ta matou korero. Kua whirihorahia te tawhā. A he aha ta tatou i whiwhi? Ki te whiriwhiri tatou i nga moni iti, ki te mea, hei tauira, ka tohua e tatou nga rarangi 10 i te wa kotahi, he nui rawa nga utu o runga. No reira, me whakarite tenei uara ki te kotahi rau pea.
Ko te tikanga, me ako tonu koe me pehea te whakawhāiti i roto i nga paita, engari ko te tohutaka tenei: tautuhia te taunoaRowFetchSize ki neke atu i te kotahi rau ka koa.
Me neke atu ki te whakauru raraunga. He ngawari ake te whakauru, he rereke nga whiringa. Hei tauira, INSERT, VALUES. He whiringa pai tenei. Ka taea e koe te kii "KOKOHI WHAKAMAHI". I roto i te mahi ko te mea ano. Kaore he rereketanga o te mahi.
E kii ana nga pukapuka me mahi koe i tetahi tauākī Pupuu, e kii ana nga pukapuka ka taea e koe te whakahaere i nga whakahau uaua ake me te maha o nga reu. A he mea whakamiharo a Postgres - ka taea e koe te KOPY, ara kia tere ake.
Ki te ine koe, ka taea ano e koe etahi kitenga whakamere. Me pehea tatou e hiahia ana kia mahi tenei? E hiahia ana matou kia kaua e poroporoaki me te kore e mahia nga whakahau koretake.
I roto i te mahi, kare a TCP e whakaae kia mahia tenei. Mena kei te pukumahi te kaihoko ki te tuku tono, karekau te paataka korero e panui i nga tono i te ngana ki te tuku whakautu ki a matou. Ko te mutunga ko te tatari te kaihoko mo te paanui ki te panui i te tono, ka tatari te paataka korero mo te kaihoko ki te panui i te whakautu.
Na reira ka akiakihia te kaihoko ki te tuku i ia wa i tetahi kete tukutahi. Ko nga taunekeneke whatunga taapiri, he moumou taima.
A, ka nui ake te taapiri atu, ka nui haere te kino. He tino pohewa te taraiwa me te taapiri i a raatau i nga wa maha, kotahi pea i ia 200 raina, i runga i te rahi o nga raina, aha atu.
Ko te mea ka whakatika noa koe i tetahi raina ka tere nga mea katoa 10 nga wa. Ka tupu. He aha? Pērā i mua, kua whakamahia kētia te pūmau pēnei i tētahi wāhi. A ko te uara "128" ko te tikanga kia kaua e whakamahia te puranga.
He pai ki te kore tenei i whakauruhia ki te putanga mana. I kitea i mua i te tiimata o te tuku. Ko nga tikanga katoa e hoatu ana e au i runga i nga putanga hou.
Kia tamata tatou. Ka ine maatau i te InsertBatch ngawari. Ka inehia e matou te InsertBatch i nga wa maha, ara ko te mea ano, engari he maha nga uara. Te nekehanga hianga. Kaore e taea e nga tangata katoa te mahi, engari he mahi ngawari, he maamaa ake i te COPY.
Ka taea e koe te KAUPAPA.
A ka taea e koe te mahi i runga i nga hanganga. Whakapuakihia te momo taunoa Kaiwhakamahi, tukuna te huānga me te INSERT tika ki te ripanga.
Mena ka whakatuwherahia e koe te hono: pgjdbc/ubenchmsrk/InsertBatch.java, kei te GitHub tenei waehere. Ka taea e koe te kite he aha nga tono ka mahia ki reira. Kare he aha.
I whakarewahia e matou. A ko te mea tuatahi i mohio matou ko te kore e whakamahi i te puranga kaore e taea. Ko nga whiringa kohinga katoa he kore, ara, he kore noa te wa mahi ka whakaritea ki te mahi kotahi.
Ka whakauruhia e matou nga raraunga. He tepu tino ngawari. E toru nga pou. A he aha ta tatou e kite nei i konei? Ka kite matou he rite te ahua o enei whiringa e toru. A ko te COPY, he pai ake.
Koinei te wa ka whakauruhia e matou etahi waahanga. I a matou i kii kotahi te uara VALUES, e rua nga uara VALUES, e toru nga uara VALUES, i tohu ranei 10 o aua uara kua wehea e te piko. He whakapae noa tenei inaianei. 1, 2, 4, 128. Ka kitea ko te Whakauru Putunga, he mea tuhi ki te kahurangi, ka tino pai ake tona ngakau. Arā, ka kōkuhu koe kotahi i te wā, ahakoa ka kōkuhu koe e whā i te wā kotahi, ka rua ake te pai ake, na te mea i kuhuna ake e matou ki roto i te WARAU. He iti ake nga mahi WHAKAMAHI.
Ko te whakamahi i te COPY i runga i nga pukapuka iti he tino kino. Kaore au i tuhi i nga mea tuatahi e rua. Ka haere ki te rangi, ara, enei nama kaakaariki mo te KAUPAPA.
Me whakamahi COPY ina he rau haupae raraunga kei a koe. He nui te utu mo te whakatuwhera i tenei hononga. A, ki te pono, kaore au i keri i tenei huarahi. I arotauhia e ahau te Putunga, engari kaua ko TĀRI.
Ka aha tatou i muri mai? I whakamatauria e matou. Kei te mohio tatou me whakamahi i nga hanganga, i te bacth mohio ranei e whakakotahi ana i nga tikanga maha.
He aha me tango e koe mai i te purongo o tenei ra?
- Ko te PreparedStatement te mea katoa. He nui tenei mo te hua. Ka puta he pakaru nui i roto i te hinu.
- A me mahi e koe te WHAKAMAHI WHAKAMAHI kia 6 nga wa.
- A me waimeha OFFSET 0, me nga tinihanga penei i te +0 hei whakatika i te toenga o te paheketanga o a tatou patai raru.
Source: will.com