I-PostgreSQL kunye ne-JDBC zikhama yonke ijusi. UVladimir Sitnikov

Ndicebisa ukuba ufunde okubhaliweyo kwengxelo ka-Vladimir Sitnikov yokuqala ye-2016 "i-PostgreSQL kunye ne-JDBC zikhupha yonke ijusi"

I-PostgreSQL kunye ne-JDBC zikhama yonke ijusi. UVladimir Sitnikov

I-PostgreSQL kunye ne-JDBC zikhama yonke ijusi. UVladimir Sitnikov

Mholo Igama lam ndinguVladimir Sitnikov. Ndisebenze kwi-NetCracker iminyaka eyi-10. Kwaye ubukhulu becala ndikwimveliso. Yonke into enxulumene neJava, yonke into enxulumene neSQL yinto endiyithandayo.

Kwaye namhlanje ndiza kuthetha ngento esiye sadibana nayo kwinkampani xa saqala ukusebenzisa i-PostgreSQL njengeseva yedatha. Kwaye sisebenza kakhulu neJava. Kodwa into endiza kukuxelela yona namhlanje ayithethi ngeJava kuphela. Njengoko kubonisiwe, oku kuyenzeka nakwezinye iilwimi.

I-PostgreSQL kunye ne-JDBC zikhama yonke ijusi. UVladimir Sitnikov

Siza kuthetha:

  • malunga nokuthathwa kwedatha.
  • Malunga nokugcina idatha.
  • Kwaye malunga nokusebenza.
  • Kwaye malunga neeraki zangaphantsi kwamanzi ezingcwatywe apho.

I-PostgreSQL kunye ne-JDBC zikhama yonke ijusi. UVladimir Sitnikov

Masiqale ngombuzo olula. Sikhetha umqolo omnye kwitheyibhile ngokusekelwe kwisitshixo esiphambili.

I-PostgreSQL kunye ne-JDBC zikhama yonke ijusi. UVladimir Sitnikov

Ugcino lwedatha lubekwe kumamkeli omnye. Kwaye konke oku kulima kuthatha i-20 milliseconds.

I-PostgreSQL kunye ne-JDBC zikhama yonke ijusi. UVladimir Sitnikov

Ezi millisecond ezingama-20 zininzi. Ukuba une-100 yezicelo ezinjalo, ngoko uchitha ixesha ngesekhondi nganye upheqa ezi zicelo, oko kukuthi, sichitha ixesha.

Asithandi ukwenza oku kwaye sijonge ukuba isiseko sisinika ntoni ngale nto. Uvimba weenkcukacha usinika iinketho ezimbini zokubuza imibuzo.

I-PostgreSQL kunye ne-JDBC zikhama yonke ijusi. UVladimir Sitnikov

Inketho yokuqala sisicelo esilula. Yintoni elungileyo ngayo? Inyaniso yokuba siyithatha kwaye siyithumele, kwaye akukho nto.

I-PostgreSQL kunye ne-JDBC zikhama yonke ijusi. UVladimir Sitnikov

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

I-database ikwanayo umbuzo ophambili, okhohlisayo, kodwa usebenza ngakumbi. Ungathumela ngokwahlukeneyo isicelo sokwahlulahlula, ukwenziwa, ukubophelela okuguquguqukayo, njl.

Umbuzo owandisiweyo yinto esingayi kuyenza kwingxelo yangoku. Thina, mhlawumbi, sifuna into evela kwisiseko sedatha kwaye kukho uluhlu olunqwenelekayo oluye lwenziwa ngendlela ethile, oko kukuthi le nto siyifunayo, kodwa akunakwenzeka ngoku nangonyaka ozayo. Ke sisandula ukuyirekhoda kwaye siya kujikeleza sishukumisa abantu abaphambili.

I-PostgreSQL kunye ne-JDBC zikhama yonke ijusi. UVladimir Sitnikov

Kwaye into esinokuyenza ngumbuzo olula kunye nombuzo owandisiweyo.

Yintoni ekhethekileyo malunga nendlela nganye?

Umbuzo olula ulungele ukwenziwa kwexesha elinye. Xa sele kwenziwe kwaye ulibele. Kwaye ingxaki kukuba ayixhasi ifomathi yedatha yokubini, oko kukuthi ayifanelekanga kwezinye iinkqubo eziphezulu zokusebenza.

I-PostgreSQL kunye ne-JDBC zikhama yonke ijusi. UVladimir Sitnikov

Umbuzo owandisiweyo-ukuvumela ukuba ugcine ixesha lokwahlulahlula. Yile nto siyenzileyo kwaye saqala ukuyisebenzisa. Oku kwasinceda ngokwenene. Akukho londolozo kuphela ekucazululeni. Kukho ukonga kudluliselo lwedatha. Ukudlulisa idatha kwifomathi yokubini kusebenza kakhulu.

I-PostgreSQL kunye ne-JDBC zikhama yonke ijusi. UVladimir Sitnikov

Masiqhubele phambili siziqhelanise. Le yindlela esikhangeleka ngayo isicelo esiqhelekileyo. Isenokuba yiJava, njl.

Senza ingxelo. Uphumeze umyalelo. Yenziwe kufutshane. Iphi impazamo apha? Yintoni ingxaki? Akhongxaki. Yile nto ithethwayo kuzo zonke iincwadi. Le yindlela emayibhalwe ngayo. Ukuba ufuna ukusebenza okuphezulu, bhala ngolu hlobo.

I-PostgreSQL kunye ne-JDBC zikhama yonke ijusi. UVladimir Sitnikov

Kodwa uqheliselo lubonise ukuba oku akusebenzi. Ngoba? Kuba sinendlela "ekufutshane". Kwaye xa sisenza oku, ukusuka kwindawo yokujonga i-database kuvela ukuba kufana nomntu otshayayo osebenza neenkcukacha. Sathi "PARSE EXECUTE DEALLOCATE".

Kutheni le nto yonke indalo eyongezelelweyo kunye nokuthululwa kweengxelo? Akukho mntu uzidingayo. Kodwa ngokuqhelekileyo kwenzeka ntoni kwi-PreparedStatements kukuba xa sivala, bavala yonke into kwi-database. Asiyiyo le nto siyifunayo.

I-PostgreSQL kunye ne-JDBC zikhama yonke ijusi. UVladimir Sitnikov

Sifuna, njengabantu abasempilweni, ukusebenza kunye nesiseko. Sithathe kwaye salungisa ingxelo yethu kube kanye, emva koko siyenze amaxesha amaninzi. Enyanisweni, amaxesha amaninzi - oku kube kanye ebomini bonke bezicelo - ziye zacalulwa. Kwaye sisebenzisa i-id yengxelo efanayo kwii-REST ezahlukeneyo. Le yinjongo yethu.

I-PostgreSQL kunye ne-JDBC zikhama yonke ijusi. UVladimir Sitnikov

Sinokukuphumeza njani oku?

I-PostgreSQL kunye ne-JDBC zikhama yonke ijusi. UVladimir Sitnikov

Kulula kakhulu - akukho mfuneko yokuvala iingxelo. Sibhala ngolu hlobo: "lungisa" "uphume".

I-PostgreSQL kunye ne-JDBC zikhama yonke ijusi. UVladimir Sitnikov

I-PostgreSQL kunye ne-JDBC zikhama yonke ijusi. UVladimir Sitnikov

Ukuba siqalisa into efana nale, kuyacaca ukuba kukho into eya kuphuphuma kwindawo ethile. Ukuba ayicacanga, ungayizama. Masibhale ibhenchmark esebenzisa le ndlela ilula. Yenza ingxelo. Siyisungula kuhlobo oluthile lomqhubi kwaye sifumanise ukuba intlitheka ngokukhawuleza ngokuphulukana nayo yonke inkumbulo ebenayo.

Kucacile ukuba iimpazamo ezinjalo zilungiswa ngokulula. Andiyi kuthetha ngabo. Kodwa ndiza kuthetha ukuba inguqulelo entsha isebenza ngokukhawuleza. Indlela ibubudenge, kodwa kunjalo.

I-PostgreSQL kunye ne-JDBC zikhama yonke ijusi. UVladimir Sitnikov

Indlela yokusebenza ngokuchanekileyo? Kufuneka senze ntoni kule nto?

Enyanisweni, izicelo zihlala zivala iingxelo. Kuzo zonke iincwadi bathi ukuyivala, ngaphandle koko imemori iya kuvuza.

Kwaye i-PostgreSQL ayiyazi indlela yokufihla imibuzo. Kuyimfuneko ukuba iseshoni nganye izenzele le cache ngokwayo.

Kwaye asifuni ukuchitha ixesha ekucazululeni.

I-PostgreSQL kunye ne-JDBC zikhama yonke ijusi. UVladimir Sitnikov

Kwaye njengesiqhelo sineenketho ezimbini.

Inketho yokuqala kukuba siyithathe kwaye sithi masisonge yonke into kwiPgSQL. Kukho i-cache apho. Ibamba yonke into. Kuya kuvela kakhulu. Sayibona le nto. Sinezicelo ze-100500. Ayisebenzi. Asivumi ukujika izicelo zibe yinkqubo ngesandla. Hayi hayi.

Sinenketho yesibini - yithathe kwaye siyinqumle ngokwethu. Sivula imithombo kwaye siqale ukusika. Sabona saza sabona. Kwavela ukuba akunzima kangako ukwenza.

I-PostgreSQL kunye ne-JDBC zikhama yonke ijusi. UVladimir Sitnikov

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

Oku kuvele ngo-Agasti ka-2015. Ngoku kukho inguqulelo yale mihla. Kwaye yonke into ilungile. Isebenza kakuhle kangangokuba asitshintshi nto kwisicelo. Kwaye siye sayeka ukucinga kwicala le-PgSQL, o.k.t. oku kwakwanele ukuba sinciphise zonke iindleko ezingaphezulu ukuya kuthi ga kwi-zero.

Ngokufanelekileyo, iinkcazo ezilungiselelwe umncedisi zisebenza kwi-5th execution ukwenzela ukuphepha ukuchitha imemori kwi-database kwisicelo ngasinye sexesha elinye.

I-PostgreSQL kunye ne-JDBC zikhama yonke ijusi. UVladimir Sitnikov

Ungabuza - aphi amanani? Ufumana ntoni? Kwaye apha andiyi kunika amanani, kuba isicelo ngasinye sinesaso.

Imibuzo yethu ibiyeyokuba sichithe malunga ne-20 millisecond ekucazululeni imibuzo ye-OLTP. Bekukho i-0,5 milliseconds yokubulawa, i-20 milliseconds yokwahlulahlula. Isicelo - i-10 KB yombhalo, imigca ye-170 yesicwangciso. Esi sisicelo seOLTP. Icela 1, 5, 10 imigca, ngamanye amaxesha ngaphezulu.

Kodwa asizange sifune ukuchitha i-20 millisecond kwaphela. Siyithobe yaba ngu-0. Yonke into ilungile.

Ungasusa ntoni apha? Ukuba uneJava, ke uthatha inguqulelo yangoku yomqhubi kwaye ujabule.

Ukuba uthetha ulwimi olwahlukileyo, cinga - mhlawumbi nawe uyayifuna le nto? Ngenxa yokuba kwimbono yolwimi lokugqibela, umzekelo, ukuba i-PL 8 okanye unayo i-LibPQ, ngoko akucaci kuwe ukuba uchitha ixesha kungekhona ekuphunyezweni, ekucazululeni, kwaye oku kufanelekile ukujonga. Njani? Yonke into isimahla.

I-PostgreSQL kunye ne-JDBC zikhama yonke ijusi. UVladimir Sitnikov

Ngaphandle kokuba kukho iimpazamo kunye nezinto ezingaqhelekanga. Kwaye siza kuthetha ngabo ngoku. Uninzi lwalo luya kuba malunga ne-archeology ye-industrial, malunga nento esiyifumeneyo, into esiyifumene nayo.

I-PostgreSQL kunye ne-JDBC zikhama yonke ijusi. UVladimir Sitnikov

Ukuba isicelo senziwa ngamandla. Iyenzeka. Umntu uncamathelisa imitya kunye, okukhokelela kumbuzo weSQL.

Kutheni engendawo nje? Kubi kuba ixesha ngalinye sigqiba ngentambo eyahlukileyo.

Kwaye iKhowudi ye-hash yalo mtya wahlukileyo kufuneka ifundwe kwakhona. Lo ngumsebenzi we-CPU ngenene-ukufumana iteksti yesicelo eside nakwi-hash ekhoyo akulula kangako. Ngoko ke, isiphelo silula - musa ukuvelisa izicelo. Zigcine kwinguqu enye. Kwaye vuyani.

I-PostgreSQL kunye ne-JDBC zikhama yonke ijusi. UVladimir Sitnikov

Ingxaki elandelayo. Iintlobo zedatha zibalulekile. Kukho ii-ORM ezithi akukhathaliseki ukuba luhlobo luni lwe-NULL olukhoyo, makubekho uhlobo oluthile. Ukuba i-Int, ngoko sithi setInt. Kwaye ukuba NULL, ngoko mayihlale inguVARCHAR. Kwaye yenza ntoni umahluko ekugqibeleni yintoni i-NULL ekhoyo? I-database ngokwayo iya kuqonda yonke into. Kwaye lo mfanekiso awusebenzi.

Enyanisweni, i-database ayikhathali konke konke. Ukuba uthe okokuqala eli linani, kwaye okwesibini uthe yiVARCHAR, akunakwenzeka ukuba uphinde usebenzise iinkcazo ezilungiselelwe umncedisi. Kwaye kule meko, kufuneka senze kwakhona ingxelo yethu.

I-PostgreSQL kunye ne-JDBC zikhama yonke ijusi. UVladimir Sitnikov

Ukuba wenza umbuzo ofanayo, qiniseka ukuba iintlobo zedatha kumhlathi wakho azibhidekanga. Kufuneka ujonge i-NULL. Le yimpazamo eqhelekileyo ebesinayo emva kokuba siqale ukusebenzisa i-PreparedStatements

I-PostgreSQL kunye ne-JDBC zikhama yonke ijusi. UVladimir Sitnikov

Kulungile, uvule. Mhlawumbi bathathe umqhubi. Kwaye imveliso yehla. Izinto zaba mbi.

Kwenzeka njani oku? Ngaba le yimpazamo okanye luphawu? Ngelishwa, bekungenzeki ukuqonda ukuba le yimpazamo okanye luphawu. Kodwa kukho imeko elula kakhulu yokuvelisa le ngxaki. Wasilalela singalindelanga. Kwaye iqulathe isampulu ngokoqobo kwitafile enye. Kakade ke, sasinezinye izicelo ezinjalo. Njengomthetho, babandakanya iitafile ezimbini okanye ezintathu, kodwa kukho imeko enjalo yokudlala. Thatha nayiphi na inguqulelo kwi-database yakho kwaye uyidlale.

I-PostgreSQL kunye ne-JDBC zikhama yonke ijusi. UVladimir Sitnikov

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

Ingongoma kukuba sineekholomu ezimbini, nganye kuzo isalathisi. Kukho imiqolo eyisigidi kwikholamu enye NULL. Kwaye ikholamu yesibini iqulethe imigca engama-20 kuphela. Xa siphumeza ngaphandle kweenguqu ezibophelelekileyo, yonke into isebenza kakuhle.

Ukuba siqala ukwenza ngezinto eziguquguqukayo ezibotshiweyo, o.k.t. siphumeza "?" okanye "i-$ 1" kwisicelo sethu, sigqiba ukufumana ntoni?

I-PostgreSQL kunye ne-JDBC zikhama yonke ijusi. UVladimir Sitnikov

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

Ukuphunyezwa kokuqala njengoko kulindelekile. Owesibini ukhawuleza kancinci. Kukho into egciniweyo. Eyesithathu, yesine, yesihlanu. Emva koko i-bang-kunye nento enjalo. Kwaye eyona nto imbi kukuba oku kwenzeka ngomhla wesithandathu. Ngubani owayesazi ukuba kwakuyimfuneko ukuba kubulawe abantu abathandathu ukuze kuqondwe ukuba yayiyintoni kanye icebo lokubulala?

I-PostgreSQL kunye ne-JDBC zikhama yonke ijusi. UVladimir Sitnikov

Ngubani onetyala? Kweneke ntoni? Ugcino lwedatha luqulathe ukwenziwa ngcono. Kwaye kubonakala ngathi yenzelwe igeneric case. Kwaye, ngokufanelekileyo, ukuqala ngexesha elithile, utshintshela kwisicwangciso segeneric, ethi, ngelishwa, inokuthi yahluke. Isenokujika ibe yinto enye, okanye isenokuhluka. Kwaye kukho uhlobo oluthile lwexabiso lomda okhokelela kule ndlela yokuziphatha.

Yintoni onokuyenza ngayo? Apha, ngokuqinisekileyo, kunzima ukucinga nantoni na. Kukho isisombululo esilula esisisebenzisayo. Oku ngu +0, OFFSET 0. Ngokuqinisekileyo uyazazi izisombululo ezinjalo. Sithatha nje kwaye songeze "+0" kwisicelo kwaye yonke into ilungile. Ndiza kukubonisa kamva.

Kwaye kukho enye inketho - jonga izicwangciso ngokucophelela. Umphuhlisi kufuneka angabhali kuphela isicelo, kodwa athi "chaza ukuhlalutya" amaxesha angama-6. Ukuba ngu-5, ayizukusebenza.

Kwaye kukho inketho yesithathu - bhala ileta kwi-pgsql-hackers. Ndibhale, nangona kunjalo, akukacaci ukuba le yibug okanye yinto.

I-PostgreSQL kunye ne-JDBC zikhama yonke ijusi. UVladimir Sitnikov

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

Ngelixa sicinga ukuba le bug okanye luphawu, masiyilungise. Masithathe isicelo sethu kwaye songeze "+0". Yonke into iilungile. Iisimboli ezimbini kwaye akufuneki ucinge malunga nokuba yintoni okanye yintoni. Ilula kakhulu. Sithintele nje isiseko sedatha ekusebenziseni isalathiso kulo mhlathi. Asinayo isalathisi kwikholamu "+0" kwaye yiyo, i-database ayisebenzisi isalathisi, yonke into ilungile.

I-PostgreSQL kunye ne-JDBC zikhama yonke ijusi. UVladimir Sitnikov

Lo ngumgaqo ka-6 chaza. Ngoku kwiinguqulelo zangoku kufuneka uyenze amaxesha angama-6 ukuba ubophe iinguqu. Ukuba awunazo iiguquguquki ezibotshiweyo, yile nto siyenzayo. Kwaye ekugqibeleni sesi sicelo kanye esisilelayo. Asiyonto ikhohlisayo.

Kubonakala ngathi, ingakanani inokwenzeka? Ibug apha, ibug phaya. Enyanisweni, i-bug ikuyo yonke indawo.

I-PostgreSQL kunye ne-JDBC zikhama yonke ijusi. UVladimir Sitnikov

Makhe sihlolisise. Umzekelo, sinezikrweqe ezibini. Inkqubo A enetheyibhile S kunye nomzobo B onetheyibhile S. Umbuzo – khetha idata kwitafile. Yintoni esiya kuba nayo kule meko? Siza kuba nempazamo. Siza kuba nazo zonke ezi zinto zingasentla. Umthetho ngulo - i-bug ikuyo yonke indawo, siya kuba nakho konke oku kungasentla.

I-PostgreSQL kunye ne-JDBC zikhama yonke ijusi. UVladimir Sitnikov

Ngoku umbuzo ngulo: "Kutheni?" Kubonakala ngathi kukho amaxwebhu ukuba sine-schema, ngoko kukho "search_path" eguquguqukayo esixelela ukuba siyijonge phi itafile. Kuya kubonakala ngathi kukho ukuguquguquka.

Yintoni ingxaki? Ingxaki kukuba iingxelo ezilungiselelwe umncedisi azikrokreli ukuba i-search_path inokutshintshwa ngumntu. Eli xabiso lihlala, njengoko linjalo, lingatshintshi kwisiseko sedatha. Kwaye ezinye iinxalenye zisenokungazifumani iintsingiselo ezintsha.

I-PostgreSQL kunye ne-JDBC zikhama yonke ijusi. UVladimir Sitnikov

Ewe, oku kuxhomekeke kwinguqulelo ovavanya kuyo. Kuxhomekeke ekubeni iitheyibhile zakho zahluke kangakanani. Kwaye uguqulelo 9.1 luyakwenza ngokulula imibuzo emidala. Iinguqulelo ezintsha zinokubamba i-bug kwaye zikuxelele ukuba une-bug.

I-PostgreSQL kunye ne-JDBC zikhama yonke ijusi. UVladimir Sitnikov

Cwangcisa indlela yokukhangela + iingxelo ezilungiselelwe umncedisi =
Isicwangciso esigciniweyo kufuneka singatshintshi uhlobo lwesiphumo

Indlela yokuyinyanga? Kukho iresiphi elula - musa ukuyenza. Akukho mfuneko yokutshintsha i-search_path ngelixa isicelo sisebenza. Ukuba uyatshintsha, kungcono ukwenza uxhumano olutsha.

Unokuxoxa, oko kukuthi, vula, uxoxe, udibanise. Mhlawumbi sinokuqinisekisa abaphuhlisi bedatha ukuba xa umntu etshintsha ixabiso, isiseko sedatha kufuneka sixelele umxhasi malunga noku: "Jonga, ixabiso lakho lihlaziywe apha. Mhlawumbi kufuneka usete ngokutsha iziteyitimenti kwaye uzenze kwakhona? Ngoku i-database iziphatha ngasese kwaye ayixeli nangayiphi na indlela ukuba iingxelo zitshintshile kwindawo ethile ngaphakathi.

Kwaye ndiza kugxininisa kwakhona - le yinto engaqhelekanga kwiJava. Siza kubona into efanayo kwi-PL/pgSQL enye ukuya kwenye. Kodwa iya kuveliswa apho.

I-PostgreSQL kunye ne-JDBC zikhama yonke ijusi. UVladimir Sitnikov

Makhe sizame ukhetho oluninzi lwedatha. Sikhetha kwaye sikhetha. Sinetafile enemiqolo eyisigidi. Umgca ngamnye unekhilobhayithi. Ngokumalunga ne-gigabyte yedatha. Kwaye sinememori esebenzayo kumatshini weJava we-128 megabytes.

Thina, njengoko kunconyiwe kuzo zonke iincwadi, sebenzisa ukusetyenzwa komjelo. Oko kukuthi, sivula resultSet kwaye sifunde idatha apho kancinci kancinci. Ngaba iya kusebenza? Ngaba iya kuwa kwinkumbulo? Ngaba uya kufunda kancinane? Masithembele kwi-database, masithembele kwi-Postgres. Asikholelwa kuyo. Ngaba siya kuwa ngaphandle kweMemori? Ngubani owafumana i-OutOfMemory? Ngubani owakwazi ukuyilungisa emva koko? Kukho umntu okwazile ukuyilungisa.

Ukuba unemiqolo eyisigidi, awukwazi ukukhetha kwaye ukhethe. OFFSET/LIMIT iyafuneka. Ngubani kolu khetho? Kwaye ngubani othanda ukudlala nge-autoCommit?

Apha, njengesiqhelo, ukhetho olungalindelekanga lujika luchanekile. Kwaye ukuba ucima ngokukhawuleza i-autoCommit, iya kunceda. Kutheni kunjalo? Inzululwazi ayazi ngale nto.

I-PostgreSQL kunye ne-JDBC zikhama yonke ijusi. UVladimir Sitnikov

Kodwa ngokungagqibekanga, bonke abathengi abaqhagamshela kwisiseko sedatha sePostgres balanda yonke idatha. I-PgJDBC ayikhethi cala kulo mba; ikhetha yonke imiqolo.

Kukho umahluko kumxholo we-FetchSize, oko kukuthi, ungatsho kwinqanaba lenkcazo eyahlukileyo apha, nceda ukhethe idatha ngo-10, 50. Kodwa oku akusebenzi de ucime i-autoCommit. Cima i-autoCommit - iqala ukusebenza.

Kodwa ukuhamba ngekhowudi kunye nokuseta setFetchSize kuyo yonke indawo akulunganga. Ke ngoko, senze useto oluya kuthetha ixabiso elingagqibekanga lodibaniso lonke.

I-PostgreSQL kunye ne-JDBC zikhama yonke ijusi. UVladimir Sitnikov

Nantso into esiyithethileyo. Iparameter ibunjiwe. Kwaye sifumene ntoni? Ukuba sikhetha amanani amancinci, ukuba, umzekelo, sikhetha imiqolo eyi-10 ngexesha, ngoko sineendleko eziphezulu kakhulu. Ngoko ke, eli xabiso kufuneka libekwe malunga nekhulu.

I-PostgreSQL kunye ne-JDBC zikhama yonke ijusi. UVladimir Sitnikov

Ngokufanelekileyo, ewe, kusafuneka ufunde ukuyinciphisa ngee-bytes, kodwa iresiphi yile: seta iRowFetchSize ngaphezulu kwekhulu kwaye wonwabe.

I-PostgreSQL kunye ne-JDBC zikhama yonke ijusi. UVladimir Sitnikov

Masiqhubele phambili ekufakeni idatha. Ukufakwa kulula, kukho iinketho ezahlukeneyo. Umzekelo, INSERT, VALUES. Olu lukhetho oluhle. Unokuthi "FAKA KHETHA". Ngokwenza into enye. Akukho mahluko ekusebenzeni.

Iincwadi zithi kufuneka wenze ingxelo yeBatch, iincwadi zithi unokuphumeza imiyalelo entsonkothileyo ngeeparenthesi ezininzi. Kwaye i-Postgres inomsebenzi omangalisayo-unokwenza i-COPY, oko kukuthi, yenze ngokukhawuleza.

I-PostgreSQL kunye ne-JDBC zikhama yonke ijusi. UVladimir Sitnikov

Ukuba uyayilinganisa, unokuphinda ufumane izinto ezinomdla. Sifuna isebenze njani le nto? Asifuni ukucazulula kwaye singenzi imiyalelo engeyomfuneko.

I-PostgreSQL kunye ne-JDBC zikhama yonke ijusi. UVladimir Sitnikov

Enyanisweni, i-TCP ayisivumeli ukuba senze oku. Ukuba umxhasi uxakekile ethumela isicelo, ngoko ke i-database ayifundi izicelo kwiinzame zokusithumela iimpendulo. Isiphumo sokugqibela kukuba umxhasi ulindele ukuba isiseko sedatha sifunde isicelo, kwaye i-database ilindele ukuba umxhasi afunde impendulo.

I-PostgreSQL kunye ne-JDBC zikhama yonke ijusi. UVladimir Sitnikov

Kwaye ke ngoko umxhasi unyanzelekile ukuba athumele ngamaxesha athile ipakethi yongqamaniso. Unxibelelwano olongezelelweyo lwenethiwekhi, inkcitho eyongezelelweyo yexesha.

I-PostgreSQL kunye ne-JDBC zikhama yonke ijusi. UVladimir SitnikovKwaye okukhona sibongeza, kokukhona iba mbi ngakumbi. Umqhubi akanathemba kwaye uyongeza rhoqo, malunga nemigca engama-200, kuxhomekeke kubukhulu bemigca, njl.

I-PostgreSQL kunye ne-JDBC zikhama yonke ijusi. UVladimir Sitnikov

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

Kwenzeka ukuba ulungise umgca omnye kwaye yonke into iya kukhawuleza ngamaxesha angama-10. Iyenzeka. Ngoba? Njengesiqhelo, into efana nale sele isetyenziswe kwenye indawo. Kwaye ixabiso "128" lithetha ukungasebenzisi i-batching.

I-PostgreSQL kunye ne-JDBC zikhama yonke ijusi. UVladimir Sitnikov

iJava microbenchmark ukubopha

Kulungile ukuba oku akuzange kufakwe kuguqulelo olusemthethweni. Ifunyenwe ngaphambi kokuba kuqale ukukhululwa. Zonke iintsingiselo endizinikayo zisekelwe kwiinguqulelo zangoku.

I-PostgreSQL kunye ne-JDBC zikhama yonke ijusi. UVladimir Sitnikov

Masiyizame. Silinganisa i-InsertBatch elula. Silinganisa i-InsertBatch kaninzi, o.k. into enye, kodwa maninzi amaxabiso. Inyathelo elikhohlisayo. Ayinguye wonke umntu onokuyenza le nto, kodwa yintshukumo elula, ilula kakhulu kune-COPY.

I-PostgreSQL kunye ne-JDBC zikhama yonke ijusi. UVladimir Sitnikov

Unokwenza IKOPI.

I-PostgreSQL kunye ne-JDBC zikhama yonke ijusi. UVladimir Sitnikov

Kwaye ungakwenza oku kwizakhiwo. Chaza uhlobo olungagqibekanga lomsebenzisi, dlula uluhlu kwaye FAKA ngqo kwitafile.

Ukuba uvula ikhonkco: pgjdbc/ubenchmsrk/InsertBatch.java, ke le khowudi ikwiGitHub. Unokubona ngokuthe ngqo ukuba zeziphi izicelo ezenziwa apho. Ayinamsebenzi lonto.

I-PostgreSQL kunye ne-JDBC zikhama yonke ijusi. UVladimir Sitnikov

Sayisungula. Kwaye into yokuqala esiyibonileyo kukuba ukungasebenzisi ibhetshi akunakwenzeka. Zonke iinketho zokudibanisa ziro, o.k.t. ixesha lokwenziwa nguziro xa lithelekiswa nokuphunyezwa kwexesha elinye.

I-PostgreSQL kunye ne-JDBC zikhama yonke ijusi. UVladimir Sitnikov

Sifaka idatha. Yitafile elula kakhulu. Iintsika ezintathu. Kwaye sibona ntoni apha? Siyabona ukuba zontathu ezi zikhetho zithelekiseka. Kwaye iKOPI, ngokuqinisekileyo, ingcono.

I-PostgreSQL kunye ne-JDBC zikhama yonke ijusi. UVladimir Sitnikov

Kuxa sifaka iziqwenga. Xa sithe ixabiso elinye VALUES, ezimbini VALUES amaxabiso, ezintathu VALUES amaxabiso, okanye sibonisa 10 kuwo ahlulwe ngesiphumlisi. Oku kuthe tyaba ngoku. 1, 2, 4, 128. Kuyabonakala ukuba i-Batch Insert, eyotywe ngeblue, imenza azive engcono kakhulu. Oko kukuthi, xa ufaka ibe nye ngexesha okanye naxa ufaka isine ngexesha, ibalunganga ngokuphindiweyo, kuba nje sixinanise kancinci kwi-VALUES. Imbalwa imisebenzi ye-EXECUTE.

Ukusebenzisa i-COPY kwimiqulu emincinci ayithembisi kakhulu. Khange ndizobe kwezimbini zokuqala. Baya ezulwini, oko kukuthi, la manani aluhlaza ukuze COPY.

IKOPI kufuneka isetyenziswe xa ubuncinane unekhulu lemiqolo yedatha. Umphezulu wokuvula olu xhulumaniso mkhulu. Kwaye, ukunyaniseka, andizange ndimbe kweli cala. Ndiyiphucule iBatch, kodwa hayi iKOPI.

Senza ntoni ngokulandelayo? Sayizama. Siyaqonda ukuba kufuneka sisebenzise izakhi okanye i-bacth ehlakaniphile edibanisa iintsingiselo ezininzi.

I-PostgreSQL kunye ne-JDBC zikhama yonke ijusi. UVladimir Sitnikov

Kufuneka uthathe ntoni kwingxelo yanamhlanje?

  • PreparedStatement yinto yethu yonke. Oku kunika okuninzi kwimveliso. Ivelisa iflophu enkulu kwi-ointment.
  • Kwaye kufuneka wenze CACA UHLALUTYIWE amaxesha ama-6.
  • Kwaye kufuneka sinciphise i-OFFSET 0, kunye namaqhinga afana no +0 ukuze silungise ipesenti eseleyo yemibuzo yethu eyingxaki.

umthombo: www.habr.com

Yongeza izimvo