Bidh PostgreSQL agus JDBC a’ cuir a-mach an sùgh gu lèir. Vladimir Sitnikov

Tha mi a’ moladh gun leugh thu an tar-sgrìobhadh de aithisg tràth Vladimir Sitnikov ann an 2016 “Tha PostgreSQL agus JDBC a’ brùthadh a-mach an sùgh gu lèir"

Bidh PostgreSQL agus JDBC a’ cuir a-mach an sùgh gu lèir. Vladimir Sitnikov

Bidh PostgreSQL agus JDBC a’ cuir a-mach an sùgh gu lèir. Vladimir Sitnikov

Feasgar math Is e m ’ainm Vladimir Sitnikov. Tha mi air a bhith ag obair dha NetCracker airson 10 bliadhna. Agus tha mi gu ìre mhòr ann an cinneasachd. Is e a h-uile dad co-cheangailte ri Java, a h-uile dad co-cheangailte ri SQL an rud as toil leam.

Agus an-diugh bruidhnidh mi mu na thachair dhuinn sa chompanaidh nuair a thòisich sinn a’ cleachdadh PostgreSQL mar fhrithealaiche stòr-dàta. Agus bidh sinn ag obair le Java sa mhòr-chuid. Ach chan ann mu dheidhinn Java a-mhàin a tha na tha mi a’ dol a dh’ innse dhut an-diugh. Mar a tha cleachdadh air sealltainn, tha seo cuideachd a’ tachairt ann an cànanan eile.

Bidh PostgreSQL agus JDBC a’ cuir a-mach an sùgh gu lèir. Vladimir Sitnikov

Bruidhnidh sinn:

  • mu dheidhinn samplachadh dàta.
  • Mu shàbhaladh dàta.
  • Agus cuideachd mu dheidhinn coileanadh.
  • Agus mu na ràcan fon uisge a tha air an tiodhlacadh an sin.

Bidh PostgreSQL agus JDBC a’ cuir a-mach an sùgh gu lèir. Vladimir Sitnikov

Feuch an tòisich sinn le ceist shìmplidh. Bidh sinn a’ taghadh aon sreath bhon chlàr stèidhichte air a’ phrìomh iuchair.

Bidh PostgreSQL agus JDBC a’ cuir a-mach an sùgh gu lèir. Vladimir Sitnikov

Tha an stòr-dàta suidhichte air an aon òstair. Agus bidh an tuathanachas seo gu lèir a’ toirt 20 milliseconds.

Bidh PostgreSQL agus JDBC a’ cuir a-mach an sùgh gu lèir. Vladimir Sitnikov

Tha na 20 milliseconds seo tòrr. Ma tha 100 iarrtas mar sin agad, bidh thu an uairsin a’ caitheamh ùine gach diog a’ gluasad tro na h-iarrtasan sin, i.e. tha sinn a’ caitheamh ùine.

Cha toil leinn seo a dhèanamh agus coimhead air na tha am bonn a’ tabhann dhuinn airson seo. Tha an stòr-dàta a’ tabhann dà roghainn dhuinn airson ceistean a chur an gnìomh.

Bidh PostgreSQL agus JDBC a’ cuir a-mach an sùgh gu lèir. Vladimir Sitnikov

Tha a 'chiad roghainn - iarrtas sìmplidh. Dè tha math mu dheidhinn? Leis gu bheil sinn ga thoirt agus ga chuir, agus gun dad a bharrachd.

Bidh PostgreSQL agus JDBC a’ cuir a-mach an sùgh gu lèir. Vladimir Sitnikov

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

Tha ceist adhartach aig an stòr-dàta cuideachd, a tha nas duilghe, ach nas gnìomhaiche. Faodaidh tu iarrtas airson parsadh, coileanadh, ceangal caochlaideach, msaa a chuir air leth.

Is e fìor cheist leudaichte rudeigin nach bi sinn a’ còmhdach san aithisg làithreach. Tha sinn, is dòcha, ag iarraidh rudeigin bhon stòr-dàta agus tha liosta miann ann a chaidh a chruthachadh ann an cruth air choreigin, i.e. is e seo a tha sinn ag iarraidh, ach tha e do-dhèanta an-dràsta agus an ath bhliadhna. Mar sin tha sinn dìreach air a chlàradh agus thèid sinn timcheall a’ crathadh na prìomh dhaoine.

Bidh PostgreSQL agus JDBC a’ cuir a-mach an sùgh gu lèir. Vladimir Sitnikov

Agus is e na nì sinn ceist shìmplidh agus ceist leudaichte.

Dè a tha sònraichte mu gach dòigh-obrach?

Tha ceist shìmplidh math airson coileanadh aon-ùine. Aon uair 's gu bheil e air a dhèanamh agus air a dhìochuimhneachadh. Agus is e an duilgheadas a th 'ann nach eil e a' toirt taic don chruth dàta dà-chànanach, i.e. chan eil e freagarrach airson cuid de shiostaman àrd-choileanaidh.

Bidh PostgreSQL agus JDBC a’ cuir a-mach an sùgh gu lèir. Vladimir Sitnikov

Ceist leudaichte - leigidh sin leat ùine a shàbhaladh air parsadh. Is e seo a rinn sinn agus thòisich sinn a’ cleachdadh. Bha seo dha-rìribh, na chuideachadh dhuinn. Chan eil sàbhalaidhean ann a-mhàin air parsadh. Tha sàbhalaidhean ann air gluasad dàta. Tha gluasad dàta ann an cruth binary mòran nas èifeachdaiche.

Bidh PostgreSQL agus JDBC a’ cuir a-mach an sùgh gu lèir. Vladimir Sitnikov

Gluaisidh sinn air adhart gu bhith a 'cleachdadh. Seo mar a tha tagradh àbhaisteach coltach. Dh'fhaodadh gur e Java, msaa.

Chruthaich sinn aithris. Chuir e an gnìomh an àithne. Air a chruthachadh faisg. Càite a bheil am mearachd an seo? Dè an duilgheadas a th’ ann? Chan eil duilgheadas ann. Seo na tha e ag ràdh anns na leabhraichean gu lèir. Seo mar a bu chòir a sgrìobhadh. Ma tha thu ag iarraidh an coileanadh as àirde, sgrìobh mar seo.

Bidh PostgreSQL agus JDBC a’ cuir a-mach an sùgh gu lèir. Vladimir Sitnikov

Ach tha cleachdadh air sealltainn nach obraich seo. Carson? Leis gu bheil dòigh "dlùth" againn. Agus nuair a nì sinn seo, bho shealladh an stòr-dàta tha e coltach gu bheil e coltach ri neach smocaidh ag obair le stòr-dàta. Thuirt sinn "PARSE EXECUTE DEALLOCATE".

Carson a tha an cruthachadh agus an luchdachadh sìos aithrisean a bharrachd seo? Chan eil feum aig duine orra. Ach is e an rud a thachras mar as trice ann an PreparedStatements nuair a dhùineas sinn iad, gun dùin iad a h-uile càil air an stòr-dàta. Chan e seo a tha sinn ag iarraidh.

Bidh PostgreSQL agus JDBC a’ cuir a-mach an sùgh gu lèir. Vladimir Sitnikov

Tha sinn airson, mar dhaoine fallain, a bhith ag obair leis a’ bhunait. Ghabh sinn agus dh' ullaich sinn ar n-aithris aon uair, an sin tha sinn a' cur an gnìomh iomadh uair. Gu dearbh, iomadh uair - tha seo aon uair ann am beatha iomlan nan tagraidhean - tha iad air am parsadh. Agus bidh sinn a’ cleachdadh an aon aithris id air diofar RESTs. Is e seo ar n-amas.

Bidh PostgreSQL agus JDBC a’ cuir a-mach an sùgh gu lèir. Vladimir Sitnikov

Ciamar as urrainn dhuinn seo a choileanadh?

Bidh PostgreSQL agus JDBC a’ cuir a-mach an sùgh gu lèir. Vladimir Sitnikov

Tha e gu math sìmplidh - chan eil feum air aithrisean a dhùnadh. Bidh sinn ga sgrìobhadh mar seo: “ullaich” “cuir gu bàs”.

Bidh PostgreSQL agus JDBC a’ cuir a-mach an sùgh gu lèir. Vladimir Sitnikov

Bidh PostgreSQL agus JDBC a’ cuir a-mach an sùgh gu lèir. Vladimir Sitnikov

Ma chuireas sinn rudeigin mar seo air bhog, tha e soilleir gun tèid rudeigin thairis air an àiteigin. Mura h-eil e soilleir, faodaidh tu feuchainn air. Sgrìobhamaid slat-tomhais a chleachdas an dòigh shìmplidh seo. Cruthaich aithris. Bidh sinn ga chuir air bhog air dreach air choireigin den draibhear agus gheibh sinn a-mach gun tuit e gu math luath le call a’ chuimhne a bh’ ann.

Tha e soilleir gu bheil mearachdan mar sin furasta an ceartachadh. Cha bhith mi a’ bruidhinn orra. Ach canaidh mi gu bheil an dreach ùr ag obair fada nas luaithe. Tha an dòigh-obrach gòrach, ach fhathast.

Bidh PostgreSQL agus JDBC a’ cuir a-mach an sùgh gu lèir. Vladimir Sitnikov

Ciamar a bhith ag obair ceart? Dè a dh'fheumas sinn a dhèanamh airson seo?

Gu fìrinneach, bidh tagraidhean an-còmhnaidh a’ dùnadh aithrisean. Anns a h-uile leabhar tha iad ag ràdh airson a dhùnadh, air neo bidh an cuimhne ag aoidion.

Agus chan eil fios aig PostgreSQL mar a nì thu tasgadan cheistean. Tha e riatanach gum bi gach seisean a’ cruthachadh an tasgadan seo dha fhèin.

Agus chan eil sinn airson ùine a chaitheamh air parsadh nas motha.

Bidh PostgreSQL agus JDBC a’ cuir a-mach an sùgh gu lèir. Vladimir Sitnikov

Agus mar as àbhaist tha dà roghainn againn.

Is e a’ chiad roghainn gun gabh sinn e agus gun can sinn gun cuir sinn a h-uile càil ann am PgSQL. Tha cache ann an sin. Bidh e a’ tasgadh a h-uile càil. Tionndaidhidh e a-mach gu math. Chunnaic sinn seo. Tha 100500 iarrtas againn. Chan eil ag obair. Chan eil sinn ag aontachadh iarrtasan a thionndadh gu modhan làimhe. Chan eil chan eil.

Tha dàrna roghainn againn - gabh e agus gearradh sinn fhìn e. Bidh sinn a 'fosgladh nan stòran agus a' tòiseachadh a 'gearradh. Chunnaic sinn agus chunnaic sinn. Thionndaidh e a-mach nach eil e cho doirbh a dhèanamh.

Bidh PostgreSQL agus JDBC a’ cuir a-mach an sùgh gu lèir. Vladimir Sitnikov

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

Nochd seo san Lùnastal 2015. A-nis tha dreach nas ùire ann. Agus tha a h-uile dad fìor mhath. Tha e ag obair cho math is nach atharraich sinn dad san tagradh. Agus sguir sinn eadhon a bhith a’ smaoineachadh taobh PgSQL, i.e. bha seo ceart gu leòr dhuinn na cosgaisean os-cionn uile a lughdachadh gu faisg air neoni.

Mar sin, tha aithrisean ullaichte le frithealaiche air an cur an gnìomh air an 5mh coileanadh gus nach tèid cuimhne a chall san stòr-dàta air gach iarrtas aon-ùine.

Bidh PostgreSQL agus JDBC a’ cuir a-mach an sùgh gu lèir. Vladimir Sitnikov

Faodaidh tu faighneachd - càite a bheil na h-àireamhan? Dè tha thu a' faighinn? Agus an seo cha toir mi seachad àireamhan, oir tha a chuid fhèin aig gach iarrtas.

Bha na ceistean againn cho mòr is gun do chosg sinn mu 20 milliseconds air parsadh air ceistean OLTP. Bha 0,5 milliseconds ann airson cur gu bàs, 20 milliseconds airson parsadh. Iarrtas - 10 KiB de theacsa, 170 loidhne de phlana. Is e iarrtas OLTP a tha seo. Bidh e ag iarraidh 1, 5, 10 loidhnichean, uaireannan barrachd.

Ach cha robh sinn airson 20 milliseconds a chaitheamh idir. Lùghdaich sinn e gu 0. Tha a h-uile rud sgoinneil.

Dè as urrainn dhut a thoirt air falbh às an seo? Ma tha Java agad, gabhaidh tu an tionndadh ùr-nodha den draibhear agus dèan gàirdeachas.

Ma tha cànan eile agad, smaoinich - 's dòcha gu bheil feum agad air seo cuideachd? Air sgàth 's a thaobh a' chànain mu dheireadh, mar eisimpleir, ma tha PL 8 no LibPQ agad, chan eil e follaiseach dhut gu bheil thu a' caitheamh ùine chan ann air cur gu bàs, air parsadh, agus is fhiach sùil a thoirt air seo. Ciamar? Tha a h-uile dad an-asgaidh.

Bidh PostgreSQL agus JDBC a’ cuir a-mach an sùgh gu lèir. Vladimir Sitnikov

Ach a-mhàin gu bheil mearachdan agus cuid de rudan sònraichte ann. Agus bruidhnidh sinn mun deidhinn an-dràsta. Bidh a’ mhòr-chuid dheth mu dheidhinn arc-eòlas tionnsgalach, mu na lorg sinn, na thachair dhuinn.

Bidh PostgreSQL agus JDBC a’ cuir a-mach an sùgh gu lèir. Vladimir Sitnikov

Ma thèid an t-iarrtas a chruthachadh gu dinamach. Bidh e a’ tachairt. Bidh cuideigin a’ glaodhadh nan teudan ri chèile, agus mar thoradh air sin thig ceist SQL.

Carson a tha e dona? Tha e dona oir a h-uile uair a thig sinn gu crìch le sreang eadar-dhealaichte.

Agus feumar hashCode an t-sreath eadar-dhealaichte seo a leughadh a-rithist. Is e gnìomh CPU a tha seo dha-rìribh - chan eil e cho furasta teacsa iarrtas fada a lorg ann an eadhon hash a th’ ann mar-thà. Mar sin, tha an co-dhùnadh sìmplidh - na cruthaich iarrtasan. Sàbhail iad ann an aon chaochladair. Agus dèan gàirdeachas.

Bidh PostgreSQL agus JDBC a’ cuir a-mach an sùgh gu lèir. Vladimir Sitnikov

An ath dhuilgheadas. Tha seòrsaichean dàta cudromach. Tha ORM ann a tha ag ràdh nach eil e gu diofar dè an seòrsa NULL a th’ ann, biodh seòrsa de sheòrsa ann. Ma tha Int, an uairsin bidh sinn ag ràdh setInt. Agus ma tha NULL, an uairsin biodh e an-còmhnaidh VARCHAR. Agus dè an diofar a nì e aig a’ cheann thall dè an NULL a th’ ann? Tuigidh an stòr-dàta fhèin a h-uile dad. Agus chan eil an dealbh seo ag obair.

Ann an cleachdadh, chan eil dragh sam bith air an stòr-dàta. Ma thuirt thu a’ chiad uair gur e àireamh a tha seo, agus an dàrna turas a thuirt thu gur e VARCHAR a th’ ann, tha e do-dhèanta aithrisean a chaidh ullachadh le frithealaiche ath-chleachdadh. Agus anns a 'chùis seo, feumaidh sinn ar aithris ath-chruthachadh.

Bidh PostgreSQL agus JDBC a’ cuir a-mach an sùgh gu lèir. Vladimir Sitnikov

Ma tha thu a’ dèanamh na h-aon cheist, dèan cinnteach nach eil na seòrsaichean dàta sa cholbh agad troimh-chèile. Feumaidh tu a bhith faiceallach airson NULL. Is e mearachd cumanta a tha seo a bh’ againn às deidh dhuinn tòiseachadh a’ cleachdadh PreparedStatements

Bidh PostgreSQL agus JDBC a’ cuir a-mach an sùgh gu lèir. Vladimir Sitnikov

Ceart gu leòr, tionndaidh air. 'S dòcha gun do ghabh iad an dràibhear. Agus thuit cinneasachd. Dh’ fhàs cùisean dona.

Ciamar a tha seo a’ tachairt? An e bug no feart a tha seo? Gu mì-fhortanach, cha robh e comasach tuigsinn an e biast no feart a tha seo. Ach tha suidheachadh gu math sìmplidh ann airson an duilgheadas seo ath-riochdachadh. Thug i ionnsaigh oirnn gu tur ris nach robh dùil. Agus tha e a’ toirt a-steach samplachadh gu litireil bho aon chlàr. Gu dearbh, bha barrachd iarrtasan mar sin againn. Mar riaghailt, bha iad a 'gabhail a-steach dhà no trì bhùird, ach tha leithid de shuidheachadh ath-chluich ann. Gabh dreach sam bith bhon stòr-dàta agad agus cluich e.

Bidh PostgreSQL agus JDBC a’ cuir a-mach an sùgh gu lèir. Vladimir Sitnikov

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

Is e a’ phuing gu bheil dà cholbh againn, agus tha gach fear dhiubh clàraichte. Tha millean sreath ann an aon cholbh NULL. Agus chan eil anns an dàrna colbh ach 20 loidhne. Nuair a chuireas sinn an gnìomh gun chaochladairean ceangailte, bidh a h-uile dad ag obair gu math.

Ma thòisicheas sinn a’ cur an gnìomh le caochladairean ceangailte, i.e. bidh sinn a’ cur an gnìomh an “?" no “$1” airson ar n-iarrtas, dè tha sinn a’ faighinn mu dheireadh?

Bidh PostgreSQL agus JDBC a’ cuir a-mach an sùgh gu lèir. Vladimir Sitnikov

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

Tha a’ chiad chur gu bàs mar a bha dùil. Tha an dàrna fear beagan nas luaithe. Chaidh rudeigin a thasgadh. An treas, an ceathramh, an còigeamh. An uairsin bang - agus rudeigin mar sin. Agus is e an rud as miosa gu bheil seo a’ tachairt air an t-siathamh cur gu bàs. Cò aig an robh fios gu robh e riatanach sia cur gu bàs a dhèanamh gus tuigsinn dè am fìor phlana cur gu bàs?

Bidh PostgreSQL agus JDBC a’ cuir a-mach an sùgh gu lèir. Vladimir Sitnikov

Cò tha ciontach? Dè a thachair? Anns an stòr-dàta tha optimization. Agus tha e coltach gu bheil e air a bharrrachadh airson a’ chùis choitcheann. Agus, a rèir sin, a 'tòiseachadh aig àm air choreigin, bidh i ag atharrachadh gu plana coitcheann, a dh' fhaodadh, gu mì-fhortanach, a bhith eadar-dhealaichte. Faodaidh e a bhith mar an ceudna, no faodaidh e a bhith eadar-dhealaichte. Agus tha seòrsa de luach stairsnich ann a tha a 'leantainn gu giùlan seo.

Dè as urrainn dhut a dhèanamh mu dheidhinn? An seo, gu dearbh, tha e nas duilghe rud sam bith a ghabhail. Tha fuasgladh sìmplidh ann a chleachdas sinn. Is e seo +0, OFFSET 0. Gu cinnteach tha fios agad air fuasglaidhean mar sin. Bidh sinn dìreach ga ghabhail agus a’ cur “+0” ris an iarrtas agus tha a h-uile dad ceart gu leòr. Seallaidh mi dhut nas fhaide air adhart.

Agus tha roghainn eile ann - thoir sùil nas mionaidiche air na planaichean. Feumaidh an leasaiche chan e a-mhàin iarrtas a sgrìobhadh, ach cuideachd “mìnich mion-sgrùdadh” 6 tursan a ràdh. Ma tha e 5, chan obraich e.

Agus tha an treas roghainn - sgrìobhadh litir gu pgsql-hackers. Sgrìobh mi, ge-tà, chan eil e soilleir fhathast an e bug no feart a tha seo.

Bidh PostgreSQL agus JDBC a’ cuir a-mach an sùgh gu lèir. Vladimir Sitnikov

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

Fhad ‘s a tha sinn a’ smaoineachadh an e bug no feart a tha seo, leig dhuinn a chàradh. Gabhamaid ar n-iarrtas agus cuiridh sinn "+0" ris. Tha a h-uile dad gu math. Dà shamhla agus chan fheum thu eadhon smaoineachadh air mar a tha e no dè a th’ ann. Gu math sìmplidh. Chuir sinn casg air an stòr-dàta bho bhith a’ cleachdadh clàr-amais air a’ cholbh seo. Chan eil clàr-amais againn air a’ cholbh “+ 0” agus sin e, cha bhith an stòr-dàta a’ cleachdadh a’ chlàr-amais, tha a h-uile dad ceart gu leòr.

Bidh PostgreSQL agus JDBC a’ cuir a-mach an sùgh gu lèir. Vladimir Sitnikov

Is e seo riaghailt 6 mìnich. A-nis ann an dreachan gnàthach feumaidh tu a dhèanamh 6 tursan ma tha caochladairean ceangail agad. Mura h-eil caochladairean ceangailte agad, is e seo a nì sinn. Agus aig a’ cheann thall is e dìreach an t-iarrtas seo a dh’ fhàilicheas. Chan e rud duilich a th’ ann.

Bhiodh e coltach, dè an ìre a tha comasach? Bug an seo, bug an siud. Gu fìrinneach, tha am biast anns a h-uile àite.

Bidh PostgreSQL agus JDBC a’ cuir a-mach an sùgh gu lèir. Vladimir Sitnikov

Bheir sinn sùil nas mionaidiche. Mar eisimpleir, tha dà sgeama againn. Sgeama A le clàr S agus diagram B le clàr S. Ceist - tagh dàta bho bhòrd. Dè a bhios againn sa chùis seo? Bidh mearachd againn. Bidh a h-uile rud gu h-àrd againn. Is e an riaghailt - tha biast anns a h-uile àite, bidh a h-uile rud gu h-àrd againn.

Bidh PostgreSQL agus JDBC a’ cuir a-mach an sùgh gu lèir. Vladimir Sitnikov

A-nis tha a 'cheist: "Carson?" Bhiodh e coltach gu bheil sgrìobhainnean ann ma tha sgeama againn, gu bheil caochladair “search_path” ann a dh’ innseas dhuinn càite an coimhead sinn airson a’ bhùird. Bhiodh e coltach gu bheil caochladair ann.

Dè an duilgheadas a th’ ann? Is e an duilgheadas a th’ ann nach eil aithrisean air an ullachadh leis an fhrithealaiche fo amharas gum faod cuideigin search_path atharrachadh. Tha an luach seo fhathast, mar gum biodh, seasmhach airson an stòr-dàta. Agus is dòcha nach tog cuid de phàirtean brìgh ùra.

Bidh PostgreSQL agus JDBC a’ cuir a-mach an sùgh gu lèir. Vladimir Sitnikov

Gu dearbh, tha seo an urra ris an dreach air a bheil thu a’ dèanamh deuchainn. Tha e an urra ri cho mòr sa tha na bùird agad eadar-dhealaichte. Agus cuiridh dreach 9.1 dìreach na seann iarrtasan an gnìomh. Faodaidh dreachan ùra am biast a ghlacadh agus innse dhut gu bheil biast agad.

Bidh PostgreSQL agus JDBC a’ cuir a-mach an sùgh gu lèir. Vladimir Sitnikov

Suidhich search_path + aithrisean ullaichte leis an fhrithealaiche =
chan fhaod plana taisgte an seòrsa toraidh atharrachadh

Ciamar a làimhseachadh? Tha reasabaidh shìmplidh ann - na dèan e. Chan eil feum air search_path atharrachadh fhad 's a tha an aplacaid a' ruith. Ma dh'atharraicheas tu, tha e nas fheàrr ceangal ùr a chruthachadh.

Faodaidh tu bruidhinn, i.e. fosgail, bruidhinn, cuir ris. Is dòcha gun urrainn dhuinn toirt a chreidsinn air luchd-leasachaidh an stòr-dàta, nuair a dh’ atharraicheas cuideigin luach, gum bu chòir don stòr-dàta innse don neach-dèiligidh mu dheidhinn seo: “Seall, chaidh do luach ùrachadh an seo. Is dòcha gu feum thu na h-aithrisean ath-shuidheachadh agus an ath-chruthachadh?" A-nis tha an stòr-dàta a 'giùlain gu dìomhair agus chan eil e ag aithris ann an dòigh sam bith gu bheil na h-aithrisean air atharrachadh an àiteigin a-staigh.

Agus cuiridh mi cuideam a-rithist - is e seo rudeigin nach eil àbhaisteach airson Java. Chì sinn an aon rud ann am PL/pgSQL aon ri aon. Ach thèid ath-riochdachadh an sin.

Bidh PostgreSQL agus JDBC a’ cuir a-mach an sùgh gu lèir. Vladimir Sitnikov

Feuch sinn beagan a bharrachd taghadh dàta. Bidh sinn a 'taghadh agus a' taghadh. Tha clàr againn le millean sreath. Tha gach loidhne na kilobyte. Tha timcheall air gigabyte de dhàta. Agus tha cuimhne obrach againn anns an inneal Java de 128 megabytes.

Bidh sinn, mar a thathar a’ moladh anns a h-uile leabhar, a’ cleachdadh giollachd sruthan. Is e sin, bidh sinn a’ fosgladh resultSet agus a’ leughadh an dàta às an sin beag air bheag. An obraich e? An tuit e bho chuimhne? An leugh thu beagan? Feuch an cuir sinn earbsa anns an stòr-dàta, cuireamaid earbsa ann am Postgres. Chan eil sinn ga chreidsinn. An tuit sinn A-mach air Cuimhne? Cò aig an robh eòlas air OutOfMemory? Cò fhuair air a chàradh às deidh sin? Chaidh aig cuideigin air a chàradh.

Ma tha millean sreath agad, chan urrainn dhut dìreach taghadh agus taghadh. Tha feum air OFFSET/LIMIT. Cò a tha airson an roghainn seo? Agus cò a tha airson a bhith a’ cluich le autoCommit?

An seo, mar as àbhaist, tha an roghainn as ris nach robh dùil ceart. Agus ma chuireas tu dheth autoCommit gu h-obann, cuidichidh e. Carson a tha sin? Chan eil fios aig saidheans mu dheidhinn seo.

Bidh PostgreSQL agus JDBC a’ cuir a-mach an sùgh gu lèir. Vladimir Sitnikov

Ach gu gnàthach, bidh a h-uile neach-dèiligidh a tha a’ ceangal ri stòr-dàta Postgres a’ faighinn an dàta gu lèir. Chan eil PgJDBC mar eisgeachd a thaobh seo; bidh e a’ taghadh a h-uile sreath.

Tha caochladh air a’ chuspair FetchSize, i.e. faodaidh tu a ràdh aig ìre aithris air leth gun tagh thu dàta an seo ro 10, 50. Ach chan obraich seo gus an cuir thu dheth autoCommit. AutoCommit air a chuir dheth - bidh e a’ tòiseachadh ag obair.

Ach tha e mì-ghoireasach a bhith a ’dol tron ​​​​chòd agus a’ suidheachadh setFetchSize anns a h-uile àite. Mar sin, rinn sinn suidheachadh a chanas an luach bunaiteach airson a’ cheangail gu lèir.

Bidh PostgreSQL agus JDBC a’ cuir a-mach an sùgh gu lèir. Vladimir Sitnikov

Sin a thuirt sinn. Tha am paramadair air a rèiteachadh. Agus dè fhuair sinn? Ma roghnaicheas sinn suimean beaga, ma tha, mar eisimpleir, a 'taghadh 10 sreathan aig an aon àm, tha cosgaisean os cionn mòr againn. Mar sin, bu chòir an luach seo a shuidheachadh gu timcheall air ceud.

Bidh PostgreSQL agus JDBC a’ cuir a-mach an sùgh gu lèir. Vladimir Sitnikov

Mas fheàrr, gu dearbh, feumaidh tu fhathast ionnsachadh mar a chuireas tu casg air ann am bytes, ach is e an reasabaidh seo: suidhich defaultRowFetchSize gu còrr air ceud agus bi toilichte.

Bidh PostgreSQL agus JDBC a’ cuir a-mach an sùgh gu lèir. Vladimir Sitnikov

Gluaisidh sinn air adhart gu bhith a 'cur a-steach dàta. Tha cur a-steach nas fhasa, tha diofar roghainnean ann. Mar eisimpleir, INSERT, VALUES. Is e deagh roghainn a tha seo. Faodaidh tu “INSERT SELECT” a ràdh. Ann an cleachdadh tha e an aon rud. Chan eil diofar ann an coileanadh.

Tha leabhraichean ag ràdh gum feum thu aithris Baidse a chuir an gnìomh, tha leabhraichean ag ràdh gun urrainn dhut òrdughan nas iom-fhillte a chuir an gnìomh le grunn bhrathan. Agus tha feart iongantach aig Postgres - faodaidh tu COPY a dhèanamh, i.e. dèan e nas luaithe.

Bidh PostgreSQL agus JDBC a’ cuir a-mach an sùgh gu lèir. Vladimir Sitnikov

Ma thomhaiseas tu e, faodaidh tu a-rithist lorgan inntinneach a dhèanamh. Ciamar a tha sinn airson gun obraich seo? Tha sinn airson gun a bhith a’ parsadh agus gun a bhith a’ cur an gnìomh òrdughan neo-riatanach.

Bidh PostgreSQL agus JDBC a’ cuir a-mach an sùgh gu lèir. Vladimir Sitnikov

Ann an cleachdadh, cha leig TCP leinn seo a dhèanamh. Ma tha an neach-dèiligidh trang a’ cur iarrtas, cha leugh an stòr-dàta na h-iarrtasan ann an oidhirpean air freagairtean a chuir thugainn. Is e an toradh deireannach gu bheil an neach-dèiligidh a’ feitheamh ris an stòr-dàta an t-iarrtas a leughadh, agus tha an stòr-dàta a’ feitheamh ris an neach-dèiligidh am freagairt a leughadh.

Bidh PostgreSQL agus JDBC a’ cuir a-mach an sùgh gu lèir. Vladimir Sitnikov

Agus mar sin feumaidh an neach-dèiligidh pasgan sioncronaidh a chuir bho àm gu àm. Eadar-obrachaidhean lìonra a bharrachd, sgudal ùine a bharrachd.

Bidh PostgreSQL agus JDBC a’ cuir a-mach an sùgh gu lèir. Vladimir SitnikovAgus mar as motha a chuireas sinn iad, is ann as miosa a thig e. Tha an draibhear gu math eu-dòchasach agus bidh e gan cur gu math tric, timcheall air aon uair gach 200 loidhne, a rèir meud nan loidhnichean, msaa.

Bidh PostgreSQL agus JDBC a’ cuir a-mach an sùgh gu lèir. Vladimir Sitnikov

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

Tha e a 'tachairt nach eil thu a' ceartachadh ach aon loidhne agus thèid a h-uile càil suas 10 tursan. Bidh e a’ tachairt. Carson? Mar as àbhaist, chaidh a leithid de shìol a chleachdadh mar-thà an àiteigin. Agus bha an luach “128” a’ ciallachadh gun a bhith a’ cleachdadh baidseadh.

Bidh PostgreSQL agus JDBC a’ cuir a-mach an sùgh gu lèir. Vladimir Sitnikov

Uidheam microbenchmark airson java

Tha e math nach deach seo a thoirt a-steach don dreach oifigeil. Air a lorg mus do thòisich an sgaoileadh. Tha a h-uile ciall a bheir mi seachad stèidhichte air dreachan an latha an-diugh.

Bidh PostgreSQL agus JDBC a’ cuir a-mach an sùgh gu lèir. Vladimir Sitnikov

Feuch sinn e air adhart. Bidh sinn a’ tomhas InsertBatch sìmplidh. Bidh sinn a’ tomhas InsertBatch grunn thursan, i.e. an aon rud, ach tha mòran luachan ann. Gluasad duilich. Chan urrainn dha a h-uile duine seo a dhèanamh, ach tha e na ghluasad cho sìmplidh, fada nas fhasa na COPY.

Bidh PostgreSQL agus JDBC a’ cuir a-mach an sùgh gu lèir. Vladimir Sitnikov

Faodaidh tu COPY a dhèanamh.

Bidh PostgreSQL agus JDBC a’ cuir a-mach an sùgh gu lèir. Vladimir Sitnikov

Agus faodaidh tu seo a dhèanamh air structaran. Cuir an cèill an seòrsa àbhaisteach cleachdaiche, raon pas agus INSERT gu dìreach chun chlàr.

Ma dh'fhosglas tu an ceangal: pgjdbc/ubenchmsrk/InsertBatch.java, tha an còd seo air GitHub. Chì thu gu sònraichte dè na h-iarrtasan a thèid a chruthachadh an sin. Cha dèan e diofar.

Bidh PostgreSQL agus JDBC a’ cuir a-mach an sùgh gu lèir. Vladimir Sitnikov

Chuir sinn air bhog. Agus b 'e a' chiad rud a thuig sinn gu bheil e dìreach do-dhèanta gun a bhith a 'cleachdadh baidse. Tha a h-uile roghainn batching neoni, i.e. tha an ùine cur gu bàs cha mhòr neoni an taca ri coileanadh aon-ùine.

Bidh PostgreSQL agus JDBC a’ cuir a-mach an sùgh gu lèir. Vladimir Sitnikov

Bidh sinn a’ cuir a-steach dàta. Is e clàr gu math sìmplidh a th’ ann. Trì colbhan. Agus dè a chì sinn an seo? Chì sinn gu bheil na trì roghainnean sin an ìre mhath coimeasach. Agus tha COPY, gu dearbh, nas fheàrr.

Bidh PostgreSQL agus JDBC a’ cuir a-mach an sùgh gu lèir. Vladimir Sitnikov

Seo nuair a chuireas sinn pìosan a-steach. Nuair a thuirt sinn gun robh aon luach LUACH, dà luach LUACH, trì luachan VALUES, neo chomharraich sinn 10 dhiubh air an sgaradh le cromag. Tha seo dìreach còmhnard a-nis. 1, 2, 4, 128. Chithear gu bheil am Baidse Insert, a tha air a tharraing ann an gorm, a 'toirt air a bhith a' faireachdainn tòrr nas fheàrr. Is e sin, nuair a chuireas tu a-steach fear aig an aon àm no eadhon nuair a chuireas tu a-steach ceithir aig an aon àm, bidh e a’ fàs a dhà uimhir cho math, dìreach air sgàth gun do chuir sinn a-steach beagan a bharrachd a-steach do LUACHANNA. Nas lugha de ghnìomhachd EXECUTE.

Tha a bhith a’ cleachdadh COPY air meudan beaga gu math neo-thaitneach. Cha do tharraing mi eadhon air a’ chiad dhà. Bidh iad a 'dol gu neamh, is e sin, na h-àireamhan uaine sin airson COPY.

Bu chòir COPY a chleachdadh nuair a tha co-dhiù ceud sreath de dhàta agad. Tha an àrdachadh os cionn fosgladh a’ cheangail seo mòr. Agus, a bhith onarach, cha do chladhaich mi an taobh seo. Rinn mi am Baidse as fheàrr, ach chan e COPY.

Dè nì sinn an ath rud? Dh'fheuch sinn e air adhart. Tha sinn a’ tuigsinn gum feum sinn an dàrna cuid structaran no bacth ciallach a chleachdadh a tha a’ ceangal grunn bhrìgh ri chèile.

Bidh PostgreSQL agus JDBC a’ cuir a-mach an sùgh gu lèir. Vladimir Sitnikov

Dè bu chòir dhut a thoirt air falbh bho aithisg an latha an-diugh?

  • Is e Aithris Ullaichte a h-uile dad a th’ againn. Bheir seo mòran airson cinneasachd. Bidh e a’ toirt a-mach flop mòr anns an ointment.
  • Agus feumaidh tu Mìneachadh Mion-sgrùdadh 6 tursan.
  • Agus feumaidh sinn OFFSET 0, agus cleasan mar +0 a lagachadh gus an ceudad a tha air fhàgail de na ceistean trioblaideach againn a cheartachadh.

Source: www.habr.com

Cuir beachd ann