Ini ndinokurudzira kuti uverenge zvinyorwa zveVladimir Sitnikov wekutanga 2016 mushumo "PostgreSQL neJDBC vari kusvina muto wese"
Masikati akanaka Ini ndinonzi Vladimir Sitnikov. Ndanga ndichishandira NetCracker kwemakore gumi. Uye ini ndiri kunyanya mukubudirira. Zvese zvine chekuita neJava, zvese zvine chekuita neSQL ndizvo zvandinoda.
Uye nhasi ndichataura pamusoro pezvatakasangana nazvo mukambani patakatanga kushandisa PostgreSQL sevhavha yedatabase. Uye isu tinonyanya kushanda neJava. Asi zvandichakuudza nhasi hazvisi zveJava chete. Sezvinoratidzwa nemaitiro, izvi zvinoitikawo mune mimwe mitauro.
Tichataura:
- nezve data sampling.
- Nezve kuchengetedza data.
- Uye zvakare nezve performance.
- Uye pamusoro pemvura yemvura inovigwa ipapo.
Ngatitange nemubvunzo uri nyore. Isu tinosarudza mutsara mumwe kubva patafura zvichienderana nekiyi yekutanga.
Iyo dhatabhesi iri pane imwechete iyo host. Uye kurima kwese uku kunotora 20 milliseconds.
Aya 20 milliseconds akawanda. Kana uine 100 zvikumbiro zvakadaro, saka unopedza nguva pasekondi imwe uchipuruzira zvikumbiro izvi, i.e. tiri kutambisa nguva.
Isu hatidi kuita izvi uye tarisa izvo hwaro hunotipa kune izvi. Iyo dhatabhesi inotipa mbiri sarudzo dzekuita mibvunzo.
Chisarudzo chekutanga chikumbiro chiri nyore. Chii chakanaka pamusoro pazvo? Iyo nyaya yekuti tinoitora totumira, uye hapana zvimwe.
Iyo dhatabhesi zvakare ine mubvunzo wepamberi, unova unonyengerera, asi unoshanda zvakanyanya. Iwe unogona zvakasiyana kutumira chikumbiro chekuparadzanisa, kuuraya, kusiyanisa kusunga, nezvimwe.
Mubvunzo wakawedzerwa chinhu chatisingazovhara mumushumo wazvino. Isu, zvichida, tinoda chimwe chinhu kubva kune database uye pane chido chekuda chakaumbwa mune imwe nzira, i.e. izvi ndizvo zvatinoda, asi hazvibviri ikozvino uye mugore rinotevera. Saka isu takangozvirekodha uye tichatenderera tichizunza vanhu vakuru.
Uye zvatingaite ndezvemubvunzo wakapfava uye wakawedzerwa mubvunzo.
Chii chakakosha pane imwe neimwe nzira?
Mubvunzo wakapfava wakanakira kuurayiwa kamwe chete. Kana zvaitwa ndokukanganwa. Uye dambudziko nderekuti haritsigire mabhinari data format, i.e. haina kukodzera kune mamwe maitiro epamusoro-maitiro.
Yakawedzerwa mubvunzo - inokutendera iwe kuchengetedza nguva pakurongedza. Izvi ndizvo zvatakaita ndokutanga kushandisa. Izvi zvakatibatsira chaizvo. Hapana chete mari inochengetwa pakuenzanisa. Pane mari inochengetwa pakuendesa data. Kuendesa data mubhinari format kunonyanya kushanda.
Ngatienderere mberi tichidzidzira. Izvi ndizvo zvinoita akajairika application. Inogona kunge iri Java, nezvimwe.
Isu takagadzira chirevo. Akaita murairo. Yakagadzirwa pedyo. Kukanganisa kupi apa? Dambudziko nderei? Hapana dambudziko. Izvi ndizvo zvarinotaura mumabhuku ose. Aya ndiwo manyorerwo azvinofanira kunyorwa. Kana iwe uchida kuita kwakanyanya, nyora seizvi.
Asi maitiro aratidza kuti izvi hazvishande. Sei? Nekuti isu tine "yepedyo" nzira. Uye kana tikaita izvi, kubva pane dhesi yekuona zvinobuda kuti zvakafanana nefodya inoshanda ne database. Takati "PARSE EXECUTE DEALLOCATE".
Sei zvese izvi zvekuwedzera kusikwa uye kurodha zvinyorwa? Hapana anodzida. Asi zvinowanzoitika muPreparedStatements ndezvekuti kana tikavhara, vanovhara zvese zviri padhatabhesi. Izvi hazvisi izvo zvatinoda.
Tinoda, sevanhu vane hutano, kushanda nehwaro. Takatora ndokugadzira chirevo chedu kamwe chete, tobva tazviita kakawanda. Muchokwadi, kazhinji - ichi kamwe muhupenyu hwese hwekushandisa - ivo vakapatsanurwa. Uye isu tinoshandisa iyo imwechete chirevo id pane akasiyana maREST. Ichi ndicho chinangwa chedu.
Tingaita sei izvi?
Zviri nyore - hapana chikonzero chekuvhara zvirevo. Tinonyora seizvi: "gadzirira" "kuita".
Kana tikatanga chimwe chinhu chakadai, zvino zviri pachena kuti chimwe chinhu chichafashukira pane imwe nzvimbo. Kana zvisina kujeka, unogona kuzviedza. Ngatinyorei bhenji rinoshandisa nzira iri nyore iyi. Gadzira chirevo. Isu tinoivhura pane imwe vhezheni yemutyairi uye tinoona kuti inorovera nekukurumidza nekurasikirwa kwese ndangariro yayaive nayo.
Zviri pachena kuti zvikanganiso zvakadaro zvinogadziriswa nyore nyore. Ini handisi kuzotaura nezvavo. Asi ini ndichataura kuti shanduro itsva inoshanda nekukurumidza zvikuru. Iyo nzira yakapusa, asi zvakadaro.
Nzira yekushanda zvakanaka? Chii chatinofanira kuita nokuda kweizvi?
Muchokwadi, zvikumbiro zvinogara zvichivhara zvirevo. Mumabhuku ose vanoti vhara, zvikasadaro ndangariro inodeuka.
Uye PostgreSQL haizive maitiro ekuita cache mibvunzo. Izvo zvinodikanwa kuti chikamu chega chega chigadzire iyi cache pachayo.
Uye isu hatidi kutambisa nguva pakuenzanisa zvakare.
Uye senguva dzose tine sarudzo mbiri.
Sarudzo yekutanga ndeyekuti tinoitora totaura kuti ngatiputire zvese muPgSQL. Pane cache ipapo. Inobata zvese. Zvichabuda zvakanaka. Takazviona izvi. Tine 100500 zvikumbiro. Hazvishande. Hatibvumi kushandura zvikumbiro kuita maitiro pamaoko. Kwete kwete.
Tine sarudzo yechipiri - tora uye ticheke isu pachedu. Tinozarura zvinyorwa uye tinotanga kucheka. Takaona uye takaona. Zvakazoitika kuti hazvina kuoma kudaro.
Izvi zvakaonekwa muna Nyamavhuvhu 2015. Iye zvino kune imwe shanduro yemazuva ano. Uye zvose zvakanaka. Inoshanda nemazvo zvekuti hapana chatinoshandura mukushandisa. Uye isu takatombomira kufunga takananga kuPgSQL, kureva kuti izvi zvaive zvakatikwanira kuti tideredze mutengo wepamusoro kusvika pazero.
Saizvozvo, Server-yakagadzirirwa zvirevo zvinobatiswa pane yechishanu kuuraya kuitira kudzivirira kutambisa ndangariro mudhatabhesi pane yega yega-nguva chikumbiro.
Unogona kubvunza - nhamba dzacho dziripi? Uri kuwana chii? Uye pano handisi kuzopa nhamba, nokuti chikumbiro chimwe nechimwe chine chayo.
Mibvunzo yedu yaive yekuti takashandisa angangoita 20 milliseconds pakushambadzira pamibvunzo yeOLTP. Paive ne 0,5 milliseconds yekuurayiwa, 20 milliseconds yekuparura. Chikumbiro - 10 KB yezvinyorwa, 170 mitsara yehurongwa. Ichi chikumbiro cheOLTP. Inokumbira 1, 5, 10 mitsetse, dzimwe nguva yakawanda.
Asi isu hatina kuda kutambisa 20 milliseconds zvachose. Takadzikisa kusvika ku0. Zvese zvakanaka.
Chii chaungatora kubva pano? Kana iwe uine Java, saka iwe unotora yemazuva ano vhezheni yemutyairi uye ufare.
Kana iwe uchitaura mutauro wakasiyana, saka funga - pamwe iwe unoda izvi zvakare? Nekuti kubva pamaonero emutauro wekupedzisira, semuenzaniso, kana PL 8 kana uine LibPQ, saka hazvisi pachena kwauri kuti uri kushandisa nguva kwete pakuurayiwa, pakupatsanura, uye izvi zvakakodzera kutarisa. Sei? Zvese ndezvemahara.
Kunze kwekuti pane zvikanganiso uye zvimwe zvakasiyana. Uye isu tichataura nezvavo izvozvi. Zvizhinji zvichange zviri zvemaindasitiri ekuchera matongo, nezve zvatakawana, izvo zvatakasangana nazvo.
Kana chikumbiro chakagadzirwa zvine simba. Zvinoitika. Mumwe munhu anonamira tambo pamwechete, zvichikonzera mubvunzo weSQL.
Nei akaipa? Zvakaipa nekuti pese patinopedzisira tave netambo yakasiyana.
Uye iyo hashCode yeiyi tambo yakasiyana inoda kuverengwa zvakare. Iri ibasa reCPU - kuwana chinyorwa chakareba chekukumbira mune kunyangwe hashi iripo hazvisi nyore. Naizvozvo, mhedziso iri nyore - usaite zvikumbiro. Zvichengetedze mune imwe shanduko. Uye ufare.
Dambudziko rinotevera. Mhando dze data dzakakosha. Kune maORM anoti hazvina basa kuti rudzii rweNULL iripo, ngapave neimwe mhando. Kana Int, tobva tati setInt. Uye kana NULL, saka ngazvigare zviri VARCHAR. Uye ndeupi mutsauko wazvinoita kumagumo kuti NULL iripo? Iyo database pachayo ichanzwisisa zvese. Uye mufananidzo uyu haushande.
Mukuita, database haina basa zvachose. Kana wakataura kekutanga kuti iyi inhamba, uye kechipiri wati iVARCHAR, saka hazvibviri kushandisa zvakare Server-yakagadzirirwa zvirevo. Uye mune iyi kesi, isu tinofanirwa kugadzira zvakare chirevo chedu.
Kana iwe uri kuita iwo mubvunzo mumwe chete, ita shuwa kuti mhando dzedata dziri mukoramu yako hadzina kuvhiringwa. Iwe unofanirwa kungwarira NULL. Uku kukanganisa kwakajairika kwatakaita mushure mekunge tatanga kushandisa PreparedStatements
Zvakanaka, batidza. Pamwe vakatora mutyairi. Uye kubudirira kwakadzikira. Zvinhu zvakashata.
Izvi zvinoitika sei? Ichi chipukanana here kana chimiro? Nehurombo, hazvina kukwanisa kunzwisisa kuti iyi ibug kana chimiro. Asi pane chiitiko chakareruka chekuburitsa dambudziko iri. Akativandira tisingatarisiri. Uye inosanganisira sampling chaiyo kubva kune imwe tafura. Isu, chokwadi, takanga tine zvikumbiro zvakawanda zvakadaro. Sezvo mutemo, vaisanganisira matafura maviri kana matatu, asi pane mamiriro ekutamba akadaro. Tora chero vhezheni kubva kune yako database uye itambe.
Icho chiripo ndechekuti isu tine makoramu maviri, imwe neimwe ine indexed. Kune miriyoni mitsara mune imwe NULL column. Uye chikamu chechipiri chine mitsara makumi maviri chete. Kana isu tichiita pasina akasungwa akasiyana, zvese zvinoshanda nemazvo.
Kana isu tikatanga kuita neakasungwa akasiyana, i.e. isu tinoita iyo "?" kana kuti β$1β pachikumbiro chedu, tinopedzisira tawana chii?
Kuurayiwa kwekutanga kwakangotarisirwa. Yechipiri inokurumidza zvishoma. Chimwe chinhu chakachengetwa. Chechitatu, chechina, chechishanu. Zvadaro bang - uye chimwe chinhu chakadaro. Uye chakaipisisa ndechekuti izvi zvinoitika pakuurayiwa kwechitanhatu. Ndiani aiziva kuti zvakanga zvakakodzera kuita kuuraya kutanhatu chaiko kuti tinzwisise kuti hurongwa hwekuuraya hwaiva hwei?
Ndiani ane mhosva? Chii chaitika? Iyo database ine optimization. Uye inoratidzika kunge yakagadziridzwa kune iyo generic kesi. Uye, maererano, kutanga pane imwe nguva, anochinjira kune generic chirongwa, icho, zvinosuruvarisa, chinogona kuve chakasiyana. Inogona kunge yakafanana, kana kuti yakasiyana. Uye kune imwe mhando yekukosha kwechikumbaridzo inotungamira kune iyi maitiro.
Chii chaungaita nezvazvo? Pano, hongu, zvakanyanya kuoma kutora chero chinhu. Pane mhinduro iri nyore yatinoshandisa. Iyi ndiyo +0, OFFSET 0. Chokwadi unoziva mhinduro dzakadaro. Isu tinongoitora towedzera "+0" kune chikumbiro uye zvese zvakanaka. Ndichakuratidzai gare gare.
Uye pane imwe sarudzo - tarisa zvirongwa zvakanyatsonaka. Mugadziri haafanire kungonyora chikumbiro, asi zvakare taura "tsanangura ongorora" ka6. Kana ari 5, hazvishande.
Uye pane yechitatu sarudzo - nyora tsamba kune pgsql-hackers. Ndakanyora, zvisinei, hazvisati zvanyatsojeka kuti iyi ibug here kana chimiro.
Tichiri kufunga kuti iyi ibug kana chimiro, ngatigadzirise. Ngatitorei chikumbiro chedu towedzera "+0". Zvese zvakanaka. Zviratidzo zviviri uye haufanire kufunga nezvekuti chii kana kuti chii. Very simple. Isu takangorambidza dhatabhesi kuti isashandise index pane iyi column. Isu hatina index pane "+0" column uye ndizvozvo, dhatabhesi haishandisi index, zvose zvakanaka.
Uyu ndiwo mutemo we6 tsanangura. Iye zvino mushanduro dzemazuva ano unofanirwa kuzviita katanhatu kana iwe wakasunga zvinoshanduka. Kana iwe usina akasungwa akasiyana, izvi ndizvo zvatinoita. Uye pakupedzisira ndicho chaizvo chikumbiro ichi chinokundikana. Haisi chinhu chinonyengera.
Zvinoita sekunge, yakawanda sei inogoneka? Chipembenene pano, tsikidzi apo. Chaizvoizvo, bug iri kwese kwese.
Ngatinyatsoongororai. Semuenzaniso, isu tine schemas maviri. Scheme A ine tafura S uye dhayagiramu B ine tafura S. Mubvunzo - sarudza data kubva patafura. Tichave nei pakadai? Tichava nekukanganisa. Tichava nezvose zviri pamusoro. Mutemo ndewekuti - bug iri kwese kwese, isu tichava nezvose zviri pamusoro.
Zvino mubvunzo ndewokuti: "Sei?" Zvinoita sekunge pane zvinyorwa zvekuti kana isu tiine schema, saka pane "search_path" shanduko inotiudza kwekutsvaga tafura. Zvingaita sekuti pane shanduko.
Dambudziko nderei? Dambudziko nderekuti zvirevo zvakagadzirirwa-sevha hazvifungidzire kuti search_path inogona kuchinjwa nemumwe munhu. Kukosha uku kunoramba kuripo, sekunge, kunogara kune dhatabhesi. Uye zvimwe zvikamu zvingasatora revo itsva.
Ehe, izvi zvinoenderana neshanduro yauri kuyedza pairi. Zvinoenderana nekuti matafura ako akasiyana zvakadii. Uye vhezheni 9.1 inongoita mibvunzo yekare. Shanduro itsva dzinogona kubata tsikidzi dzokuudza kuti une tsikidzi.
Nzira yekurapa nayo? Pane recipe iri nyore - usazviita. Iko hakuna chikonzero chekuchinja search_path apo application iri kushanda. Kana iwe ukachinja, zviri nani kugadzira chinongedzo chitsva.
Munogona kukurukura, kureva kuvhura, kukurukura, kuwedzera. Zvimwe tinogona kugonesa vanogadzira dhatabhesi kuti kana mumwe munhu achinja kukosha, dhatabhesi inofanira kuudza mutengi nezveizvi: βTarisa, kukosha kwako kwakagadziridzwa pano. Pamwe unofanirwa kuseta zvakare zvirevo uye wozvigadzira patsva?" Iye zvino dhatabhesi inozvibata pachivande uye haitauri neimwe nzira kuti zvirevo zvachinja pane imwe nzvimbo mukati.
Uye ini ndichasimbisa zvakare - ichi chimwe chinhu chisingawanzo kuJava. Tichaona chinhu chimwe chete muPL/pgSQL imwe kune imwe. Asi zvichaburitswa ipapo.
Ngatiedze imwe sarudzo yedata. Tinosarudza uye tinosarudza. Tine tafura ine miriyoni mitsara. Mutsara wega wega kilobyte. Inenge gigabyte yedata. Uye isu tine ndangariro inoshanda mumushini weJava we128 megabytes.
Isu, sezvakakurudzirwa mumabhuku ese, tinoshandisa stream processing. Ndokunge, isu tinovhura resultSet uye tiverenge data kubva ipapo zvishoma nezvishoma. Zvichashanda here? Ichadonha kubva mundangariro here? Uchaverenga zvishoma here? Ngativimbei nedhatabhesi, ngativimbei nePostgres. Hatizvitendi. Tichadonha kunze kweMemory here? Ndiani akawana OutOfMemory? Ndiani akakwanisa kuzvigadzirisa mushure mezvo? Mumwe munhu akakwanisa kuzvigadzirisa.
Kana uine miriyoni mitsara, haugone kungotora nekusarudza. OFFSET/LIMIT inodiwa. Ndiani wesarudzo iyi? Uye ndiani anofarira kutamba ne autoCommit?
Pano, senguva dzose, sarudzo isingatarisirwi inoshanduka kuva yakarurama. Uye kana ukangoerekana wadzima autoCommit, zvichabatsira. Nei zvakadaro? Sainzi haizive nezvazvo.
Asi nekukasira, vatengi vese vanobatana nePostgres dhatabhesi vanotora data rese. PgJDBC haina musiyano mune izvi; inosarudza mitsetse yese.
Pane musiyano pane FetchSize theme, i.e. unogona kutaura pamwero wechirevo chakasiyana kuti pano, ndapota sarudza data ne10, 50. Asi izvi hazvishande kusvikira wadzima autoCommit. Yakadzima autoCommit - inotanga kushanda.
Asi kuenda kuburikidza nekodhi uye kuseta setFetchSize kwese kupi hazvina kunaka. Naizvozvo, takagadzira marongero ayo achataura kukosha kweiyo yekubatanidza kwese.
Ndizvo zvatakataura. Iyo parameter yakagadziriswa. Uye chii chatakawana? Kana tikasarudza zviduku, kana, semuenzaniso, tinosarudza mitsara gumi panguva imwe, saka tine mari yakawanda kwazvo yepamusoro. Nokudaro, kukosha uku kunofanira kuiswa kusvika kune zana.
Zvakanaka, hongu, iwe uchiri kufanira kudzidza nzira yekuimisa mumabheti, asi iyo yekubikira ndeiyi: set defaultRowFetchSize kune anopfuura zana uye ufare.
Ngatienderere mberi nekuisa data. Kupinza kuri nyore, kune sarudzo dzakasiyana. Semuenzaniso, INSERT, VALUES. Iyi isarudzo yakanaka. Unogona kuti "INSERT SELECT". Mukuita chinhu chimwe chete. Hapana mutsauko mukuita.
Mabhuku anoti iwe unofanirwa kuita chirevo cheBatch, mabhuku anoti unogona kuita mirairo yakaoma nemaparentheses akati wandei. Uye Postgres ine inoshamisa chimiro - unogona kuita COPY, i.e. zviite nekukurumidza.
Kana iwe ukaiyera, iwe unogona zvakare kuita zvimwe zvinonakidza zvinowanikwa. Tinoda kuti izvi zvishande sei? Hatidi kupatsanura uye kusaita mirairo isingakoshi.
Mukuita, TCP haitibvumiri kuita izvi. Kana mutengi ari mubishi kutumira chikumbiro, saka dhatabhesi haiverenge zvikumbiro mukuyedza kutitumira mhinduro. Mhedzisiro ndeyekuti mutengi anomirira dhatabhesi kuti averenge chikumbiro, uye dhatabhesi inomirira mutengi kuti averenge mhinduro.
Uye saka mutengi anomanikidzwa kutumira nguva nenguva kutumira pakiti yekuyananisa. Kuwedzera kwekubatana kwetiweki, kuwedzera kutambisa nguva.
Uye patinowedzera kuvawedzera, zvinotonyanya kuipa. Mutyairi haana tariro uye anowedzera ivo kazhinji, kanenge kamwe chete mitsara mazana maviri, zvichienderana nehukuru hwemitsara, nezvimwe.
Zvinoitika kuti iwe unogadzirisa mutsara mumwe chete uye zvese zvinomhanyisa kagumi. Zvinoitika. Sei? Senguva dzose, chisingaperi chakadai chakatoshandiswa pane imwe nzvimbo. Uye kukosha kwe "10" kwaireva kusashandisa batching.
Zvakanaka kuti izvi hazvina kuiswa mushanduro yepamutemo. Zvakawanikwa kusunungurwa kusati kwatanga. Tsanangudzo dzese dzandinopa dzinobva pashanduro dzemazuva ano.
Ngatizviedze. Isu tinoyera InsertBatch iri nyore. Isu tinoyera InsertBatch kakawanda, kureva chinhu chimwe chete, asi pane zvakawanda zvakakosha. Tricky kufamba. Haasi munhu wese anogona kuita izvi, asi kufamba kwakapusa, kuri nyore kupfuura COPY.
Unogona kuita COPY.
Uye iwe unogona kuita izvi pane zvivakwa. Declare User default type, pass array uye INSERT yakananga patafura.
Kana iwe ukavhura chinongedzo: pgjdbc/ubenchmsrk/InsertBatch.java, ipapo iyi kodhi iri paGitHub. Iwe unogona kuona chaizvo izvo zvikumbiro zvinogadzirwa ipapo. Hazvina basa.
We launched. Uye chinhu chekutanga chatakaona ndechekuti kusashandisa batch hazvigoneke. Yese batching sarudzo ndeye zero, i.e. nguva yekuuraya inenge zero ichienzaniswa neye-imwe-nguva kuuraya.
Isu tinoisa data. Itafura iri nyore kwazvo. Makoramu matatu. Uye chii chatinoona pano? Isu tinoona kuti ese matatu esarudzo aya akaenzana. Uye COPY iri, hongu, iri nani.
Apa ndipo patinopinza zvidimbu. Patakataura kuti imwe VALUES kukosha, mbiri VALUES, nhatu VALUES, kana taratidza gumi dzadzo dzakaparadzaniswa nekoma. Izvi zvakangochinjika manje. 10, 1, 2, 4. Zvinogona kuonekwa kuti Batch Insert, iyo yakatorwa mubhuruu, inoita kuti anzwe zviri nani zvikuru. Kureva kuti ukapinza one panguva kana kuti kana waisa mana panguva imwe chete, inova yakanaka zvakapetwa kaviri, kungoti isu takadzvanyirira zvishoma muZVINHU. Zvishoma EXECUTE mashandiro.
Kushandisa COPY pamavhoriyamu madiki hakuvimbise zvakanyanya. Handina kana kudhirowa pambiri dzekutanga. Vanoenda kudenga, kureva nhamba dzegirini idzi dzeCOPY.
COPY inofanira kushandiswa kana uine kanenge zana mitsara yedata. Iyo yepamusoro yekuvhura iyi yekubatanidza yakakura. Uye, kutaura chokwadi, ini handina kuchera munzira iyi. Ndakagadzirisa Batch, asi kwete COPY.
Chii chatinotevera? Takazviedza. Tinonzwisisa kuti tinofanira kushandisa zvingava zvimiro kana kuti bacth yakangwara inobatanidza zvirevo zvakawanda.
Chii chaunofanira kutora kubva mushumo yanhasi?
- PreparedStatement ndiyo yedu yese. Izvi zvinopa zvakawanda zvekubudirira. Inoburitsa flop yakakura muchizoro.
- Uye unofanira kuita TSANANGURA ONGORORA ka6.
- Uye isu tinofanirwa kudzikisa OFFSET 0, uye matipi se +0 kuitira kugadzirisa chikamu chasara chemibvunzo yedu ine dambudziko.
Source: www.habr.com