I-PostgreSQL ne-JDBC ikhama yonke ijusi. UVladimir Sitnikov

Ngiphakamisa ukuthi ufunde umbhalo wombiko ka-Vladimir Sitnikov wokuqala ka-2016 othi "I-PostgreSQL ne-JDBC bakhama yonke ijusi"

I-PostgreSQL ne-JDBC ikhama yonke ijusi. UVladimir Sitnikov

I-PostgreSQL ne-JDBC ikhama yonke ijusi. UVladimir Sitnikov

Sawubona Igama lami nginguVladimir Sitnikov. Ngisebenze kwaNetCracker iminyaka eyi-10. Futhi ngigxile kakhulu ekukhiqizeni. Konke okuhlobene ne-Java, yonke into ehlobene ne-SQL yilokho engikuthandayo.

Futhi namuhla ngizokhuluma ngalokho esihlangane nakho enkampanini lapho siqala ukusebenzisa i-PostgreSQL njengeseva yedatha. Futhi sisebenza kakhulu ne-Java. Kodwa engizokutshela khona namuhla akukhona nje ngeJava. Njengoba umkhuba ubonisile, lokhu kwenzeka nakwezinye izilimi.

I-PostgreSQL ne-JDBC ikhama yonke ijusi. UVladimir Sitnikov

Sizokhuluma:

  • mayelana namasampula edatha.
  • Mayelana nokulondoloza idatha.
  • Futhi mayelana nokusebenza.
  • Futhi mayelana namaraki angaphansi kwamanzi angcwatshwa lapho.

I-PostgreSQL ne-JDBC ikhama yonke ijusi. UVladimir Sitnikov

Ake siqale ngombuzo olula. Sikhetha umugqa owodwa kusuka kuthebula ngokusekelwe kukhiye oyinhloko.

I-PostgreSQL ne-JDBC ikhama yonke ijusi. UVladimir Sitnikov

Isizindalwazi sitholakala kumsingathi ofanayo. Futhi konke lokhu kulima kuthatha ama-millisecond angama-20.

I-PostgreSQL ne-JDBC ikhama yonke ijusi. UVladimir Sitnikov

Lawa ma-millisecond angama-20 maningi. Uma unezicelo ezinjalo eziyi-100, lapho-ke uchitha isikhathi ngesekhondi ngalinye uphenya lezi zicelo, okungukuthi, simosha isikhathi.

Asithandi ukwenza lokhu futhi sibheke ukuthi isisekelo sisinika ini kulokhu. I-database isinika izinketho ezimbili zokwenza imibuzo.

I-PostgreSQL ne-JDBC ikhama yonke ijusi. UVladimir Sitnikov

Inketho yokuqala isicelo esilula. Yini enhle ngakho? Iqiniso lokuthi siyalithatha futhi silithumele, futhi akukho okunye.

I-PostgreSQL ne-JDBC ikhama yonke ijusi. UVladimir Sitnikov

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

I-database futhi inombuzo othuthukisiwe, okhohlisayo, kodwa osebenza kakhulu. Ungathumela ngokuhlukene isicelo sokuhlaziya, ukwenziwa, ukubophezela okuguquguqukayo, njll.

Umbuzo onwetshiwe yinto esingeke siyifake embikweni wamanje. Thina, mhlawumbe, sifuna okuthile ku-database futhi kukhona uhlu lwezifiso olwakhiwe ngendlela ethile, okungukuthi yilokhu esikufunayo, kodwa akunakwenzeka manje nangonyaka ozayo. Ngakho-ke sisanda kuqopha futhi sizohamba sinyakazisa abantu abakhulu.

I-PostgreSQL ne-JDBC ikhama yonke ijusi. UVladimir Sitnikov

Futhi esingakwenza wumbuzo olula kanye nombuzo owandisiwe.

Yini ekhethekile ngendlela ngayinye?

Umbuzo olula ulungele ukusetshenziswa ngesikhathi esisodwa. Uma usuqedile wakhohlwa. Futhi inkinga ukuthi ayisekeli ifomethi yedatha kanambambili, okungukuthi ayifaneleki kwezinye izinhlelo ezisebenza kahle kakhulu.

I-PostgreSQL ne-JDBC ikhama yonke ijusi. UVladimir Sitnikov

Umbuzo onwetshiwe - ikuvumela ukuthi wonge isikhathi ekuhlukaniseni. Yilokhu esikwenzile futhi saqala ukukusebenzisa. Lokhu kwasisiza ngempela. Akukhona nje ukongiwa ekuhlukaniseni. Kukhona ukonga ekudluliselweni kwedatha. Ukudlulisa idatha ngefomethi kanambambili kusebenza kahle kakhulu.

I-PostgreSQL ne-JDBC ikhama yonke ijusi. UVladimir Sitnikov

Asiqhubeke sizilolonge. Yile ndlela uhlelo lokusebenza olujwayelekile olubukeka ngayo. Kungaba i-Java, njll.

Sakha isitatimende. Ikhiphe umyalo. Idalwe eduze. Likuphi iphutha lapha? Yini inkinga? Ayikho inkinga. Yilokhu elikushoyo kuzo zonke izincwadi. Kufanele kubhalwe kanje. Uma ufuna ukusebenza okuphezulu, bhala kanje.

I-PostgreSQL ne-JDBC ikhama yonke ijusi. UVladimir Sitnikov

Kodwa umkhuba ukhombisile ukuthi lokhu akusebenzi. Kungani? Ngoba sinendlela "yokuvala". Futhi uma senza lokhu, kusukela endaweni yokubuka yedatha kuvela ukuthi kufana nomuntu obhemayo osebenza nge-database. Sathi "PARSE EXECUTE DEALLOCATE".

Kungani konke lokhu kudalwa okwengeziwe kanye nokuthulula izitatimende? Akekho ozidingayo. Kodwa okuvame ukwenzeka ku-PreparedStatements ukuthi uma sizivala, zivala yonke into ku-database. Lokhu akukhona esikufunayo.

I-PostgreSQL ne-JDBC ikhama yonke ijusi. UVladimir Sitnikov

Sifuna, njengabantu abanempilo, ukusebenza ngesisekelo. Sithathe futhi salungisa isitatimende sethu kanye, bese sisenza izikhathi eziningi. Eqinisweni, izikhathi eziningi - lokhu kanye empilweni yonke yezinhlelo zokusebenza - ziye zadluliswa. Futhi sisebenzisa i-id yesitatimende esifanayo kuma-REST ahlukene. Lona umgomo wethu.

I-PostgreSQL ne-JDBC ikhama yonke ijusi. UVladimir Sitnikov

Singakufeza kanjani lokhu?

I-PostgreSQL ne-JDBC ikhama yonke ijusi. UVladimir Sitnikov

Kulula kakhulu - asikho isidingo sokuvala izitatimende. Sibhala kanje: "lungiselela" "khipha".

I-PostgreSQL ne-JDBC ikhama yonke ijusi. UVladimir Sitnikov

I-PostgreSQL ne-JDBC ikhama yonke ijusi. UVladimir Sitnikov

Uma sethula into efana nalena, khona-ke kuyacaca ukuthi kukhona okuzophuphuma endaweni ethile. Uma kungacacile, ungakuzama. Masibhale ibhentshimakhi esebenzisa le ndlela elula. Dala isitatimende. Sethula ngolunye uhlobo lomshayeli futhi sithola ukuthi iphahlazeka ngokushesha ngokulahleka kwayo yonke inkumbulo ebinayo.

Kuyacaca ukuthi amaphutha anjalo alungiswa kalula. Ngeke ngikhulume ngabo. Kodwa ngizosho ukuthi inguqulo entsha isebenza ngokushesha kakhulu. Indlela iyisiphukuphuku, kodwa namanje.

I-PostgreSQL ne-JDBC ikhama yonke ijusi. UVladimir Sitnikov

Indlela yokusebenza kahle? Yini okudingeka siyenze kulokhu?

Eqinisweni, izinhlelo zokusebenza zihlala zivala izitatimende. Kuzo zonke izincwadi bathi vala, kungenjalo inkumbulo izovuza.

Futhi i-PostgreSQL ayazi ukuthi igcina kanjani imibuzo. Kudingeka ukuthi iseshini ngayinye izenzele le cache ngokwayo.

Futhi asifuni ukuchitha isikhathi ekuhlukaniseni nathi.

I-PostgreSQL ne-JDBC ikhama yonke ijusi. UVladimir Sitnikov

Futhi njengenjwayelo sinezinketho ezimbili.

Inketho yokuqala ukuthi siyayithatha futhi sithi masigoqe yonke into ku-PgSQL. Kukhona inqolobane lapho. Ibamba yonke into. Kuyoba kuhle kakhulu. Sikubonile lokhu. Sinezicelo eziyi-100500. Ayisebenzi. Asivumi ukushintsha izicelo zibe yizinqubo mathupha. Cha cha.

Sinenketho yesibili - sithathe futhi sisike thina. Sivula imithombo bese siqala ukusika. Sabona futhi sabona. Kwavela ukuthi akunzima kangako ukukwenza.

I-PostgreSQL ne-JDBC ikhama yonke ijusi. UVladimir Sitnikov

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

Lokhu kuvele ngo-Agasti 2015. Manje sekunenguqulo yesimanje. Futhi konke kuhle. Isebenza kahle kangangokuthi asishintshi lutho kuhlelo lokusebenza. Futhi saze sayeka ukucabanga sibheke ku-PgSQL, okusho ukuthi lokhu bekwanele ukuthi sehlise zonke izindleko ezingaphezulu zibe ziro.

Ngakho-ke, izitatimende ezilungiselelwe iseva zisebenza ngokwenziwa kwesi-5 ukuze kugwenywe ukumosha inkumbulo kusizindalwazi esicelweni ngasinye sesikhathi esisodwa.

I-PostgreSQL ne-JDBC ikhama yonke ijusi. UVladimir Sitnikov

Ungase ubuze - ziphi izinombolo? Utholani? Futhi lapha ngeke nginikeze izinombolo, ngoba isicelo ngasinye sinesaso.

Imibuzo yethu ibinjengokuthi sichithe cishe ama-millisecond angu-20 ekuhlukaniseni imibuzo ye-OLTP. Kube nama-millisecond angu-0,5 wokubulawa, ama-millisecond angu-20 wokuhlaziya. Isicelo – 10 KB wombhalo, 170 imigqa yohlelo. Lesi isicelo se-OLTP. Icela imigqa engu-1, 5, 10, ngezinye izikhathi ngaphezulu.

Kodwa besingafuni ukumosha ama-millisecond angu-20 nhlobo. Sehlise kwaba ngu-0. Konke kuhle.

Yini ongayisusa lapha? Uma une-Java, bese uthatha inguqulo yesimanje yomshayeli futhi ujabule.

Uma ukhuluma ulimi oluhlukile, bese ucabanga - mhlawumbe nawe uyakudinga lokhu? Ngoba ngokombono wolimi lokugcina, isibonelo, uma i-PL 8 noma une-LibPQ, ngakho-ke akubonakali kuwe ukuthi uchitha isikhathi hhayi ekubulaweni, ekuhlukaniseni, futhi lokhu kufanelekile ukuhlola. Kanjani? Konke kumahhala.

I-PostgreSQL ne-JDBC ikhama yonke ijusi. UVladimir Sitnikov

Ngaphandle kokuthi kukhona amaphutha kanye nezinye izici. Futhi sizokhuluma ngabo manje. Okuningi kuyobe kumayelana nesayensi yemivubukulo yezimboni, mayelana nalokho esikutholile, esikutholile.

I-PostgreSQL ne-JDBC ikhama yonke ijusi. UVladimir Sitnikov

Uma isicelo senziwa dynamically. Kuyenzeka. Othile uhlanganisa izintambo, okuholela embuzweni we-SQL.

Kungani emubi? Kubi ngoba isikhathi ngasinye sigcina sinocu oluhlukile.

Futhi i-hashCode yalolu chungechunge oluhlukile idinga ukufundwa futhi. Lona ngempela umsebenzi we-CPU - ukuthola umbhalo wesicelo omude ngisho naku-hashi ekhona akulula kangako. Ngakho-ke, isiphetho silula - musa ukukhiqiza izicelo. Zigcine kokuguquguqukayo okukodwa. Futhi thokozani.

I-PostgreSQL ne-JDBC ikhama yonke ijusi. UVladimir Sitnikov

Inkinga elandelayo. Izinhlobo zedatha zibalulekile. Kunama-ORM athi akukhathalekile ukuthi hlobo luni lwe-NULL olukhona, makube khona uhlobo oluthile. Uma i-Int, khona-ke sithi setInt. Futhi uma NULL, khona-ke makube njalo VARCHAR. Futhi kwenza muphi umehluko ekugcineni lokho oku-NULL okukhona? I-database ngokwayo izoqonda yonke into. Futhi lesi sithombe asisebenzi.

Empeleni, i-database ayinandaba nhlobo. Uma uthe okokuqala ukuthi lena inombolo, futhi okwesibili wathi iyi-VARCHAR, kusho ukuthi akunakwenzeka ukuthi uphinde usebenzise izitatimende ezilungiselelwe Iseva. Futhi kulokhu, kufanele senze kabusha isitatimende sethu.

I-PostgreSQL ne-JDBC ikhama yonke ijusi. UVladimir Sitnikov

Uma usebenzisa umbuzo ofanayo, qiniseka ukuthi izinhlobo zedatha kukholomu yakho azididekile. Udinga ukuqaphela i-NULL. Leli iphutha elivamile esaba nalo ngemuva kokuthi siqale ukusebenzisa i-PreparedStatements

I-PostgreSQL ne-JDBC ikhama yonke ijusi. UVladimir Sitnikov

Kulungile, kuvuliwe. Mhlawumbe bathathe umshayeli. Nokukhiqiza kwehlile. Izinto zaba zimbi.

Kwenzeka kanjani lokhu? Ingabe lokhu kuyisiphazamisi noma isici? Ngeshwa, akwenzekanga ukuqonda ukuthi lokhu kuyisiphazamisi noma isici. Kodwa kunesimo esilula kakhulu sokukhiqiza kabusha le nkinga. Wasiqamekela singalindele. Futhi iqukethe amasampula ngokoqobo avela etafuleni elilodwa. Thina, kunjalo, saba nezicelo ezinjalo ezengeziwe. Njengomthetho, bahlanganisa amatafula amabili noma amathathu, kodwa kunesimo esinjalo sokudlala. Thatha noma iyiphi inguqulo kusizindalwazi sakho bese uyidlala.

I-PostgreSQL ne-JDBC ikhama yonke ijusi. UVladimir Sitnikov

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

Iphuzu liwukuthi sinezinsika ezimbili, ngayinye enezikhombo. Kunemigqa eyisigidi kukholomu eyodwa NULL. Futhi ikholomu yesibili iqukethe imigqa engama-20 kuphela. Uma sikhipha ngaphandle kokuguquguquka okuboshiwe, konke kusebenza kahle.

Uma siqala ukwenza ngeziguquguqukayo eziboshiwe, okungukuthi senza okuthi "?" noma β€œ$1” ngesicelo sethu, yini esigcina siyitholile?

I-PostgreSQL ne-JDBC ikhama yonke ijusi. UVladimir Sitnikov

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

Ukubulawa kokuqala kunjengoba bekulindelekile. Owesibili uyashesha kancane. Kukhona okugciniwe. Eyesithathu, yesine, yesihlanu. Bese bang - nokunye okunjalo. Futhi into embi kakhulu ukuthi lokhu kwenzeka ekubulaweni kwesithupha. Ubani owayazi ukuthi kwakudingekile ukuba kubulawe abantu abayisithupha ukuze kuqondwe ukuthi laliyini isu langempela lokubulala?

I-PostgreSQL ne-JDBC ikhama yonke ijusi. UVladimir Sitnikov

Ubani onecala? Kwenzenjani? Isizindalwazi siqukethe ukwenza kahle. Futhi kubonakala sengathi ilungiselelwe i-generic case. Futhi, ngokufanele, kusukela esikhathini esithile, ushintshela ohlelweni olujwayelekile, okuthi, ngeshwa, luhluke. Kungase kufane, noma kuhluke. Futhi kukhona uhlobo oluthile lwenani lomkhawulo oluholela kulokhu kuziphatha.

Yini ongayenza ngakho? Lapha, kunjalo, kunzima kakhulu ukucabanga noma yini. Kunesixazululo esilula esisisebenzisayo. Lokhu kungu-+0, OFFSET 0. Impela uyazazi izixazululo ezinjalo. Sivele sikuthathe bese sengeza u-β€œ+0” esicelweni futhi konke kuhamba kahle. Ngizokukhombisa ngokuhamba kwesikhathi.

Futhi kukhona enye inketho - bheka izinhlelo ngokucophelela. Umthuthukisi akumele abhale isicelo kuphela, kodwa futhi athi β€œchaza hlaziya” izikhathi eziyisi-6. Uma kungu-5, ngeke kusebenze.

Futhi kukhona inketho yesithathu - bhala incwadi ku-pgsql-hackers. Ngibhale, nokho, akukacaci ukuthi lokhu kuyiphutha noma isici.

I-PostgreSQL ne-JDBC ikhama yonke ijusi. UVladimir Sitnikov

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

Ngenkathi sisacabanga ukuthi lokhu kuyisiphazamisi noma isici, asikulungise. Masithathe isicelo sethu bese sengeza "+0". Konke kuhamba kahle. Izimpawu ezimbili futhi awudingi ngisho nokucabanga ukuthi kunjani noma ukuthi kuyini. Kulula kakhulu. Simane senqabela isizindalwazi ekusebenziseni inkomba kule kholomu. Asinayo inkomba kukholomu ethi "+0" futhi yilokho, isizindalwazi asisebenzisi inkomba, konke kuhamba kahle.

I-PostgreSQL ne-JDBC ikhama yonke ijusi. UVladimir Sitnikov

Lona umthetho ka-6 chaza. Manje ezinguqulweni zamanje kufanele ukwenze izikhathi eziyisi-6 uma uneziguquko eziboshiwe. Uma ungenakho okuguquguqukayo okuboshiwe, yilokhu esikwenzayo. Futhi ekugcineni yiso kanye lesi sicelo esehlulekayo. Akuyona into ekhohlisayo.

Kungase kubonakale, kungakanani okungenzeka? Isiphazamisi lapha, isinambuzane lapho. Eqinisweni, iphutha likuyo yonke indawo.

I-PostgreSQL ne-JDBC ikhama yonke ijusi. UVladimir Sitnikov

Ake sibhekisise. Isibonelo, sinezikimu ezimbili. I-Scheme A enethebula S kanye nomdwebo B onethebula u-S. Umbuzo – khetha idatha kuthebula. Sizoba yini kuleli cala? Sizoba nephutha. Sizoba nakho konke okungenhla. Umthetho uthi - isiphazamisi sikhona yonke indawo, sizoba nakho konke okungenhla.

I-PostgreSQL ne-JDBC ikhama yonke ijusi. UVladimir Sitnikov

Manje umbuzo uwukuthi: "Kungani?" Kubukeka sengathi kukhona amadokhumenti okuthi uma sine-schema, khona-ke kukhona okuguquguqukayo kokuthi "search_path" esitshela ukuthi silibheke kuphi ithebula. Kubonakala sengathi kukhona okuguquguqukayo.

Yini inkinga? Inkinga ukuthi izitatimende ezilungiselelwe iseva azisoli ukuthi i-search_path ingashintshwa othile. Leli nani lihlala, njengokungathi, lingaguquki kusizindalwazi. Futhi ezinye izingxenye zingase zingatholi izincazelo ezintsha.

I-PostgreSQL ne-JDBC ikhama yonke ijusi. UVladimir Sitnikov

Impela, lokhu kuncike enguqulweni ohlola kuyo. Kuya ngokuthi amathebula akho ahluke kangakanani. Futhi inguqulo 9.1 izomane yenze izicelo ezindala. Izinguqulo ezintsha zingase zibambe isiphazamisi futhi zikutshele ukuthi unesiphazamisi.

I-PostgreSQL ne-JDBC ikhama yonke ijusi. UVladimir Sitnikov

Setha indlela_yokusesha + izitatimende ezilungiselelwe iseva =
uhlelo olufakwe kunqolobane akumele luguqule uhlobo lomphumela

Indlela yokwelapha? Kukhona iresiphi elula - ungakwenzi. Asikho isidingo sokushintsha i-search_path ngenkathi uhlelo lusebenza. Uma ushintsha, kungcono ukudala uxhumano olusha.

Ningaxoxa, okungukuthi vula, xoxa, wengeze. Mhlawumbe singaqinisekisa abathuthukisi besizindalwazi ukuthi uma othile eshintsha inani, isizindalwazi kufanele sitshele iklayenti ngalokhu: β€œBheka, inani lakho libuyekeziwe lapha. Mhlawumbe udinga ukusetha kabusha izitatimende futhi uzenze kabusha?” Manje i-database iziphatha ngasese futhi ayibiki nganoma iyiphi indlela ukuthi izitatimende zishintshile endaweni ethile ngaphakathi.

Futhi ngizogcizelela futhi - lokhu kuyinto engajwayelekile kuJava. Sizobona into efanayo ku-PL/pgSQL eyodwa kuya kokukodwa. Kodwa izophinde ikhiqizwe lapho.

I-PostgreSQL ne-JDBC ikhama yonke ijusi. UVladimir Sitnikov

Ake sizame okunye ukukhetha kwedatha. Siyakhetha futhi siyakhetha. Sinetafula elinemigqa eyisigidi. Umugqa ngamunye uyikhilobhayithi. Cishe i-gigabyte yedatha. Futhi sinenkumbulo esebenzayo emshinini we-Java wama-megabytes angu-128.

Thina, njengoba kunconyiwe kuzo zonke izincwadi, sisebenzisa ukucubungula kokusakaza. Okusho ukuthi, sivula i-resultSet futhi sifunde idatha esuka lapho kancane kancane. Ingabe izosebenza? Ingabe izowa enkumbulweni? Uzofunda kancane? Asithembe ku-database, sithembele ku-Postgres. Asikukholwa. Ingabe sizowa i-OutOFMemory? Obani abahlangabezane ne-OutOfMemory? Ubani owakwazi ukukulungisa ngemva kwalokho? Othile ukwazile ukukulungisa.

Uma unemigqa eyisigidi, awukwazi ukukhetha nokukhetha. I-OFFSET/LIMIT iyadingeka. Ubani wale nketho? Futhi ubani ovuna ukudlala nge-autoCommit?

Lapha, njengenjwayelo, inketho engalindelekile kakhulu ivela ilungile. Futhi uma uvala ngokuzumayo i-autoCommit, kuzosiza. Kungani kunjalo? Isayensi ayazi ngalokhu.

I-PostgreSQL ne-JDBC ikhama yonke ijusi. UVladimir Sitnikov

Kodwa ngokuzenzakalelayo, wonke amaklayenti axhuma kusizindalwazi se-Postgres alanda yonke idatha. I-PgJDBC ayihlukile kulokhu; ikhetha yonke imigqa.

Kunokwehluka kwetimu ye-FetchSize, okungukuthi ungasho ezingeni lesitatimende esihlukile ukuthi lapha, sicela ukhethe idatha ngo-10, 50. Kodwa lokhu akusebenzi uze uvale i-autoCommit. Ivalwe i-autoCommit - iqala ukusebenza.

Kodwa ukuhamba ngekhodi nokusetha setFetchSize yonke indawo akulula. Ngakho-ke, senze isilungiselelo esizosho inani elizenzakalelayo lakho konke ukuxhumana.

I-PostgreSQL ne-JDBC ikhama yonke ijusi. UVladimir Sitnikov

Yilokho esikushilo. Ipharamitha ilungisiwe. Futhi yini esiyitholile? Uma sikhetha amanani amancane, uma, ngokwesibonelo, sikhetha imigqa eyi-10 ngesikhathi, sizoba nezindleko ezinkulu kakhulu. Ngakho-ke, leli nani kufanele libekwe cishe ekhulwini.

I-PostgreSQL ne-JDBC ikhama yonke ijusi. UVladimir Sitnikov

Ngokufanelekile, vele, kusafanele ufunde ukuthi ungakukhawulela kanjani ngamabhayithi, kodwa iresiphi yilena: setha okuzenzakalelayoRowFetchSize ibe ngaphezu kwekhulu futhi ujabule.

I-PostgreSQL ne-JDBC ikhama yonke ijusi. UVladimir Sitnikov

Asiqhubekele ekufakeni idatha. Ukufaka kulula, kunezinketho ezahlukene. Isibonelo, INSERT, VALUES. Lena inketho enhle. Ungasho ukuthi "FAKA KHETHA". Ngokwenza into efanayo. Awukho umehluko ekusebenzeni.

Izincwadi zithi udinga ukwenza isitatimende se-Batch, izincwadi zithi ungakhipha imiyalo eyinkimbinkimbi ngabakaki abambalwa. Futhi i-Postgres inesici esihle kakhulu - ungenza i-COPY, i.e. yenze ngokushesha.

I-PostgreSQL ne-JDBC ikhama yonke ijusi. UVladimir Sitnikov

Uma uyilinganisa, ungaphinda wenze okutholakalayo okuthakazelisayo. Sifuna kusebenze kanjani lokhu? Asifuni ukuhlaziya futhi singasebenzisi imiyalo engadingekile.

I-PostgreSQL ne-JDBC ikhama yonke ijusi. UVladimir Sitnikov

Empeleni, i-TCP ayisivumeli ukuthi senze lokhu. Uma iklayenti limatasa lithumela isicelo, isizindalwazi asizifundi izicelo ngemizamo yokusithumelela izimpendulo. Umphumela uba ukuthi iklayenti lilinda isizindalwazi ukuze sifunde isicelo, futhi isizindalwazi silinda iklayenti ukuthi lifunde impendulo.

I-PostgreSQL ne-JDBC ikhama yonke ijusi. UVladimir Sitnikov

Ngakho-ke iklayenti liphoqeleka ukuthi ngezikhathi ezithile lithumele iphakethe lokuvumelanisa. Ukusebenzisana kwenethiwekhi okwengeziwe, ukuchitha isikhathi okwengeziwe.

I-PostgreSQL ne-JDBC ikhama yonke ijusi. UVladimir SitnikovFuthi lapho sibangeza kakhulu, kuba kubi kakhulu. Umshayeli akanathemba impela futhi uyengeza kaningi, cishe kanye njalo emigqeni engama-200, kuye ngosayizi wemigqa, njll.

I-PostgreSQL ne-JDBC ikhama yonke ijusi. UVladimir Sitnikov

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

Kuyenzeka ukuthi ulungise umugqa owodwa futhi yonke into izosheshisa izikhathi eziyi-10. Kuyenzeka. Kungani? Njengokujwayelekile, isisetshenziswa esifana nalesi sesivele sisetshenziswa ndawana thize. Futhi inani "128" lalisho ukungasebenzisi i-batching.

I-PostgreSQL ne-JDBC ikhama yonke ijusi. UVladimir Sitnikov

I-Java microbenchmark harness

Kuhle ukuthi lokhu akuzange kufakwe enguqulweni esemthethweni. Kutholwe ngaphambi kokuthi kuqale ukukhishwa. Zonke izincazelo engizinikezayo zisekelwe ezinguqulweni zanamuhla.

I-PostgreSQL ne-JDBC ikhama yonke ijusi. UVladimir Sitnikov

Ake sizame. Sikala i-InsertBatch elula. Sikala i-InsertBatch izikhathi eziningi, okungukuthi into efanayo, kodwa kunamanani amaningi. Ukunyakaza okukhohlisayo. Akuwona wonke umuntu ongenza lokhu, kodwa ukunyakaza okulula, kulula kakhulu kune-COPY.

I-PostgreSQL ne-JDBC ikhama yonke ijusi. UVladimir Sitnikov

Ungenza iKOPI.

I-PostgreSQL ne-JDBC ikhama yonke ijusi. UVladimir Sitnikov

Futhi ungakwenza lokhu ezakhiweni. Memezela uhlobo oluzenzakalelayo lomsebenzisi, uhlu lokudlula bese UFAKA ngokuqondile kuthebula.

Uma uvula isixhumanisi: pgjdbc/ubenchmsrk/InsertBatch.java, khona-ke le khodi iku-GitHub. Ungabona ngokuqondile ukuthi yiziphi izicelo ezikhiqizwa lapho. Akunandaba.

I-PostgreSQL ne-JDBC ikhama yonke ijusi. UVladimir Sitnikov

Sethule. Futhi into yokuqala esiyibonile ukuthi ukungasebenzisi i-batch akunakwenzeka. Zonke izinketho ze-batching zinguziro, okungukuthi isikhathi sokwenza sicishe sibe nguziro uma siqhathaniswa nokwenziwa kwesikhathi esisodwa.

I-PostgreSQL ne-JDBC ikhama yonke ijusi. UVladimir Sitnikov

Sifaka idatha. Itafula elilula kakhulu. Amakholomu amathathu. Futhi sibonani lapha? Siyabona ukuthi zontathu lezi zinketho zicishe ziqhathaniswe. Futhi i-COPY, vele, ingcono.

I-PostgreSQL ne-JDBC ikhama yonke ijusi. UVladimir Sitnikov

Yilapho sifaka izingcezu. Lapho sithi VALUES inani elilodwa, amanani amabili VALUES, amanani amathathu VALUES, noma sibonisa angu-10 kuwo ahlukaniswe ngekhoma. Lokhu kuqondile nje manje. 1, 2, 4, 128. Kuyabonakala ukuthi i-Batch Insert, edwetshwe ngokuluhlaza okwesibhakabhaka, imenza azizwe engcono kakhulu. Okusho ukuthi, uma ufaka esisodwa ngesikhathi noma ngisho ufaka ezine ngesikhathi, ziba zinhle ngokuphindwe kabili, ngoba nje siminyene kakhudlwana ku-VALUES. Imisebenzi embalwa ye-EXECUTE.

Ukusebenzisa i-COPY kumavolumu amancane akwethembisi kakhulu. Angizange ngidwebe nakwezimbili zokuqala. Baya ezulwini, okungukuthi, lezi zinombolo eziluhlaza ze-COPY.

IKOPIA kufanele isetshenziswe uma okungenani unemigqa eyikhulu yedatha. I-overhead yokuvula lolu xhumo inkulu. Futhi, uma ngikhuluma iqiniso, angizange ngimbe ngale ndlela. Ngithuthukise Iqoqo, kodwa hhayi i-COPY.

Senzenjani ngokulandelayo? Sayizama. Siyaqonda ukuthi sidinga ukusebenzisa izakhiwo noma i-bacth ehlakaniphile ehlanganisa izincazelo eziningana.

I-PostgreSQL ne-JDBC ikhama yonke ijusi. UVladimir Sitnikov

Yini okufanele uyisuse embikweni wanamuhla?

  • PreparedStatement siyikho konke. Lokhu kunikeza okuningi kokukhiqiza. Ikhiqiza i-flop enkulu kumafutha.
  • Futhi udinga ukwenza CHAZA HLAZIYA izikhathi eziyisi-6.
  • Futhi sidinga ukuhlambulula i-OFFSET 0, namaqhinga afana no-+0 ukuze silungise amaphesenti asele emibuzo yethu eyinkinga.

Source: www.habr.com

Engeza amazwana