PostgreSQL da JDBC sun matse duk ruwan 'ya'yan itace. Vladimir Sitnikov

Ina ba da shawarar ku karanta kwafin rahoton Vladimir Sitnikov na farkon 2016 "PostgreSQL da JDBC suna fitar da duk ruwan 'ya'yan itace"

PostgreSQL da JDBC sun matse duk ruwan 'ya'yan itace. Vladimir Sitnikov

PostgreSQL da JDBC sun matse duk ruwan 'ya'yan itace. Vladimir Sitnikov

Barka da rana Sunana Vladimir Sitnikov. Na yi aiki da NetCracker na tsawon shekaru 10. Kuma yawanci ina cikin yawan aiki. Duk abin da ya shafi Java, duk abin da ke da alaka da SQL shine abin da nake so.

Kuma a yau zan yi magana game da abin da muka ci karo da shi a kamfanin lokacin da muka fara amfani da PostgreSQL a matsayin uwar garken bayanai. Kuma galibi muna aiki da Java. Amma abin da zan gaya muku a yau ba game da Java ba ne kawai. Kamar yadda aikin ya nuna, wannan kuma yana faruwa a cikin wasu harsuna.

PostgreSQL da JDBC sun matse duk ruwan 'ya'yan itace. Vladimir Sitnikov

Za mu yi magana:

  • game da samfurin data.
  • Game da adana bayanai.
  • Da kuma game da aiki.
  • Da kuma game da rake na karkashin ruwa da aka binne a wurin.

PostgreSQL da JDBC sun matse duk ruwan 'ya'yan itace. Vladimir Sitnikov

Bari mu fara da tambaya mai sauƙi. Muna zaɓar layi ɗaya daga tebur bisa maɓalli na farko.

PostgreSQL da JDBC sun matse duk ruwan 'ya'yan itace. Vladimir Sitnikov

Rukunin bayanan yana kan runduna ɗaya. Kuma duk wannan noman yana ɗaukar mil 20 seconds.

PostgreSQL da JDBC sun matse duk ruwan 'ya'yan itace. Vladimir Sitnikov

Wadannan millise seconds 20 suna da yawa. Idan kuna da irin waɗannan buƙatun guda 100, to kuna ciyar da lokaci a kowane sakan na biyu don gungurawa ta waɗannan buƙatun, watau muna bata lokaci.

Ba ma son yin wannan kuma mu kalli abin da tushe ya ba mu don wannan. Rukunin bayanai yana ba mu zaɓuɓɓuka biyu don aiwatar da tambayoyi.

PostgreSQL da JDBC sun matse duk ruwan 'ya'yan itace. Vladimir Sitnikov

Zaɓin farko shine buƙatu mai sauƙi. Menene kyau game da shi? Gaskiyar cewa mun dauka mu aika, kuma ba komai.

PostgreSQL da JDBC sun matse duk ruwan 'ya'yan itace. Vladimir Sitnikov

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

Har ila yau, ma'ajin bayanai yana da ci-gaban tambaya, wanda ya fi wayo, amma ya fi aiki. Kuna iya aika buƙatun daban don tantancewa, aiwatarwa, ɗauri mai canzawa, da sauransu.

Super Extended tambaya wani abu ne da ba za mu rufe a cikin rahoton na yanzu. Mu, watakila, muna son wani abu daga bayanan bayanai kuma akwai jerin buƙatun da aka kafa ta wani nau'i, watau wannan shine abin da muke so, amma ba zai yiwu ba a yanzu da kuma shekara mai zuwa. Don haka kawai muka rubuta shi kuma za mu zagaya muna girgiza manyan mutane.

PostgreSQL da JDBC sun matse duk ruwan 'ya'yan itace. Vladimir Sitnikov

Kuma abin da za mu iya yi shi ne tambaya mai sauƙi da kuma tsawo tambaya.

Menene na musamman game da kowace hanya?

Tambaya mai sauƙi tana da kyau don aiwatarwa na lokaci ɗaya. Da zarar an yi kuma an manta. Kuma matsalar ita ce ba ta goyan bayan tsarin bayanan binary, watau bai dace da wasu manyan ayyuka ba.

PostgreSQL da JDBC sun matse duk ruwan 'ya'yan itace. Vladimir Sitnikov

Tambaya mai tsawo - yana ba ku damar ɓata lokaci akan tantancewa. Wannan shi ne abin da muka yi kuma muka fara amfani da shi. Wannan da gaske, ya taimake mu. Akwai ba kawai tanadi a kan parsing. Akwai tanadi akan canja wurin bayanai. Canja wurin bayanai a cikin tsarin binary yana da inganci sosai.

PostgreSQL da JDBC sun matse duk ruwan 'ya'yan itace. Vladimir Sitnikov

Bari mu ci gaba don yin aiki. Wannan shine yadda aikace-aikace na yau da kullun yayi kama. Yana iya zama Java, da dai sauransu.

Mun halicci sanarwa. An aiwatar da umarnin. Ƙirƙiri kusa. Ina kuskure a nan? Menene matsalar? Ba matsala. Wannan shi ne abin da ya ce a cikin dukan littattafai. Ga yadda ya kamata a rubuta. Idan kana son iyakar aiki, rubuta kamar wannan.

PostgreSQL da JDBC sun matse duk ruwan 'ya'yan itace. Vladimir Sitnikov

Amma aikin ya nuna cewa wannan ba ya aiki. Me yasa? Domin muna da hanyar "kusa". Kuma idan muka yi haka, daga mahangar bayanai ya nuna kamar mai shan taba yana aiki tare da bayanai. Muka ce "PARSE EXECUTE DEALLOCATE".

Me yasa duk wannan ƙarin ƙirƙira da sauke maganganun? Babu wanda yake bukatar su. Amma abin da yawanci ke faruwa a cikin PreparedStatements shine idan muka rufe su, suna rufe komai akan bayanan. Wannan ba shine abin da muke so ba.

PostgreSQL da JDBC sun matse duk ruwan 'ya'yan itace. Vladimir Sitnikov

Muna so, kamar mutane masu lafiya, suyi aiki tare da tushe. Mun dauka muka shirya bayaninmu sau daya, sannan muka aiwatar da shi sau da yawa. A zahiri, sau da yawa - wannan shine sau ɗaya a cikin rayuwar aikace-aikacen gabaɗaya - an rarraba su. Kuma muna amfani da id na sanarwa iri ɗaya akan REST daban-daban. Wannan shine burin mu.

PostgreSQL da JDBC sun matse duk ruwan 'ya'yan itace. Vladimir Sitnikov

Ta yaya za mu cimma wannan?

PostgreSQL da JDBC sun matse duk ruwan 'ya'yan itace. Vladimir Sitnikov

Abu ne mai sauqi qwarai - babu buƙatar rufe maganganu. Muna rubuta shi kamar haka: "shirya" "execute".

PostgreSQL da JDBC sun matse duk ruwan 'ya'yan itace. Vladimir Sitnikov

PostgreSQL da JDBC sun matse duk ruwan 'ya'yan itace. Vladimir Sitnikov

Idan muka kaddamar da wani abu kamar wannan, to a bayyane yake cewa wani abu zai mamaye wani wuri. Idan ba a bayyana ba, za ku iya gwada shi. Bari mu rubuta ma'auni mai amfani da wannan hanya mai sauƙi. Ƙirƙiri sanarwa. Mun kaddamar da shi a kan wani nau'i na direba kuma mun gano cewa ya yi sauri da sauri tare da asarar duk ƙwaƙwalwar ajiyar da yake da shi.

A bayyane yake cewa ana samun sauƙin gyara irin waɗannan kurakurai. Ba zan yi magana a kansu ba. Amma zan ce sabuwar sigar tana aiki da sauri. Hanyar ita ce wauta, amma har yanzu.

PostgreSQL da JDBC sun matse duk ruwan 'ya'yan itace. Vladimir Sitnikov

Yadda za a yi aiki daidai? Me muke bukata mu yi don wannan?

A zahiri, aikace-aikace koyaushe suna rufe kalamai. A cikin duk littattafan sun ce a rufe shi, in ba haka ba ƙwaƙwalwar ajiya za ta zube.

Kuma PostgreSQL bai san yadda ake cache tambayoyin ba. Wajibi ne kowane zama ya ƙirƙiri wannan cache don kansa.

Kuma ba ma so mu ɓata lokaci a kan tantancewa.

PostgreSQL da JDBC sun matse duk ruwan 'ya'yan itace. Vladimir Sitnikov

Kuma kamar yadda muka saba muna da zabi biyu.

Zaɓin farko shine mu ɗauka kuma mu ce bari mu kunsa komai a cikin PgSQL. Akwai cache a can. Yana adana komai. Zai zama mai girma. Mun ga wannan. Muna da buƙatun 100500. Ba ya aiki. Ba mu yarda da juya buƙatun zuwa matakai da hannu ba. A'a a'a.

Muna da zaɓi na biyu - ɗauka mu yanke kanmu. Muna buɗe tushen kuma fara yanke. Mun gani mun gani. Sai ya zama cewa ba shi da wahala a yi.

PostgreSQL da JDBC sun matse duk ruwan 'ya'yan itace. Vladimir Sitnikov

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

Wannan ya bayyana a watan Agusta 2015. Yanzu akwai mafi zamani version. Kuma komai yana da kyau. Yana aiki da kyau cewa ba mu canza komai a cikin aikace-aikacen ba. Kuma mun ma daina tunani a cikin hanyar PgSQL, watau wannan ya ishe mu mu rage duk farashin kan kari zuwa kusan sifili.

Don haka, ana kunna maganganun da aka tanadar da uwar garken akan kisa na 5 don gujewa ɓata ƙwaƙwalwar ajiya a cikin bayanan akan kowane buƙatun lokaci ɗaya.

PostgreSQL da JDBC sun matse duk ruwan 'ya'yan itace. Vladimir Sitnikov

Kuna iya tambaya - ina lambobin suke? Me kuke samu? Kuma a nan ba zan ba da lambobi ba, saboda kowace bukata tana da nata.

Tambayoyin mu sun kasance kamar yadda muka kashe kusan mil 20 na daƙiƙa don tantance tambayoyin OLTP. Akwai 0,5 millise seconds don kisa, 20 millise seconds don tantancewa. Buƙatar - 10 KiB na rubutu, layin tsari 170. Wannan buƙatar OLTP ce. Yana buƙatar layukan 1, 5, 10, wani lokacin ƙari.

Amma ba mu so mu bata miliyon 20 kwata-kwata. Mun rage shi zuwa 0. Komai yana da kyau.

Me za ku iya ɗauka daga nan? Idan kuna da Java, to, ku ɗauki nau'in direba na zamani ku yi murna.

Idan kuna magana da yare daban, to kuyi tunani - watakila kuna buƙatar wannan kuma? Domin daga mahangar harshe na ƙarshe, misali, idan PL 8 ko kuna da LibPQ, to ba a bayyane yake a gare ku ba cewa kuna kashe lokaci ba don aiwatarwa ba, a kan rarrabawa, kuma wannan yana da kyau a duba. yaya? Komai kyauta ne.

PostgreSQL da JDBC sun matse duk ruwan 'ya'yan itace. Vladimir Sitnikov

Sai dai akwai kurakurai da wasu fitattun abubuwa. Kuma za mu yi magana game da su a yanzu. Yawancin zai kasance game da ilimin kimiyyar kayan tarihi na masana'antu, game da abin da muka samo, abin da muka samu.

PostgreSQL da JDBC sun matse duk ruwan 'ya'yan itace. Vladimir Sitnikov

Idan an samar da buƙatar a hankali. Yana faruwa. Wani ya haɗa igiyoyin tare, yana haifar da tambayar SQL.

Me ya sa ba shi da kyau? Yana da muni domin duk lokacin da muka ƙare da wani kirtani dabam.

Kuma hashCode na wannan nau'in kirtani na daban yana buƙatar sake karantawa. Wannan hakika aikin CPU ne - gano dogon buƙatun rubutu a cikin hash ɗin da ke akwai ba shi da sauƙi. Saboda haka, ƙarshe yana da sauƙi - kada ku samar da buƙatun. Ajiye su a wuri ɗaya. Kuma ku yi murna.

PostgreSQL da JDBC sun matse duk ruwan 'ya'yan itace. Vladimir Sitnikov

Matsala ta gaba. Nau'in bayanai suna da mahimmanci. Akwai ORMs da ke cewa ba kome ba irin NULL akwai, bari a sami wani iri. Idan Int, to sai mu ce setInt. Idan kuma NULL, to bari koyaushe ya zama VARCHAR. Kuma menene bambanci a ƙarshe menene NULL yake akwai? Database kanta zata fahimci komai. Kuma wannan hoton baya aiki.

A aikace, rumbun adana bayanai bai damu da komai ba. Idan a karo na farko ka ce wannan lamba ce, kuma a karo na biyu ka ce VARCHAR ne, to ba zai yiwu a sake amfani da bayanan da aka shirya ba. Kuma a wannan yanayin, dole ne mu sake ƙirƙirar bayaninmu.

PostgreSQL da JDBC sun matse duk ruwan 'ya'yan itace. Vladimir Sitnikov

Idan kuna aiwatar da tambaya iri ɗaya, tabbatar da cewa nau'ikan bayanan da ke cikin ginshiƙi ba su ruɗe ba. Kuna buƙatar lura don NULL. Wannan babban kuskure ne da muka samu bayan mun fara amfani da PreparedStatements

PostgreSQL da JDBC sun matse duk ruwan 'ya'yan itace. Vladimir Sitnikov

To, an kunna. Watakila sun dauki direban. Kuma yawan aiki ya ragu. Abubuwa sun yi muni.

Ta yaya hakan ke faruwa? Shin wannan bug ne ko fasali? Abin takaici, ba a iya fahimtar ko wannan kwaro ne ko fasali. Amma akwai yanayi mai sauƙi don sake haifar da wannan matsala. Ba zato ba tsammani ta yi mana kwanton bauna. Kuma ya ƙunshi samfurin a zahiri daga tebur ɗaya. Mu, ba shakka, muna da ƙarin irin waɗannan buƙatun. A matsayinka na mai mulki, sun haɗa da tebur biyu ko uku, amma akwai irin wannan yanayin sake kunnawa. Ɗauki kowane sigar daga bayananku kuma kunna shi.

PostgreSQL da JDBC sun matse duk ruwan 'ya'yan itace. Vladimir Sitnikov

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

Maganar ita ce, muna da ginshiƙai guda biyu, kowannensu yana da fihirisa. Akwai layuka miliyan a cikin ginshiƙi NULL ɗaya. Kuma shafi na biyu ya ƙunshi layi 20 kawai. Lokacin da muka aiwatar ba tare da ɗaure masu canji ba, komai yana aiki da kyau.

Idan muka fara aiwatarwa tare da masu canji masu ɗaure, watau muna aiwatar da "?" ko "$1" don buƙatarmu, menene zamu samu?

PostgreSQL da JDBC sun matse duk ruwan 'ya'yan itace. Vladimir Sitnikov

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

Kisa na farko kamar yadda ake tsammani. Na biyu yana da ɗan sauri. An adana wani abu. Na uku, hudu, na biyar. Sannan bang - da wani abu makamancin haka. Kuma mafi munin abin da ya faru shi ne cewa wannan yana faruwa a kan kisa na shida. Wanene ya san cewa ya zama dole a aiwatar da hukuncin kisa guda shida don fahimtar menene ainihin shirin kisa?

PostgreSQL da JDBC sun matse duk ruwan 'ya'yan itace. Vladimir Sitnikov

Wanene mai laifi? Me ya faru? Database ya ƙunshi ingantawa. Kuma yana da alama an inganta shi don shari'ar gama-gari. Kuma, bisa ga haka, farawa daga wani lokaci, ta canza zuwa wani tsari mai mahimmanci, wanda, rashin alheri, na iya zama daban. Yana iya zama iri ɗaya, ko kuma ya bambanta. Kuma akwai wani nau'i na darajar kofa wanda ke kaiwa ga wannan hali.

Me za ku iya yi game da shi? A nan, ba shakka, yana da wuya a ɗauka wani abu. Akwai mafita mai sauƙi da muke amfani da ita. Wannan shine +0, OFFSET 0. Tabbas kun san irin waɗannan mafita. Muna ɗaukar shi kawai kuma ƙara "+0" ga buƙatar kuma komai yana da kyau. Zan nuna maka anjima.

Kuma akwai wani zaɓi - duba tsare-tsaren a hankali. Dole ne mai haɓakawa ba kawai ya rubuta buƙatun ba, amma kuma ya ce “bayani nazari” sau 6. Idan 5 ne, ba zai yi aiki ba.

Kuma akwai zaɓi na uku - rubuta wasiƙa zuwa pgsql-hackers. Na rubuta, duk da haka, har yanzu ba a bayyana ba ko wannan kwaro ne ko fasali.

PostgreSQL da JDBC sun matse duk ruwan 'ya'yan itace. Vladimir Sitnikov

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

Yayin da muke tunanin ko wannan kwaro ne ko fasali, bari mu gyara shi. Bari mu ɗauki buƙatar mu mu ƙara "+0". Komai yana lafiya. Alamomi biyu kuma ba kwa buƙatar yin tunanin yadda yake ko menene. Mai sauqi qwarai. Mun kawai hana ma'ajin bayanai daga yin amfani da fihirisar kan wannan shafi. Ba mu da ma'auni a kan "+0" shafi kuma shi ke nan, bayanan ba ya amfani da ma'anar, duk abin da yake lafiya.

PostgreSQL da JDBC sun matse duk ruwan 'ya'yan itace. Vladimir Sitnikov

Wannan shine ka'idar 6 bayyana. Yanzu a cikin nau'ikan na yanzu dole ku yi shi sau 6 idan kuna da ɗaure masu canji. Idan ba ku da masu canji masu ɗaure, wannan shine abin da muke yi. Kuma a ƙarshe dai wannan buƙatar ce ta gaza. Ba abu ne mai wahala ba.

Zai yi kama, nawa zai yiwu? Kwaro a nan, kwaro a can. A gaskiya, kwaro yana ko'ina.

PostgreSQL da JDBC sun matse duk ruwan 'ya'yan itace. Vladimir Sitnikov

Mu duba a tsanake. Misali, muna da tsari guda biyu. Tsarin A tare da tebur S da zane B tare da tebur S. Tambaya – zaɓi bayanai daga tebur. Me za mu samu a wannan yanayin? Za mu sami kuskure. Za mu sami duk abubuwan da ke sama. Ka'idar ita ce - kwaro yana ko'ina, za mu sami duk abubuwan da ke sama.

PostgreSQL da JDBC sun matse duk ruwan 'ya'yan itace. Vladimir Sitnikov

Yanzu tambayar ita ce: "Me ya sa?" Da alama akwai takaddun cewa idan muna da tsari, to akwai madaidaicin "hanyar bincike" wanda ke nuna mana inda zamu nemi tebur. Zai yi kama da akwai canji.

Menene matsalar? Matsalar ita ce bayanan da aka shirya uwar garken ba sa zargin cewa wani zai iya canza hanyar bincike. Wannan ƙimar ta kasance, kamar yadda take, akai-akai don bayanan bayanai. Kuma wasu sassa na ƙila ba za su ɗauki sabbin ma'anoni ba.

PostgreSQL da JDBC sun matse duk ruwan 'ya'yan itace. Vladimir Sitnikov

Tabbas, wannan ya dogara da sigar da kuke gwadawa akai. Ya dogara da yadda babban teburin ku ya bambanta. Kuma sigar 9.1 kawai za ta aiwatar da tsoffin tambayoyin. Sabbin nau'ikan na iya kama kwaro kuma su gaya muku cewa kuna da kwaro.

PostgreSQL da JDBC sun matse duk ruwan 'ya'yan itace. Vladimir Sitnikov

Saita hanyar search_path + bayanan da aka shirya na uwar garken =
Dole ne tsarin da aka adana ya canza nau'in sakamako

Yadda za a bi da shi? Akwai girke-girke mai sauƙi - kar a yi shi. Babu buƙatar canza hanyar bincike yayin da aikace-aikacen ke gudana. Idan kun canza, zai fi kyau ƙirƙirar sabuwar haɗi.

Kuna iya tattaunawa, watau budewa, tattauna, ƙara. Wataƙila za mu iya shawo kan masu haɓaka bayanan cewa lokacin da wani ya canza ƙima, ya kamata ma'aunin bayanan ya gaya wa abokin ciniki game da wannan: “Duba, an sabunta ƙimar ku anan. Wataƙila kuna buƙatar sake saita maganganun kuma ku sake ƙirƙira su? ” Yanzu bayanan bayanan suna aiki a asirce kuma baya bayar da rahoto ta kowace hanya cewa maganganun sun canza wani wuri a ciki.

Kuma zan sake jaddadawa - wannan wani abu ne da ba na Java ba. Za mu ga abu iri ɗaya a cikin PL/pgSQL ɗaya zuwa ɗaya. Amma za a sake yin ta a can.

PostgreSQL da JDBC sun matse duk ruwan 'ya'yan itace. Vladimir Sitnikov

Bari mu gwada wasu ƙarin zaɓin bayanai. Mun zaba kuma mu zaba. Muna da tebur mai layuka miliyan. Kowane layi kilobyte ne. Kimanin gigabyte na bayanai. Kuma muna da ƙwaƙwalwar aiki a cikin injin Java na megabyte 128.

Mu, kamar yadda aka ba da shawarar a duk littattafai, muna amfani da sarrafa rafi. Wato, muna buɗe resultSet kuma mu karanta bayanan daga can kaɗan da kaɗan. Zai yi aiki? Shin zai fadi daga ƙwaƙwalwar ajiya? Za ku karanta kadan? Bari mu dogara ga bayanan bayanai, bari mu dogara da Postgres. Ba mu yarda ba. Za mu fadi OutOFMemory? Wanene ya fuskanci OutOfMemory? Wanene ya iya gyara shi bayan haka? Wani yayi nasarar gyara shi.

Idan kuna da layuka miliyan, ba za ku iya zaɓar ku zaɓi kawai ba. Ana buƙatar OFFSET/LIMIT. Wanene don wannan zaɓi? Kuma wanene ke goyon bayan yin wasa da autoCommit?

Anan, kamar yadda aka saba, zaɓin da ba a zata ba ya zama daidai. Kuma idan kun kashe autoCommit ba zato ba tsammani, zai taimaka. Me yasa haka? Kimiyya bai san wannan ba.

PostgreSQL da JDBC sun matse duk ruwan 'ya'yan itace. Vladimir Sitnikov

Amma ta hanyar tsoho, duk abokan ciniki da ke haɗawa zuwa bayanan Postgres suna debo dukkan bayanan. PgJDBC ba togiya bane a wannan batun; yana zaɓar duk layuka.

Akwai bambanci akan jigon FetchSize, watau zaku iya faɗi a matakin bayanin daban cewa anan, don Allah zaɓi bayanai ta 10, 50. Amma wannan baya aiki har sai kun kashe autoCommit. Kashe autoCommit - yana fara aiki.

Amma shiga cikin lambar da saita saitinFetchSize a ko'ina ba shi da daɗi. Saboda haka, mun yi saitin da zai faɗi ƙimar da aka saba don duk haɗin.

PostgreSQL da JDBC sun matse duk ruwan 'ya'yan itace. Vladimir Sitnikov

Abin da muka ce kenan. An saita siga. Kuma me muka samu? Idan muka zaɓi ƙananan kuɗi, idan, alal misali, mun zaɓi layuka 10 a lokaci ɗaya, to muna da babban farashi mai girma. Don haka, yakamata a saita wannan ƙimar zuwa kusan ɗari.

PostgreSQL da JDBC sun matse duk ruwan 'ya'yan itace. Vladimir Sitnikov

Da kyau, ba shakka, har yanzu kuna koyon yadda ake iyakance shi a cikin bytes, amma girke-girke shine wannan: saita defaultRowFetchSize zuwa fiye da ɗari kuma kuyi farin ciki.

PostgreSQL da JDBC sun matse duk ruwan 'ya'yan itace. Vladimir Sitnikov

Mu ci gaba zuwa saka bayanai. Shigar ya fi sauƙi, akwai zaɓuɓɓuka daban-daban. Misali, INSERT, VALUES. Wannan zaɓi ne mai kyau. Kuna iya cewa "SAKA ZABI". A aikace abu daya ne. Babu bambanci a cikin aiki.

Littattafai sun ce kuna buƙatar aiwatar da bayanin Batch, littattafai sun ce za ku iya aiwatar da ƙarin hadaddun umarni tare da bacin rai da yawa. Kuma Postgres yana da fasalin ban mamaki - kuna iya yin COPY, watau yin shi da sauri.

PostgreSQL da JDBC sun matse duk ruwan 'ya'yan itace. Vladimir Sitnikov

Idan kun auna shi, zaku iya sake yin wasu bincike masu ban sha'awa. Ta yaya muke son wannan ya yi aiki? Ba mu so mu rarraba kuma kada mu aiwatar da umarnin da ba dole ba.

PostgreSQL da JDBC sun matse duk ruwan 'ya'yan itace. Vladimir Sitnikov

A aikace, TCP ba ya ƙyale mu mu yi wannan. Idan abokin ciniki ya shagaltu da aika buƙatu, to, ma'aunin bayanai ba ya karanta buƙatun a ƙoƙarin aiko mana da martani. Sakamakon ƙarshe shine cewa abokin ciniki yana jiran ma'aunin bayanai don karanta buƙatar, kuma bayanan yana jiran abokin ciniki ya karanta amsa.

PostgreSQL da JDBC sun matse duk ruwan 'ya'yan itace. Vladimir Sitnikov

Don haka ana tilasta wa abokin ciniki aika fakitin aiki tare lokaci-lokaci. Ƙarin hulɗar hanyar sadarwa, ƙarin ɓata lokaci.

PostgreSQL da JDBC sun matse duk ruwan 'ya'yan itace. Vladimir SitnikovKuma idan muka ƙara su, yana ƙara muni. Direba yana da rashin bege kuma yana ƙara su sau da yawa, kusan sau ɗaya kowane layi 200, ya danganta da girman layin, da sauransu.

PostgreSQL da JDBC sun matse duk ruwan 'ya'yan itace. Vladimir Sitnikov

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

Yana faruwa cewa kun gyara layi ɗaya kawai kuma komai zai yi sauri sau 10. Yana faruwa. Me yasa? Kamar yadda aka saba, an riga an yi amfani da irin wannan akai-akai a wani wuri. Kuma darajar "128" tana nufin kada a yi amfani da batching.

PostgreSQL da JDBC sun matse duk ruwan 'ya'yan itace. Vladimir Sitnikov

Java microbenchmark kayan aiki

Yana da kyau cewa ba a haɗa wannan a cikin sigar hukuma ba. An gano kafin a fara sakin. Duk ma'anar da na bayar sun dogara ne akan nau'ikan zamani.

PostgreSQL da JDBC sun matse duk ruwan 'ya'yan itace. Vladimir Sitnikov

Mu gwada shi. Muna auna InsertBatch mai sauƙi. Muna auna InsertBatch sau da yawa, watau abu ɗaya, amma akwai ƙima masu yawa. M motsi. Ba kowa ba ne zai iya yin wannan, amma wannan motsi ne mai sauƙi, mafi sauƙi fiye da COPY.

PostgreSQL da JDBC sun matse duk ruwan 'ya'yan itace. Vladimir Sitnikov

Kuna iya yin COPY.

PostgreSQL da JDBC sun matse duk ruwan 'ya'yan itace. Vladimir Sitnikov

Kuma zaka iya yin wannan akan tsarin. Bayyana nau'in tsoho na mai amfani, wuce tsararru kuma shigar da kai tsaye zuwa tebur.

Idan ka buɗe hanyar haɗin: pgjdbc/ubenchmsrk/InsertBatch.java, to wannan lambar tana kan GitHub. Kuna iya ganin takamaiman buƙatun da aka samar a wurin. Ba komai.

PostgreSQL da JDBC sun matse duk ruwan 'ya'yan itace. Vladimir Sitnikov

Mun kaddamar. Kuma abu na farko da muka gane shi ne cewa rashin amfani da tsari ba zai yiwu ba. Duk zaɓuɓɓukan batching ba su da sifili, watau lokacin aiwatarwa kusan sifili ne idan aka kwatanta da kisa na lokaci ɗaya.

PostgreSQL da JDBC sun matse duk ruwan 'ya'yan itace. Vladimir Sitnikov

Muna saka bayanai. Teburi ne mai sauqi qwarai. Rukunoni uku. Kuma me muke gani a nan? Mun ga cewa duka waɗannan zaɓuɓɓuka guda uku sun yi kama da juna. Kuma COPY, ba shakka, ya fi kyau.

PostgreSQL da JDBC sun matse duk ruwan 'ya'yan itace. Vladimir Sitnikov

Wannan shine lokacin da muka saka guda. Lokacin da muka ce ƙimar DABI'u ɗaya, ƙimar DABI'u biyu, ƙimar DABI'u uku, ko kuma mun nuna 10 daga cikinsu an raba su da waƙafi. Wannan a kwance yanzu. 1, 2, 4, 128. Ana iya ganin cewa Batch Insert, wanda aka zana da shuɗi, ya sa ya ji daɗi sosai. Wato idan ka saka daya bayan daya ko ma idan ka saka hudu a lokaci daya, sai ya ninka sau biyu, don kawai mun cushe kadan a cikin VALUES. Ƙananan ayyukan EXECUTE.

Yin amfani da COPY akan ƙananan kundila ba shi da tabbas sosai. Ban ma zana a kan biyun farko ba. Suna zuwa sama, wato waɗannan korayen lambobin don COPY.

Ya kamata a yi amfani da COPY lokacin da kuke da aƙalla layuka ɗari na bayanai. Babban abin buɗe wannan haɗin yana da girma. Kuma, a gaskiya, ban haƙa ta wannan hanya ba. Na inganta Batch, amma ban COPY ba.

Me za mu yi a gaba? Mun gwada shi. Mun fahimci cewa muna buƙatar yin amfani da ko dai sifofi ko kuma baho mai wayo wanda ya haɗa ma'anoni da yawa.

PostgreSQL da JDBC sun matse duk ruwan 'ya'yan itace. Vladimir Sitnikov

Me ya kamata ku dauka daga rahoton na yau?

  • PredStatement shine komai namu. Wannan yana ba da yawa don yawan aiki. Yana haifar da babban flop a cikin maganin shafawa.
  • Kuma kuna buƙatar yin BAYYANA ANALYZE sau 6.
  • Kuma muna buƙatar tsarma OFFSET 0, da dabaru kamar +0 don gyara ragowar kaso na tambayoyinmu masu matsala.

source: www.habr.com

Add a comment