PostgreSQL u JDBC għafas il-meraq kollu. Vladimir Sitnikov

Nissuġġerixxi li taqra t-traskrizzjoni tar-rapport tal-bidu tal-2016 ta' Vladimir Sitnikov "PostgreSQL u JDBC qed joħorġu l-meraq kollu"

PostgreSQL u JDBC għafas il-meraq kollu. Vladimir Sitnikov

PostgreSQL u JDBC għafas il-meraq kollu. Vladimir Sitnikov

Il-waranofsinhar it-tajjeb Jisimni Vladimir Sitnikov. Ilni naħdem għal NetCracker għal 10 snin. U jien l-aktar fil-produttività. Dak kollu relatat mal-Java, dak kollu relatat mal-SQL huwa dak li nħobb.

U llum se nitkellem dwar dak li ltqajna magħhom fil-kumpanija meta bdejna nużaw PostgreSQL bħala server tad-database. U aħna l-aktar naħdmu ma 'Java. Imma dak li se ngħidlek illum mhux biss dwar Java. Kif wriet il-prattika, dan iseħħ ukoll f'lingwi oħra.

PostgreSQL u JDBC għafas il-meraq kollu. Vladimir Sitnikov

Se nitkellmu:

  • dwar it-teħid ta' kampjuni tad-dejta.
  • Dwar l-iffrankar tad-dejta.
  • U wkoll dwar il-prestazzjoni.
  • U dwar ir-rakes taħt l-ilma li hemm midfuna.

PostgreSQL u JDBC għafas il-meraq kollu. Vladimir Sitnikov

Nibdew b'mistoqsija sempliċi. Aħna nagħżlu ringiela waħda mit-tabella bbażata fuq iċ-ċavetta primarja.

PostgreSQL u JDBC għafas il-meraq kollu. Vladimir Sitnikov

Id-database tinsab fuq l-istess host. U din il-biedja kollha tieħu 20 millisekondi.

PostgreSQL u JDBC għafas il-meraq kollu. Vladimir Sitnikov

Dawn l-20 millisekondi huma ħafna. Jekk għandek 100 talba bħal din, allura tqatta’ ħin kull sekonda tiskrollja dawn it-talbiet, jiġifieri qed naħlu l-ħin.

Aħna ma nħobbux nagħmlu dan u nħarsu lejn dak li toffrilna l-bażi għal dan. Id-database toffrilna żewġ għażliet biex inwettqu mistoqsijiet.

PostgreSQL u JDBC għafas il-meraq kollu. Vladimir Sitnikov

L-ewwel għażla hija talba sempliċi. X'hemm tajjeb dwarha? Il-fatt li nieħduha u nibagħtuha, u xejn aktar.

PostgreSQL u JDBC għafas il-meraq kollu. Vladimir Sitnikov

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

Id-database għandha wkoll mistoqsija avvanzata, li hija aktar delikata, iżda aktar funzjonali. Tista 'tibgħat separatament talba għal parsing, eżekuzzjoni, rbit varjabbli, eċċ.

Mistoqsija super estiża hija xi ħaġa li mhux se nkopru fir-rapport attwali. Aħna, forsi, irridu xi ħaġa mid-database u hemm lista ta 'xewqat li ġiet iffurmata f'xi forma, jiġifieri dan huwa dak li rridu, iżda huwa impossibbli issa u fis-sena d-dieħla. Allura aħna biss irreġistraha u se mmorru ħawwad in-nies prinċipali.

PostgreSQL u JDBC għafas il-meraq kollu. Vladimir Sitnikov

U dak li nistgħu nagħmlu huwa mistoqsija sempliċi u mistoqsija estiża.

X'inhu speċjali dwar kull approċċ?

Mistoqsija sempliċi hija tajba għal eżekuzzjoni ta 'darba. Ladarba jsir u minsija. U l-problema hija li ma jappoġġjax il-format tad-dejta binarja, jiġifieri mhux adattat għal xi sistemi ta 'prestazzjoni għolja.

PostgreSQL u JDBC għafas il-meraq kollu. Vladimir Sitnikov

Mistoqsija estiża - tippermettilek tiffranka l-ħin fuq l-analiżi. Dan huwa dak li għamilna u bdejna nużaw. Dan tassew għenna. Hemm mhux biss iffrankar fuq parsing. Hemm iffrankar fuq it-trasferiment tad-data. It-trasferiment tad-dejta f'format binarju huwa ħafna aktar effiċjenti.

PostgreSQL u JDBC għafas il-meraq kollu. Vladimir Sitnikov

Ejja ngħaddu għall-prattika. Hekk tidher applikazzjoni tipika. Jista 'jkun Java, eċċ.

Ħloqna dikjarazzjoni. Esegwit il-kmand. Maħluq mill-qrib. Fejn hu l-iżball hawn? X'inhi l-problema? Mhux problema. Dan huwa dak li jgħid fil-kotba kollha. Hekk għandu jinkiteb. Jekk trid prestazzjoni massima, ikteb hekk.

PostgreSQL u JDBC għafas il-meraq kollu. Vladimir Sitnikov

Iżda l-prattika wriet li dan ma jaħdimx. Għaliex? Għax għandna metodu "qrib". U meta nagħmlu dan, mil-lat tad-database jirriżulta li huwa bħal min ipejjep jaħdem ma 'database. Aħna għedna "PARSE EXECUTE DEALLOCATE".

Għaliex dan kollu ħolqien żejjed u ħatt ta 'dikjarazzjonijiet? Ħadd ma għandu bżonnhom. Imma dak li jiġri normalment fil-PreparedStatements huwa li meta nagħlquhom, jagħlqu kollox fuq id-database. Dan mhux dak li rridu.

PostgreSQL u JDBC għafas il-meraq kollu. Vladimir Sitnikov

Irridu, bħal nies b'saħħithom, naħdmu mal-bażi. Ħadna u ħejjejna d-dikjarazzjoni tagħna darba, imbagħad inwettquha ħafna drabi. Fil-fatt, ħafna drabi - din hija darba fil-ħajja kollha tal-applikazzjonijiet - ġew parsed. U nużaw l-istess id-dikjarazzjoni fuq RESTs differenti. Dan huwa l-għan tagħna.

PostgreSQL u JDBC għafas il-meraq kollu. Vladimir Sitnikov

Kif nistgħu niksbu dan?

PostgreSQL u JDBC għafas il-meraq kollu. Vladimir Sitnikov

Huwa sempliċi ħafna - m'hemmx għalfejn tagħlaq dikjarazzjonijiet. Niktbuha hekk: "tipprepara" "eżegwixxi".

PostgreSQL u JDBC għafas il-meraq kollu. Vladimir Sitnikov

PostgreSQL u JDBC għafas il-meraq kollu. Vladimir Sitnikov

Jekk inniedu xi ħaġa bħal din, allura huwa ċar li xi ħaġa se tfur x'imkien. Jekk ma jkunx ċar, tista 'tipprovaha. Ejja nikteb benchmark li juża dan il-metodu sempliċi. Oħloq dikjarazzjoni. Innieduha fuq xi verżjoni tas-sewwieq u nsibu li tiġġarraf pjuttost malajr bit-telf tal-memorja kollha li kellu.

Huwa ċar li żbalji bħal dawn jiġu kkoreġuti faċilment. Mhux se nitkellem dwarhom. Imma jien ngħid li l-verżjoni l-ġdida taħdem ħafna aktar malajr. Il-metodu huwa stupid, iżda xorta.

PostgreSQL u JDBC għafas il-meraq kollu. Vladimir Sitnikov

Kif taħdem b'mod korrett? X’għandna nagħmlu għal dan?

Fir-realtà, l-applikazzjonijiet dejjem jagħlqu d-dikjarazzjonijiet. Fil-kotba kollha jgħidu li tagħlaqha, inkella tnixxi l-memorja.

U PostgreSQL ma jafx kif jaħżen il-mistoqsijiet fil-cache. Huwa meħtieġ li kull sessjoni toħloq din il-cache għaliha nnifisha.

U lanqas ma rridu naħlu l-ħin fuq l-analiżi.

PostgreSQL u JDBC għafas il-meraq kollu. Vladimir Sitnikov

U bħas-soltu għandna żewġ għażliet.

L-ewwel għażla hija li nieħduha u ngħidu li ejja nagħlaq kollox f'PgSQL. Hemm cache hemm. Hija caches kollox. Se tirriżulta mill-aqwa. Rajna dan. Għandna 100500 talba. Ma jaħdimx. Ma naqblux li nbiddlu t-talbiet fi proċeduri manwalment. Le le.

Għandna t-tieni għażla - teħodha u naqtgħuha nfusna. Niftħu s-sorsi u nibdew naqtgħu. Rajna u rajna. Irriżulta li mhuwiex daqshekk diffiċli li tagħmel.

PostgreSQL u JDBC għafas il-meraq kollu. Vladimir Sitnikov

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

Dan deher f'Awwissu 2015. Issa hemm verżjoni aktar moderna. U kollox huwa kbir. Tant jaħdem tajjeb li ma nbiddlu xejn fl-applikazzjoni. U saħansitra waqfu naħsbu fid-direzzjoni ta 'PgSQL, jiġifieri dan kien biżżejjed għalina biex innaqqsu l-ispejjeż ġenerali kollha għal kważi żero.

Għaldaqstant, id-dikjarazzjonijiet ippreparati mis-Server huma attivati ​​fil-5 eżekuzzjoni sabiex tiġi evitata ħela ta 'memorja fid-database fuq kull talba ta' darba.

PostgreSQL u JDBC għafas il-meraq kollu. Vladimir Sitnikov

Tista' tistaqsi - fejn huma n-numri? X'qed tieħu? U hawn mhux se nagħti numri, għax kull talba għandha tagħha.

Il-mistoqsijiet tagħna kienu tali li qattajna madwar 20 millisekondi fuq parsing fuq mistoqsijiet OLTP. Kien hemm 0,5 millisekondi għall-eżekuzzjoni, 20 millisekondi għall-parsing. Talba – 10 KiB ta’ test, 170 linja ta’ pjan. Din hija talba OLTP. Hija titlob 1, 5, 10 linji, kultant aktar.

Imma ma ridniex naħlu 20 millisekonda xejn. Naqqasna għal 0. Kollox kbir.

X'tista' tieħu bogħod minn hawn? Jekk għandek Java, allura tieħu l-verżjoni moderna tas-sewwieq u tiċċelebra.

Jekk titkellem lingwa differenti, allura aħseb - forsi għandek bżonn dan ukoll? Għax mil-lat tal-lingwa finali, pereżempju, jekk PL 8 jew għandek LibPQ, allura mhux ovvju għalik li qed tqatta’ ħin mhux fuq eżekuzzjoni, fuq parsing, u dan ta’ min iċċekkja. Kif? Kollox huwa b'xejn.

PostgreSQL u JDBC għafas il-meraq kollu. Vladimir Sitnikov

Ħlief li hemm żbalji u xi pekuljaretajiet. U nitkellmu dwarhom issa. Ħafna minnha se tkun dwar l-arkeoloġija industrijali, dwar dak li sibna, dak li ltqajna miegħu.

PostgreSQL u JDBC għafas il-meraq kollu. Vladimir Sitnikov

Jekk it-talba tiġi ġġenerata b'mod dinamiku. Dan jiġri. Xi ħadd iwaħħal il-kordi flimkien, li jirriżulta f'mistoqsija SQL.

Għaliex hu ħażin? Ħażin għax kull darba nispiċċaw bi spaga differenti.

U l-hashCode ta 'din is-sekwenza differenti jeħtieġ li jerġa' jinqara. Dan huwa verament kompitu tas-CPU - li ssib test ta' talba twil anke f'hash eżistenti mhux daqshekk faċli. Għalhekk, il-konklużjoni hija sempliċi - tiġġenerax talbiet. Aħżenhom f'varjabbli wieħed. U tifraħ.

PostgreSQL u JDBC għafas il-meraq kollu. Vladimir Sitnikov

Problema li jmiss. It-tipi tad-dejta huma importanti. Hemm ORMs li jgħidu li ma jimpurtax x'tip ta 'NULL hemm, ħalli jkun hemm xi tip. Jekk Int, allura ngħidu setInt. U jekk NULL, allura ħalli dejjem ikun VARCHAR. U x'differenza tagħmel fl-aħħar dak NULL hemm? Id-database nnifisha se tifhem kollox. U din l-istampa ma taħdimx.

Fil-prattika, id-database ma jimpurtaha xejn. Jekk l-ewwel darba għidt li dan huwa numru, u t-tieni darba għidt li huwa VARCHAR, allura huwa impossibbli li terġa 'tuża dikjarazzjonijiet ippreparati mis-Server. U f'dan il-każ, irridu noħolqu mill-ġdid id-dikjarazzjoni tagħna.

PostgreSQL u JDBC għafas il-meraq kollu. Vladimir Sitnikov

Jekk qed tesegwixxi l-istess mistoqsija, kun żgur li t-tipi tad-dejta fil-kolonna tiegħek mhumiex konfużi. Trid toqgħod attent għal NULL. Dan huwa żball komuni li kellna wara li bdejna nużaw PreparedStatements

PostgreSQL u JDBC għafas il-meraq kollu. Vladimir Sitnikov

Okay, mixgħula. Forsi ħadu lix-xufier. U l-produttività naqset. L-affarijiet marru ħażin.

Kif jiġri dan? Dan huwa bug jew karatteristika? Sfortunatament, ma kienx possibbli li wieħed jifhem jekk dan hux bug jew karatteristika. Iżda hemm xenarju sempliċi ħafna għar-riproduzzjoni ta 'din il-problema. Hija kompletament bla mistenni ambushed magħna. U tikkonsisti fit-teħid ta 'kampjuni litteralment minn tabella waħda. Aħna, ovvjament, kellna aktar talbiet bħal dawn. Bħala regola, kienu jinkludu żewġ jew tliet tabelli, iżda hemm tali xenarju ta 'daqq. Ħu kwalunkwe verżjoni mid-database tiegħek u tilgħabha.

PostgreSQL u JDBC għafas il-meraq kollu. Vladimir Sitnikov

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

Il-punt hu li għandna żewġ kolonni, li kull waħda minnhom hija indiċjata. Hemm miljun ringiela f'kolonna waħda NULL. U t-tieni kolonna fiha biss 20 linja. Meta nwettqu mingħajr varjabbli marbuta, kollox jaħdem tajjeb.

Jekk nibdew neżegwixxu b'varjabbli marbuta, jiġifieri nwettqu l-"?" jew "$1" għat-talba tagħna, x'nilħu nispiċċaw?

PostgreSQL u JDBC għafas il-meraq kollu. Vladimir Sitnikov

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

L-ewwel eżekuzzjoni hija kif mistenni. It-tieni waħda hija ftit aktar mgħaġġla. Xi ħaġa kienet fil-cache. It-tielet, ir-raba’, il-ħames. Imbagħad bang - u xi ħaġa bħal dik. U l-agħar ħaġa hija li dan jiġri fis-sitt eżekuzzjoni. Min kien jaf li kien meħtieġ li jsiru eżattament sitt eżekuzzjonijiet sabiex wieħed jifhem x'kien il-pjan ta' eżekuzzjoni attwali?

PostgreSQL u JDBC għafas il-meraq kollu. Vladimir Sitnikov

Min hu ħati? X'ġara? Id-database fiha ottimizzazzjoni. U jidher li huwa ottimizzat għall-każ ġeneriku. U, għalhekk, tibda f'xi punt, hi taqleb għal pjan ġeneriku, li, sfortunatament, jista 'jirriżulta li jkun differenti. Jista 'jirriżulta li jkun l-istess, jew jista' jkun differenti. U hemm xi tip ta 'valur limitu li jwassal għal din l-imġieba.

X'tista 'tagħmel dwar dan? Hawnhekk, ovvjament, huwa aktar diffiċli li tassumi xi ħaġa. Hemm soluzzjoni sempliċi li nużaw. Dan huwa +0, OFFSET 0. Żgur li taf soluzzjonijiet bħal dawn. Aħna nieħduha biss u nżidu "+0" mat-talba u kollox huwa tajjeb. Nurik aktar tard.

U hemm għażla oħra - ħares lejn il-pjanijiet aktar bir-reqqa. L-iżviluppatur għandu mhux biss jikteb talba, iżda jgħid ukoll "jispjega janalizza" 6 darbiet. Jekk huwa 5, mhux se jaħdem.

U hemm it-tielet għażla - ikteb ittra lil pgsql-hackers. Jien ktibt, madankollu, għadu mhux ċar jekk dan hux bug jew karatteristika.

PostgreSQL u JDBC għafas il-meraq kollu. Vladimir Sitnikov

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

Filwaqt li qed naħsbu jekk dan hux bug jew karatteristika, ejja nirranġawha. Ejja nieħdu t-talba tagħna u żid "+0". Kollox sew. Żewġ simboli u lanqas m'għandekx għalfejn taħseb dwar kif inhi jew x'inhi. Sempliċi ħafna. Aħna sempliċiment ipprojbixxa lid-database milli tuża indiċi fuq din il-kolonna. M'għandniex indiċi fuq il-kolonna "+0" u dak hu, id-database ma tużax l-indiċi, kollox huwa tajjeb.

PostgreSQL u JDBC għafas il-meraq kollu. Vladimir Sitnikov

Din hija r-regola ta '6 spjega. Issa fil-verżjonijiet kurrenti trid tagħmel dan 6 darbiet jekk ikollok varjabbli marbuta. Jekk m'għandekx varjabbli marbuta, dan huwa dak li nagħmlu. U fl-aħħar mill-aħħar hija proprju din it-talba li tfalli. Mhix xi ħaġa delikata.

Jidher, kemm hu possibbli? Bug hawn, bug hemm. Fil-fatt, il-bug huwa kullimkien.

PostgreSQL u JDBC għafas il-meraq kollu. Vladimir Sitnikov

Ejja nagħtu ħarsa aktar mill-qrib. Per eżempju, għandna żewġ skemi. Skema A bit-tabella S u dijagramma B bit-tabella S. Mistoqsija – agħżel data minn tabella. X’se jkollna f’dan il-każ? Ikollna żball. Se jkollna dak kollu li ntqal hawn fuq. Ir-regola hija - bug huwa kullimkien, se jkollna dak kollu ta 'hawn fuq.

PostgreSQL u JDBC għafas il-meraq kollu. Vladimir Sitnikov

Issa l-mistoqsija hija: "Għaliex?" Jidher li hemm dokumentazzjoni li jekk ikollna schema, allura hemm varjabbli "search_path" li tgħidilna fejn għandna nfittxu t-tabella. Jidher li hemm varjabbli.

X'inhi l-problema? Il-problema hija li d-dikjarazzjonijiet ippreparati mis-server ma jissuspettawx li search_path jista' jinbidel minn xi ħadd. Dan il-valur jibqa', kif kien, kostanti għad-database. U xi partijiet jistgħu ma jieħdux tifsiriet ġodda.

PostgreSQL u JDBC għafas il-meraq kollu. Vladimir Sitnikov

Naturalment, dan jiddependi fuq il-verżjoni li qed tittestja fuqha. Jiddependi fuq kemm serjament it-tabelli tiegħek huma differenti. U l-verżjoni 9.1 sempliċiment tesegwixxi t-talbiet qodma. Verżjonijiet ġodda jistgħu jaqbdu l-bug u jgħidulek li għandek bug.

PostgreSQL u JDBC għafas il-meraq kollu. Vladimir Sitnikov

Issettja search_path + dikjarazzjonijiet ippreparati mis-server =
cached pjan m'għandux ibiddel it-tip ta 'riżultat

Kif tittrattaha? Hemm riċetta sempliċi - tagħmel dan. M'hemmx bżonn li tinbidel search_path waqt li l-applikazzjoni tkun qed taħdem. Jekk tibdel, huwa aħjar li toħloq konnessjoni ġdida.

Tista’ tiddiskuti, jiġifieri tiftaħ, tiddiskuti, żid. Forsi nistgħu nikkonvinċu lill-iżviluppaturi tad-database li meta xi ħadd jibdel valur, id-database għandha tgħid lill-klijent dwar dan: "Ara, il-valur tiegħek ġie aġġornat hawn. Forsi trid tirrisettja d-dikjarazzjonijiet u toħloqhom mill-ġdid?” Issa d-database iġib ruħu bil-moħbi u ma jirrapporta bl-ebda mod li d-dikjarazzjonijiet inbidlu x'imkien ġewwa.

U ser nenfasizza mill-ġdid - din hija xi ħaġa li mhix tipika għal Java. Se naraw l-istess ħaġa f'PL/pgSQL wieħed għal wieħed. Iżda se jiġi riprodott hemmhekk.

PostgreSQL u JDBC għafas il-meraq kollu. Vladimir Sitnikov

Ejja nippruvaw aktar għażla tad-dejta. Aħna nagħżlu u nagħżlu. Għandna tabella b'miljun ringiela. Kull linja hija kilobyte. Bejn wieħed u ieħor gigabyte ta' data. U għandna memorja ta 'ħidma fil-magna Java ta' 128 megabytes.

Aħna, kif rakkomandat fil-kotba kollha, nużaw l-ipproċessar tan-nixxiegħa. Jiġifieri niftħu resultSet u naqraw id-dejta minn hemm ftit ftit. Se taħdem? Se jaqa' mill-memorja? Se taqra ftit? Ejja nafdaw fid-database, ejja nafdaw f'Postgres. Aħna ma nemmnux. Se naqgħu OutOFMemory? Min esperjenza OutOfMemory? Min irnexxielu jirranġaha wara dan? Xi ħadd irnexxielu jirranġaha.

Jekk għandek miljun ringiela, ma tistax sempliċement tagħżel u tagħżel. OFFSET/LIMIT huwa meħtieġ. Min hu għal din l-għażla? U min hu favur li tilgħab bl-autoCommit?

Hawnhekk, bħas-soltu, l-iktar għażla mhux mistennija tirriżulta li hija korretta. U jekk f'daqqa waħda titfi autoCommit, dan jgħin. Għalfejn? Ix-xjenza ma tafx dwar dan.

PostgreSQL u JDBC għafas il-meraq kollu. Vladimir Sitnikov

Iżda awtomatikament, il-klijenti kollha li jikkonnettjaw ma 'database Postgres iġibu d-dejta kollha. PgJDBC mhuwiex eċċezzjoni f'dan ir-rigward; jagħżel ir-ringieli kollha.

Hemm varjazzjoni fuq it-tema FetchSize, jiġifieri tista 'tgħid fil-livell ta' dikjarazzjoni separata li hawn, jekk jogħġbok agħżel id-dejta minn 10, 50. Iżda dan ma jaħdimx sakemm titfi l-autoCommit. AutoCommit mitfi - jibda jaħdem.

Imma li tgħaddi mill-kodiċi u li tistabbilixxi setFetchSize kullimkien huwa inkonvenjenti. Għalhekk, għamilna setting li jgħid il-valur default għall-konnessjoni kollha.

PostgreSQL u JDBC għafas il-meraq kollu. Vladimir Sitnikov

Hekk għidna. Il-parametru ġie kkonfigurat. U x’ksibna? Jekk nagħżlu ammonti żgħar, jekk, pereżempju, nagħżlu 10 ringieli kull darba, allura għandna spejjeż ġenerali kbar ħafna. Għalhekk, dan il-valur għandu jkun issettjat għal madwar mija.

PostgreSQL u JDBC għafas il-meraq kollu. Vladimir Sitnikov

Idealment, ovvjament, xorta trid titgħallem kif tillimitaha f'bytes, iżda r-riċetta hija din: issettja defaultRowFetchSize għal aktar minn mija u kun kuntent.

PostgreSQL u JDBC għafas il-meraq kollu. Vladimir Sitnikov

Ejja ngħaddu għall-inserzjoni tad-data. L-inserzjoni hija aktar faċli, hemm għażliet differenti. Per eżempju, Daħħal, VALURI. Din hija għażla tajba. Tista 'tgħid "INSERT SELECT". Fil-prattika hija l-istess ħaġa. M'hemm l-ebda differenza fil-prestazzjoni.

Kotba jgħidu li għandek bżonn tesegwixxi dikjarazzjoni Lott, kotba jgħidu li tista 'tesegwixxi kmandi aktar kumplessi b'diversi parentesi. U Postgres għandu karatteristika mill-isbaħ - tista 'tagħmel KOPJA, jiġifieri tagħmel dan aktar malajr.

PostgreSQL u JDBC għafas il-meraq kollu. Vladimir Sitnikov

Jekk tkejjelha, tista 'terġa' tagħmel xi skoperti interessanti. Kif irridu li dan jaħdem? Aħna rridu ma parse u ma teżegwixxix kmandi bla bżonn.

PostgreSQL u JDBC għafas il-meraq kollu. Vladimir Sitnikov

Fil-prattika, TCP ma jippermettix li nagħmlu dan. Jekk il-klijent ikun okkupat jibgħat talba, allura d-database ma taqrax it-talbiet f'tentattivi biex tibgħatilna tweġibiet. Ir-riżultat aħħari huwa li l-klijent jistenna li d-database taqra t-talba, u d-database tistenna li l-klijent jaqra r-rispons.

PostgreSQL u JDBC għafas il-meraq kollu. Vladimir Sitnikov

U għalhekk il-klijent huwa sfurzat li perjodikament jibgħat pakkett ta 'sinkronizzazzjoni. Interazzjonijiet tan-netwerk żejda, ħela ta 'ħin żejjed.

PostgreSQL u JDBC għafas il-meraq kollu. Vladimir SitnikovU aktar ma nżiduhom, iktar tmur għall-agħar. Is-sewwieq huwa pjuttost pessimist u jżidhom spiss, madwar darba kull 200 linja, skont id-daqs tal-linji, eċċ.

PostgreSQL u JDBC għafas il-meraq kollu. Vladimir Sitnikov

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

Jiġri li tikkoreġi linja waħda biss u kollox iħaffef 10 darbiet. Dan jiġri. Għaliex? Bħas-soltu, kostanti bħal din diġà ntużat x'imkien. U l-valur "128" fisser li ma jużax batching.

PostgreSQL u JDBC għafas il-meraq kollu. Vladimir Sitnikov

Xedd tal-mikrobenchmark Java

Tajjeb li dan ma kienx inkluż fil-verżjoni uffiċjali. Skopert qabel ma beda r-rilaxx. It-tifsiriet kollha li nagħti huma bbażati fuq verżjonijiet moderni.

PostgreSQL u JDBC għafas il-meraq kollu. Vladimir Sitnikov

Ejja nippruvawha. Aħna nkejlu InsertBatch sempliċi. Aħna nkejlu InsertBatch diversi drabi, jiġifieri l-istess ħaġa, iżda hemm ħafna valuri. Mossa delikata. Mhux kulħadd jista 'jagħmel dan, iżda hija mossa daqshekk sempliċi, ħafna aktar faċli minn KOPJA.

PostgreSQL u JDBC għafas il-meraq kollu. Vladimir Sitnikov

Tista' tagħmel KOPJA.

PostgreSQL u JDBC għafas il-meraq kollu. Vladimir Sitnikov

U tista 'tagħmel dan fuq strutturi. Iddikjara t-tip default tal-Utent, tgħaddi l-array u Daħħal direttament mat-tabella.

Jekk tiftaħ il-link: pgjdbc/ubenchmsrk/InsertBatch.java, allura dan il-kodiċi jinsab fuq GitHub. Tista 'tara speċifikament liema talbiet huma ġġenerati hemmhekk. Ma jimpurtax.

PostgreSQL u JDBC għafas il-meraq kollu. Vladimir Sitnikov

Nedejna. U l-ewwel ħaġa li rrealizzajna kienet li ma nużawx il-lott huwa sempliċement impossibbli. L-għażliet kollha tal-lottijiet huma żero, jiġifieri l-ħin tal-eżekuzzjoni huwa prattikament żero meta mqabbel ma 'eżekuzzjoni ta' darba.

PostgreSQL u JDBC għafas il-meraq kollu. Vladimir Sitnikov

Aħna ndaħħlu data. Hija tabella sempliċi ħafna. Tliet kolonni. U x’naraw hawn? Naraw li dawn it-tliet għażliet huma bejn wieħed u ieħor komparabbli. U KOPJA hija, ovvjament, aħjar.

PostgreSQL u JDBC għafas il-meraq kollu. Vladimir Sitnikov

Dan meta ndaħħlu biċċiet. Meta għidna li valur VALURI wieħed, żewġ valuri VALURI, tliet valuri VALURI, jew indika 10 minnhom separati b'virgola. Dan huwa biss orizzontali issa. 1, 2, 4, 128. Wieħed jista 'jara li l-Insert tal-Lott, li huwa mfassal bil-blu, iġġiegħlu jħossu ħafna aħjar. Jiġifieri, meta ddaħħal wieħed kull darba jew anke meta ddaħħal erbgħa kull darba, isir id-doppju ta’ tajjeb, sempliċiment għax daħħalna ftit aktar fil-VALURI. Inqas operazzjonijiet EXECUTE.

L-użu tal-COPY fuq volumi żgħar huwa estremament mhux promettenti. Lanqas għamilt fuq l-ewwel tnejn. Huma jmorru s-sema, jiġifieri, dawn in-numri ħodor għal KOPJA.

KOPJA għandha tintuża meta jkollok mill-inqas mitt ringiela ta' data. L-overhead tal-ftuħ ta 'din il-konnessjoni hija kbira. U, biex inkun onest, ma ħafferx f'din id-direzzjoni. I ottimizzati Lott, iżda mhux KOPJA.

X'nagħmlu wara? Aħna ppruvajna. Nifhmu li rridu nużaw jew strutturi jew batth għaqlija li jgħaqqad diversi tifsiriet.

PostgreSQL u JDBC għafas il-meraq kollu. Vladimir Sitnikov

X'għandek tieħu bogħod mir-rapport tal-lum?

  • PreparedStatement huwa kollox tagħna. Dan jagħti ħafna għall-produttività. Jipproduċi flop kbir fl-ingwent.
  • U trid tagħmel SPJEGA ANALIZZA 6 darbiet.
  • U għandna bżonn inħallu OFFSET 0, u tricks bħal +0 sabiex nikkoreġu l-persentaġġ li jifdal tal-mistoqsijiet problematiċi tagħna.

Sors: www.habr.com

Żid kumment