{"id":79893,"date":"2020-05-01T13:43:12","date_gmt":"2020-05-01T11:43:12","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/postgresql-i-jdbc-vyzhimaem-vse-soki-vladimir-sitnikov"},"modified":"2020-05-01T13:43:12","modified_gmt":"2020-05-01T11:43:12","slug":"postgresql-i-jdbc-vyzhimaem-vse-soki-vladimir-sitnikov","status":"publish","type":"post","link":"https:\/\/prohoster.info\/lv\/blog\/administrirovanie\/postgresql-i-jdbc-vyzhimaem-vse-soki-vladimir-sitnikov","title":{"rendered":"PostgreSQL un JDBC: izspie\u017eam visu, ko varam. Vladimirs Sit\u0146ikovs","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><strong>Aicinu iepaz\u012bties ar Vladimira Sitnikova 2016. gada s\u0101kuma zi\u0146ojuma \"PostgreSQL un JDBC \u2014 izspie\u017eam visu labumu\" transkripciju.<\/strong><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL un JDBC: izspie\u017eam visu, ko varam. Vladimirs Sit\u0146ikovs\" src=\"\/wp-content\/uploads\/2020\/05\/9d94c8a024bd2821e431c525aae0127d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL un JDBC: izspie\u017eam visu, ko varam. Vladimirs Sit\u0146ikovs\" src=\"\/wp-content\/uploads\/2020\/05\/030666abda53aa388b1cb1d0c46a7524.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Labdien! Mani sauc Vladimirs Sitnikovs. Es str\u0101d\u0101ju uz\u0146\u0113mum\u0101 NetCracker jau 10 gadus. Galvenok\u0101rt nodarbojos ar veiktsp\u0113ju. Viss, kas saist\u012bts ar Java, viss, kas saist\u012bts ar SQL \u2013 tas ir tas, kas man pat\u012bk. <\/p>\n<p><\/p>\n<p>Un \u0161odien es past\u0101st\u012b\u0161u par to, ar ko m\u0113s sask\u0101r\u0101mies uz\u0146\u0113mum\u0101, kad s\u0101k\u0101m izmantot PostgreSQL k\u0101 datu b\u0101zes serveri. Un m\u0113s galvenok\u0101rt str\u0101d\u0101jam ar Java. Ta\u010du tas, ko es \u0161odien st\u0101st\u012b\u0161u, ir saist\u012bts ne tikai ar Java. K\u0101 praks\u0113 par\u0101d\u012bj\u0101s, tas rodas ar\u012b cit\u0101s valod\u0101s. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL un JDBC: izspie\u017eam visu, ko varam. Vladimirs Sit\u0146ikovs\" src=\"\/wp-content\/uploads\/2020\/05\/b01a214d782c7e32797a6c6466457979.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>M\u0113s run\u0101sim par:<\/p>\n<p><\/p>\n<ul>\n<li>datu izv\u0113li. <\/li>\n<li>Datu saglab\u0101\u0161anu. <\/li>\n<li>K\u0101 ar\u012b par veiktsp\u0113ju. <\/li>\n<li>Un par zem\u016bdens akme\u0146iem, kas tur sl\u0113pjas. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL un JDBC: izspie\u017eam visu, ko varam. Vladimirs Sit\u0146ikovs\" src=\"\/wp-content\/uploads\/2020\/05\/57da0c6aa4bb62e1beb77160f5aee7e7.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>S\u0101ksim ar vienk\u0101r\u0161u jaut\u0101jumu. M\u0113s izv\u0113lamies vienu rindu no tabulas p\u0113c prim\u0101r\u0101 atsl\u0113gu. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL un JDBC: izspie\u017eam visu, ko varam. Vladimirs Sit\u0146ikovs\" src=\"\/wp-content\/uploads\/2020\/05\/d5fcb1172aef402a87064498bf8a5218.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Datu b\u0101ze atrodas uz t\u0101 pa\u0161a hosta. Un viss \u0161is process aiz\u0146em 20 milisekundes.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL un JDBC: izspie\u017eam visu, ko varam. Vladimirs Sit\u0146ikovs\" src=\"\/wp-content\/uploads\/2020\/05\/103b7f9736b82a3313491b2f0d2a5824.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u0160\u012bs 20 milisekundes ir \u013coti daudz. Ja jums t\u0101du ir 100 piepras\u012bjumu, tad j\u016bs t\u0113r\u0113jat laiku sekund\u0113s, lai \u0161os piepras\u012bjumus izpild\u012btu, t.i., t\u0113r\u0113jat laiku bezj\u0113dz\u012bgi.<\/p>\n<p><\/p>\n<p>M\u0113s to negribam dar\u012bt un skat\u0101mies, ko mums pied\u0101v\u0101 datu b\u0101ze. Datu b\u0101ze pied\u0101v\u0101 mums divus piepras\u012bjumu izpildes variantus. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL un JDBC: izspie\u017eam visu, ko varam. Vladimirs Sit\u0146ikovs\" src=\"\/wp-content\/uploads\/2020\/05\/b467e86a0f8c4c32cea182fe27a28e6e.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Pirmais variants \u2013 tas ir vienk\u0101r\u0161s piepras\u012bjums. Kas taj\u0101 ir labs? Tas, ka m\u0113s to \u0146emam un nos\u016bt\u0101m, un nekas vair\u0101k. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL un JDBC: izspie\u017eam visu, ko varam. Vladimirs Sit\u0146ikovs\" src=\"\/wp-content\/uploads\/2020\/05\/7e333a62ba68feb0781ff96e39486591.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/pgjdbc\/pgjdbc\/pull\/478\">https:\/\/github.com\/pgjdbc\/pgjdbc\/pull\/478<\/a><\/noindex><\/p>\n<p><\/p>\n<p>Datu b\u0101zei ir ar\u012b papla\u0161in\u0101ts piepras\u012bjums, kas ir vilt\u012bg\u0101ks, ta\u010du funkcion\u0101l\u0101ks. Varat atsevi\u0161\u0137i nos\u016bt\u012bt piepras\u012bjumu par pars\u0113\u0161anu, izpildi, main\u012bgo saist\u012b\u0161anu utt. <\/p>\n<p><\/p>\n<p>Super papla\u0161in\u0101ts piepras\u012bjums \u2013 tas ir tas, ko m\u0113s \u0161aj\u0101 zi\u0146ojum\u0101 neaptversim. M\u0113s, iesp\u0113jams, gribam ko no datu b\u0101zes, un ir t\u0101ds v\u0113lmju saraksts, kas k\u0101d\u0101 form\u0101 ir izveidots, t.i., tas ir tas, ko m\u0113s gribam, bet \u0161obr\u012bd un tuv\u0101kaj\u0101 gad\u0101 tas nav iesp\u0113jams. T\u0101p\u0113c vienk\u0101r\u0161i pierakst\u012bj\u0101m un ejam tricin\u0101t galvenos cilv\u0113kus.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL un JDBC: izspie\u017eam visu, ko varam. Vladimirs Sit\u0146ikovs\" src=\"\/wp-content\/uploads\/2020\/05\/19094729074fd28c5b9f236833a9a266.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Bet to, ko m\u0113s varam izdar\u012bt, ir \u2013 tas ir vienk\u0101r\u0161ais piepras\u012bjums un papla\u0161in\u0101tais piepras\u012bjums.<\/p>\n<p><\/p>\n<p>K\u0101das ir katra pieejas \u012bpatn\u012bbas? <\/p>\n<p><\/p>\n<p>Vienk\u0101r\u0161o piepras\u012bjumu labi izmantot vienreiz\u0113jai izpildei. Reiz izpild\u012bj\u0101m un aizmirs\u0101m. Un probl\u0113ma ir t\u0101, ka tas neatbalsta bin\u0101ro datu form\u0101tu, t.i., augstas veiktsp\u0113jas sist\u0113m\u0101m tas nav piem\u0113rots.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL un JDBC: izspie\u017eam visu, ko varam. Vladimirs Sit\u0146ikovs\" src=\"\/wp-content\/uploads\/2020\/05\/062c0e45cefd91ece331a306a7651bde.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Izcila vaic\u0101juma funkcionalit\u0101te \u013cauj ietaup\u012bt laiku pars\u0113\u0161an\u0101. Tie\u0161i to m\u0113s izdar\u012bj\u0101m un s\u0101k\u0101m izmantot. Tas mums ir \u0101rk\u0101rt\u012bgi pal\u012bdz\u0113jis. Tur ir ne tikai ietaup\u012bjums pars\u0113\u0161an\u0101. Ir ar\u012b ietaup\u012bjums datu p\u0101rs\u016bt\u012b\u0161anas proces\u0101. Datu p\u0101rs\u016bt\u012b\u0161ana bin\u0101r\u0101 form\u0101t\u0101 ir daudz efekt\u012bv\u0101ka. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL un JDBC: izspie\u017eam visu, ko varam. Vladimirs Sit\u0146ikovs\" src=\"\/wp-content\/uploads\/2020\/05\/6df83a2f3736568668cf9d74de5d9758.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>P\u0101rsl\u0113gsimies pie praktisk\u0101s da\u013cas. T\u0101 izskat\u0101s tipiska lietojumprogramma. Tas var b\u016bt Java utt. <\/p>\n<p><\/p>\n<p>M\u0113s izveidoj\u0101m statement. Izpild\u012bj\u0101m komandu. Izveidoj\u0101m close. Kur ir \u0161\u012b k\u013c\u016bda? K\u0101da ir probl\u0113ma? Nav probl\u0113mu. T\u0101 ir rakst\u012bts vis\u0101s gr\u0101mat\u0101s. T\u0101 ir j\u0101raksta. Ja v\u0113laties maksim\u0101lu veiktsp\u0113ju, rakstiet t\u0101. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL un JDBC: izspie\u017eam visu, ko varam. Vladimirs Sit\u0146ikovs\" src=\"\/wp-content\/uploads\/2020\/05\/6923293946dec45b3fd508235728ab95.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ta\u010du prakse par\u0101d\u012bja, ka tas nedarbojas. K\u0101p\u0113c? T\u0101p\u0113c, ka mums ir metode \u00abclose\u00bb. Kad m\u0113s to t\u0101 dar\u0101m, no datu b\u0101zes viedok\u013ca tas ir t\u0101, it k\u0101 sm\u0113\u0137\u0113t\u0101js str\u0101d\u0101tu ar datu b\u0101zi. M\u0113s teic\u0101m \u00abPARSE EXECUTE DEALLOCATE\u00bb.<\/p>\n<p><\/p>\n<p>K\u0101p\u0113c \u0161ie liekie statement un to sl\u0113g\u0161ana? Tie nevienam nav vajadz\u012bgi. Bet parasti tas notiek PreparedStatement, kad m\u0113s tos sl\u0113dzam, vi\u0146i sl\u0113dz visu datu b\u0101z\u0113. Tas nav tas, ko m\u0113s v\u0113lamies. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL un JDBC: izspie\u017eam visu, ko varam. Vladimirs Sit\u0146ikovs\" src=\"\/wp-content\/uploads\/2020\/05\/5a357a209e414024c437d042f600f251.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>M\u0113s v\u0113lamies, k\u0101 veseli cilv\u0113ki, str\u0101d\u0101t ar datu b\u0101zi. Vienu reizi sagatavojam m\u016bsu statement, p\u0113c tam to izpild\u0101m daudz rei\u017eu. Paties\u012bb\u0101 daudz rei\u017eu \u2013 tas ir vienreiz visu dz\u012bvi aplik\u0101cijas laik\u0101 p\u0101rs\u0113ti. Un da\u017e\u0101dos REST izmantojam to pa\u0161u statement id. T\u0101 ir m\u016bsu m\u0113r\u0137is. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL un JDBC: izspie\u017eam visu, ko varam. Vladimirs Sit\u0146ikovs\" src=\"\/wp-content\/uploads\/2020\/05\/ac4aed702a624ad9f9addc4362daf760.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>K\u0101 mums to sasniegt? <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL un JDBC: izspie\u017eam visu, ko varam. Vladimirs Sit\u0146ikovs\" src=\"\/wp-content\/uploads\/2020\/05\/0f101d890d1a2af8e99f8a3a8a06fd5a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u013boti vienk\u0101r\u0161i \u2013 nav nepiecie\u0161ams sl\u0113gt statements. Rakst\u0101m \u0161\u0101di: \u00abprepare\u00bb \u00abexecute\u00bb. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL un JDBC: izspie\u017eam visu, ko varam. Vladimirs Sit\u0146ikovs\" src=\"\/wp-content\/uploads\/2020\/05\/0b3fd8fd4f5861d4a76cad5a8421ddad.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL un JDBC: izspie\u017eam visu, ko varam. Vladimirs Sit\u0146ikovs\" src=\"\/wp-content\/uploads\/2020\/05\/724646bfc55b5e2b611b1584ca8ba6aa.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ja m\u0113s to palaid\u012bsim, tad saprotams, ka kaut kur kaut kas p\u0101rsniegs robe\u017eu. Ja nesaprotat, to var izm\u0113r\u012bt. M\u0113s \u0146emsim un uzrakst\u012bsim benchmark, kur\u0101 b\u016bs \u0161\u012b vienk\u0101r\u0161\u0101 metode. Izveidojam statement. Palaid\u012bsim uz k\u0101das versijas drivera un ieg\u016bstam, ka vi\u0146\u0161 diezgan \u0101tri avar\u0113, zaud\u0113jot visu atmi\u0146u, kas mums bija. <\/p>\n<p><\/p>\n<p>Skaidrs, ka \u0161\u0101das k\u013c\u016bdas ir viegli labojamas. Es par t\u0101m nerun\u0101\u0161u. Bet es teik\u0161u, ka jaun\u0101 versij\u0101 str\u0101d\u0101 daudz \u0101tr\u0101k. Metode ir neizdev\u012bga, bet tom\u0113r. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL un JDBC: izspie\u017eam visu, ko varam. Vladimirs Sit\u0146ikovs\" src=\"\/wp-content\/uploads\/2020\/05\/b232a6205e708c70f52be0024bbe9980.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>K\u0101 str\u0101d\u0101t pareizi? Ko mums tam dar\u012bt?<\/p>\n<p><\/p>\n<p>Realit\u0101t\u0113 lietojumprogrammas vienm\u0113r sl\u0113dz statements. Vis\u0101s gr\u0101mat\u0101s raksta, ka j\u0101sl\u0113dz, pret\u0113j\u0101 gad\u012bjum\u0101 notiks atmi\u0146as nopl\u016bde. <\/p>\n<p><\/p>\n<p>Un PostgreSQL nem\u0101k ke\u0161ot vaic\u0101jumus. Katram sessijai ir pa\u0161ai j\u0101konstru\u0113 \u0161is ke\u0161s. <\/p>\n<p><\/p>\n<p>Un laiku t\u0113r\u0113t pars\u0113\u0161anai m\u0113s ar\u012b nev\u0113lamies. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL un JDBC: izspie\u017eam visu, ko varam. Vladimirs Sit\u0146ikovs\" src=\"\/wp-content\/uploads\/2020\/05\/85b9574938aa6e6bf59c956e3728bdc3.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Un, k\u0101 parasti, mums ir divi varianti. <\/p>\n<p><\/p>\n<p>Pirmais variants \u2013 m\u0113s \u0146emam un sak\u0101m, ka p\u0101rv\u0113rst visu PgSQL. Tur ir ke\u0161atmi\u0146a. Tas visu ke\u0161\u0113. Rezult\u0101ts b\u016bs lielisks. M\u0113s to esam apskat\u012bju\u0161i. Mums ir 100500 piepras\u012bjumu. Tas nestr\u0101d\u0101. M\u0113s neesam apmierin\u0101ti \u2013 p\u0101rveidot piepras\u012bjumus manu\u0101li proced\u016br\u0101s. N\u0113-n\u0113. <\/p>\n<p><\/p>\n<p>Mums ir otrais variants \u2013 pa\u0146emt un pa\u0161iem uztais\u012bt. Atveram avota kodus, s\u0101kam str\u0101d\u0101t. Str\u0101d\u0101jam-str\u0101d\u0101jam. Izr\u0101d\u012bj\u0101s, ka to izdar\u012bt nemaz nav tik gr\u016bti. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL un JDBC: izspie\u017eam visu, ko varam. Vladimirs Sit\u0146ikovs\" src=\"\/wp-content\/uploads\/2020\/05\/501620b014800406167d20668baef709.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/pgjdbc\/pgjdbc\/pull\/319\">https:\/\/github.com\/pgjdbc\/pgjdbc\/pull\/319<\/a><\/noindex><\/p>\n<p><\/p>\n<p>Tas par\u0101d\u012bj\u0101s 2015. gada august\u0101. Tagad ir jau m\u016bsdien\u012bg\u0101ka versija. Un viss ir lieliski. Tas str\u0101d\u0101 tik labi, ka m\u0113s neko nemain\u0101m aplik\u0101cij\u0101. Un m\u0113s pat p\u0101rtrauc\u0101m dom\u0101t par PgSQL, t.i., mums t\u0101 visa ir pietiekami, lai samazin\u0101tu visas izmaksas praktiski l\u012bdz nullei. <\/p>\n<p><\/p>\n<p>Attiec\u012bgi Server-prepared statements tiek aktiviz\u0113ts piektaj\u0101 izpild\u0113, lai net\u0113r\u0113tu atmi\u0146u datu b\u0101z\u0113 katram vienreiz\u0113jam piepras\u012bjumam. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL un JDBC: izspie\u017eam visu, ko varam. Vladimirs Sit\u0146ikovs\" src=\"\/wp-content\/uploads\/2020\/05\/8ee95e71f92187941989ad0c18ece0c0.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Var jaut\u0101t \u2013 kur ir skait\u013ci? Ko j\u016bs ieg\u016bstat? Un \u0161eit es skait\u013cus nedo\u0161u, jo katram piepras\u012bjumam tie ir savi.<\/p>\n<p><\/p>\n<p>Mums bija t\u0101di piepras\u012bjumi, ka m\u0113s OLTP piepras\u012bjumos izt\u0113r\u0113j\u0101m apm\u0113ram 20 milisekundes pars\u0113\u0161anai. Tur bija 0,5 milisekundes izpildei, 20 milisekundes pars\u0113\u0161anai. Piepras\u012bjums \u2013 10 KiB teksta, 170 rindu pl\u0101na. Tas ir OLTP piepras\u012bjums. Tas pieprasa 1, 5, 10 rindas, da\u017ereiz vair\u0101k. <\/p>\n<p><\/p>\n<p>Bet m\u0113s nemaz negrib\u0113j\u0101m t\u0113r\u0113t 20 milisekundes. M\u0113s to samazin\u0101j\u0101m l\u012bdz 0. Viss ir lieliski. <\/p>\n<p><\/p>\n<p>Ko j\u016bs varat secin\u0101t no t\u0101? Ja jums ir Java, tad j\u016bs \u0146emat m\u016bsdien\u012bgu draivera versiju un priec\u0101jaties. <\/p>\n<p><\/p>\n<p>Ja jums ir k\u0101da cita valoda, tad padom\u0101jiet \u2013 varb\u016bt jums tas ar\u012b ir nepiecie\u0161ams? Jo, run\u0101jot par galveno valodu, piem\u0113ram, ja PL 8 vai jums ir LibPQ, tad jums nav ac\u012bmredzami skaidrs, ka j\u016bs t\u0113r\u0113jat laiku nevis izpildei, bet pars\u0113\u0161anai, un to ir v\u0113rts p\u0101rbaud\u012bt. K\u0101? Viss ir bez maksas. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL un JDBC: izspie\u017eam visu, ko varam. Vladimirs Sit\u0146ikovs\" src=\"\/wp-content\/uploads\/2020\/05\/fda6b1c1b126cb85c970e42335e1dc24.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Iz\u0146emot to, ka ir k\u013c\u016bdas, da\u017eas \u012bpatn\u012bbas. Un par t\u0101m m\u0113s tagad run\u0101sim. Liel\u0101k\u0101 da\u013ca b\u016bs par r\u016bpniecisko arheolo\u0123iju, par to, ko m\u0113s atrad\u0101m, uz ko uzg\u0101j\u0101m. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL un JDBC: izspie\u017eam visu, ko varam. Vladimirs Sit\u0146ikovs\" src=\"\/wp-content\/uploads\/2020\/05\/9a3b383f83c5e227cd02952c5825b64f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ja piepras\u012bjums tiek \u0123ener\u0113ts dinamisk\u0101 veid\u0101. T\u0101 notiek. K\u0101ds saliek virknes, izn\u0101k SQL piepras\u012bjums.<\/p>\n<p><\/p>\n<p>K\u0101p\u0113c tas ir slikti? Tas ir slikti, jo katru reizi m\u0113s galu gal\u0101 ieg\u016bstam at\u0161\u0137ir\u012bgu virkni.<\/p>\n<p><\/p>\n<p>Ar \u0161iem da\u017e\u0101dajiem datiem ir j\u0101skaita hashCode no jauna. Tas patie\u0161\u0101m ir CPU uzdevums \u2013 atrast garo piepras\u012bjuma tekstu, pat ja mums ir hash, nav nemaz tik viegli. T\u0101p\u0113c secin\u0101jums ir vienk\u0101r\u0161s \u2013 neradiet piepras\u012bjumus. Glab\u0101jiet tos k\u0101d\u0101 vien\u0101 main\u012bgaj\u0101. Un priec\u0101jieties.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL un JDBC: izspie\u017eam visu, ko varam. Vladimirs Sit\u0146ikovs\" src=\"\/wp-content\/uploads\/2020\/05\/bcd4f729204cecdb572a98f357bcc33f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>N\u0101kam\u0101 probl\u0113ma. Datentipi ir svar\u012bgi. Ir ORM, kas saka, ka nav svar\u012bgi, k\u0101ds ir NULL, lai b\u016btu kaut k\u0101ds. Ja tas ir Int, m\u0113s sak\u0101m setInt. Bet, ja tas ir NULL, tad lai vienm\u0113r b\u016btu VARCHAR. Un k\u0101da j\u0113ga, galu gal\u0101, ir tur NULL? Datub\u0101ze pati to saprat\u012bs. Un t\u0101da aina nedarbojas. <\/p>\n<p><\/p>\n<p>Praks\u0113 datub\u0101z\u0113m piln\u012bgi nav vienaldz\u012bgi. <strong>Ja j\u016bs pirmaj\u0101 reiz\u0113 teic\u0101t, ka tas jums ir skaitlis, bet otraj\u0101 reiz\u0113 teic\u0101t, ka tas ir VARCHAR, tad nav iesp\u0113jams atk\u0101rtoti izmantot Server-prepared statements. Un t\u0101d\u0101 gad\u012bjum\u0101 mums ir j\u0101izveido m\u016bsu statements no jauna.<\/strong><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL un JDBC: izspie\u017eam visu, ko varam. Vladimirs Sit\u0146ikovs\" src=\"\/wp-content\/uploads\/2020\/05\/552d9c2e25cf9abbdfef12c98d027740.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ja j\u016bs izpild\u0101t vienu un to pa\u0161u piepras\u012bjumu, jums ir j\u0101p\u0101rliecin\u0101s, ka datentipi kolonn\u0101s nav sajaukti. J\u0101seko l\u012bdzi NULL. Tas ir bie\u017ea k\u013c\u016bda, kas mums rad\u0101s p\u0113c tam, kad s\u0101k\u0101m izmantot PreparedStatements.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL un JDBC: izspie\u017eam visu, ko varam. Vladimirs Sit\u0146ikovs\" src=\"\/wp-content\/uploads\/2020\/05\/5d73c8f5dfa281c3bda962fc3e5edd84.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Labi, iesl\u0113dz\u0101m. Pa\u0146\u0113m\u0101m, varb\u016bt, draiveri. Un veiktsp\u0113ja nokrit\u0101s. Viss k\u013cuva slikti. <\/p>\n<p><\/p>\n<p>K\u0101 tas var notikt? Vai t\u0101 ir k\u013c\u016bda vai funkcija? Diem\u017e\u0113l man neizdev\u0101s saprast \u2013 vai t\u0101 ir k\u013c\u016bda vai funkcija. Bet ir diezgan vienk\u0101r\u0161s scen\u0101rijs, k\u0101 reproduc\u0113t \u0161o probl\u0113mu. T\u0101 m\u016bs negaid\u012bti pie\u0137\u0113ra. Un t\u0101 sast\u0101v no izv\u0113les burtiski no vienas tabulas. Mums, protams, t\u0101du piepras\u012bjumu bija vair\u0101k. Tie parasti ietver divas-tr\u012bs tabulas, bet ir \u0161\u0101ds reproduc\u0113\u0161anas scen\u0101rijs. \u0145emiet k\u0101d\u0101 j\u016bsu datub\u0101zes versij\u0101 un reproduc\u0113jiet.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL un JDBC: izspie\u017eam visu, ko varam. Vladimirs Sit\u0146ikovs\" src=\"\/wp-content\/uploads\/2020\/05\/fa0fdd037c2eaa31667d5a527bb71f9c.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/gist.github.com\/vlsi\/df08cbef370b2e86a5c1\">https:\/\/gist.github.com\/vlsi\/df08cbef370b2e86a5c1<\/a><\/noindex><\/p>\n<p><\/p>\n<p>J\u0113ga ir t\u0101da, ka mums ir divas kolonnas, katra no kur\u0101m ir indeks\u0113ta. Vien\u0101 kolonn\u0101 p\u0113c NULL v\u0113rt\u012bbas ir miljonu rindu. Bet otraj\u0101 kolonn\u0101 ir tikai 20 rindu. Kad m\u0113s izpild\u0101m bez saist\u012btajiem main\u012bgajiem, viss darbojas labi. <\/p>\n<p><\/p>\n<p>Ja m\u0113s s\u0101ksim izpild\u012bt ar saist\u012btajiem main\u012bgajiem, t. i., m\u0113s izpild\u0101m z\u012bmi \u00ab?\u00bb vai \u00ab$1\u00bb m\u016bsu piepras\u012bjumam, tad ko m\u0113s beig\u0101s ieg\u016bstam?<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL un JDBC: izspie\u017eam visu, ko varam. Vladimirs Sit\u0146ikovs\" src=\"\/wp-content\/uploads\/2020\/05\/e91c397796c7ddcbade3bc090719e9d1.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/gist.github.com\/vlsi\/df08cbef370b2e86a5c1\">https:\/\/gist.github.com\/vlsi\/df08cbef370b2e86a5c1<\/a><\/noindex><\/p>\n<p><\/p>\n<p>Pirmais izpild\u012bjums \u2013 k\u0101 pien\u0101kas. Otrais \u2013 nedaudz \u0101tr\u0101k. Da\u017ei dati ir ke\u0161oti. Tre\u0161ais, ceturtais, piektais. P\u0113c tam \u2013 hop \u2013 un t\u0101 k\u0101. Un slikt\u0101k\u0101 lieta ir, ka tas notiek sestaj\u0101 izpild\u012bjum\u0101. Kur\u0161 zin\u0101ja, ka tie\u0161i se\u0161i izpild\u012bjumi ir nepiecie\u0161ami, lai saprastu, k\u0101ds ir re\u0101lais izpildes pl\u0101ns?<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL un JDBC: izspie\u017eam visu, ko varam. Vladimirs Sit\u0146ikovs\" src=\"\/wp-content\/uploads\/2020\/05\/893c955bc1e2e15a6986690e516f72a9.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Kas pie vainas? Kas notika? Datu b\u0101ze satur optimiz\u0101ciju. Un t\u0101 it k\u0101 ir optimiz\u0113ta visp\u0101r\u012bgajam gad\u012bjumam. Attiec\u012bgi, s\u0101kot no k\u0101da br\u012b\u017ea, t\u0101 p\u0101riet uz visp\u0101r\u012bgu pl\u0101nu, kas, diem\u017e\u0113l, var izr\u0101d\u012bties cits. Tas var b\u016bt t\u0101ds pats, bet var b\u016bt ar\u012b cits. Un tur ir kaut k\u0101da sliek\u0161\u0146a v\u0113rt\u012bba, kas noved pie \u0161\u0101da uzved\u012bbas mode\u013ca. <\/p>\n<p><\/p>\n<p>Ko ar to var dar\u012bt? \u0160eit, protams, ir gr\u016bt\u0101k kaut ko pie\u0146\u0113m\u0113t. Ir vienk\u0101r\u0161a risin\u0101juma, ko m\u0113s izmantojam. Tas ir +0, OFFSET 0. Dro\u0161i vien jums ir paz\u012bstami \u0161\u0101di risin\u0101jumi. M\u0113s vienk\u0101r\u0161i \u0146emam un piepras\u012bjum\u0101 pievienojam \u201e+0\u201d, un viss ir labi. R\u0101d\u012b\u0161u v\u0113l\u0101k. <\/p>\n<p><\/p>\n<p>Un ir v\u0113l viens variants \u2013 uzman\u012bg\u0101k apl\u016bkot pl\u0101nus. Izstr\u0101d\u0101t\u0101jam j\u0101sp\u0113j ne tikai uzrakst\u012bt piepras\u012bjumu, bet ar\u012b 6 reizes teikt \u201eexplain analyze\u201d. Ja 5, tad neder\u0113s. <\/p>\n<p><\/p>\n<p>Ir v\u0113l tre\u0161ais variants \u2013 uzrakst\u012bt v\u0113stuli pgsql-hackers. Es uzrakst\u012bju, bet pagaid\u0101m nav skaidrs \u2013 vai tas ir bug vai feature.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL un JDBC: izspie\u017eam visu, ko varam. Vladimirs Sit\u0146ikovs\" src=\"\/wp-content\/uploads\/2020\/05\/8dc8d3a78e0b794e1ceba20f6ca914ae.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/gist.github.com\/vlsi\/df08cbef370b2e86a5c1\">https:\/\/gist.github.com\/vlsi\/df08cbef370b2e86a5c1<\/a><\/noindex><\/p>\n<p><\/p>\n<p>Kam\u0113r m\u0113s dom\u0101jam \u2013 vai tas ir bug vai feature, lai to nov\u0113rstu. Pa\u0146emsim m\u016bsu piepras\u012bjumu un pievienosim \u201e+0\u201d. Viss ir labi. Divi simboli un pat nav j\u0101dom\u0101, k\u0101 tur ir. \u013boti vienk\u0101r\u0161i. M\u0113s vienk\u0101r\u0161i aizliedzam datu b\u0101zei izmantot indeksu \u0161aj\u0101 kolonn\u0101. Mums nav indeksa kolonnai \u201e+0\u201d un viss, datu b\u0101ze neizmanto indeksu, viss ir labi. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL un JDBC: izspie\u017eam visu, ko varam. Vladimirs Sit\u0146ikovs\" src=\"\/wp-content\/uploads\/2020\/05\/5261d80d084786a15b9764f6367014cd.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u0160is ir 6 \u201eexplain\u201d noteikums. Tagad pa\u0161reiz\u0113j\u0101s versij\u0101s nepiecie\u0161ams veikt 6 reizes, ja jums ir saist\u012bt\u0101s main\u012bg\u0101s. Ja nav saist\u012bto main\u012bgo, tad m\u0113s r\u012bkojamies t\u0101. Gal\u0101 tie\u0161i \u0161is piepras\u012bjums sabr\u016bk. Nekas sare\u017e\u0123\u012bts.<\/p>\n<p><\/p>\n<p>Izklaus\u0101s, cik ilgi var? \u0160eit ir bug, tur ir bug. Paties\u012bb\u0101 bug ir visur. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL un JDBC: izspie\u017eam visu, ko varam. Vladimirs Sit\u0146ikovs\" src=\"\/wp-content\/uploads\/2020\/05\/674dc7e7b4624baa5c79eee9e1e89db0.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Paskat\u012bsimies v\u0113l. Piem\u0113ram, mums ir divas sh\u0113mas. Sh\u0113ma A ar tabulu Y un sh\u0113ma B ar tabulu Y. Piepras\u012bjums \u2013 izv\u0113l\u0113ties datus no tabulas. Ko m\u0113s \u0161aj\u0101 gad\u012bjum\u0101 sa\u0146emsim? Mums b\u016bs k\u013c\u016bda. Mums b\u016bs viss iepriek\u0161 min\u0113tais. Noteikums ir t\u0101ds \u2013 bug visur, mums b\u016bs viss iepriek\u0161 min\u0113tais.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL un JDBC: izspie\u017eam visu, ko varam. Vladimirs Sit\u0146ikovs\" src=\"\/wp-content\/uploads\/2020\/05\/dd6f544bb9e930c39e36523c9afe6003.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Tagad jaut\u0101jums: \u201eK\u0101p\u0113c?\u201d. Izskat\u0101s, ka ir dokument\u0101cija, ka, ja mums ir sh\u0113ma, tad ir main\u012bgais \u201esearch_path\u201d, kas nosaka, kur j\u0101mekl\u0113 tabula. Izskat\u0101s, ka main\u012bgais ir.<\/p>\n<p><\/p>\n<p>Kas ir probl\u0113ma? Probl\u0113ma ir t\u0101da, ka servera sagatavotie piepras\u012bjumi nepamana, ka search_path var k\u0101ds main\u012bt. \u0160\u012b v\u0113rt\u012bba paliek it k\u0101 konstanta datu b\u0101zei. Un da\u017eas da\u013cas var nenok\u013c\u016bt pie jaun\u0101m v\u0113rt\u012bb\u0101m. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL un JDBC: izspie\u017eam visu, ko varam. Vladimirs Sit\u0146ikovs\" src=\"\/wp-content\/uploads\/2020\/05\/f738301606d84d72bfa7cc5b568c0df8.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Protams, tas atkar\u012bgs no versijas, kur\u0101 j\u016bs veicat testus. Tas ir atkar\u012bgs no t\u0101, cik \u013coti at\u0161\u0137iras j\u016bsu tabulas. Versija 9.1 vienk\u0101r\u0161i izpild\u012bs vecos piepras\u012bjumus. Jaun\u0101k\u0101s versijas var paman\u012bt mu\u013c\u0137\u012bbas un teikt, ka jums ir k\u013c\u016bda.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL un JDBC: izspie\u017eam visu, ko varam. Vladimirs Sit\u0146ikovs\" src=\"\/wp-content\/uploads\/2020\/05\/4761cd92835b94acbf9d6c9d21817316.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/www.postgresql.org\/message-id\/CAB=Je-GQOW7kU9Hn3AqP1vhaZg_wE9Lz6F4jSp-7cm9_M6DyVA@mail.gmail.com\">Set search_path + server-prepared statements =<br \/>\nke\u0161ot\u0101 pl\u0101na rezult\u0101tu tips nedr\u012bkst main\u012bties<\/a><\/noindex><\/p>\n<p><\/p>\n<p>K\u0101 \u0161o atrisin\u0101t? Ir vienk\u0101r\u0161a recepte \u2013 nedariet t\u0101. Nav j\u0101maina search_path lietojumprogrammas darb\u012bb\u0101. Ja j\u016bs to main\u0101t, tad lab\u0101k izveidojiet jaunu savienojumu.<\/p>\n<p><\/p>\n<p>Varam par to parun\u0101t, t.i., atv\u0113rt, apspriest, papildin\u0101t. Varb\u016bt p\u0101rliecin\u0101sim datub\u0101zes izstr\u0101d\u0101t\u0101jus, ka gad\u012bjum\u0101, ja k\u0101ds maina v\u0113rt\u012bbu, datub\u0101zei par to j\u0101zi\u0146o klientam: \u201eSkatieties, jums te v\u0113rt\u012bba ir atjaunin\u0101ta. Varb\u016bt jums vajadz\u0113tu atiestat\u012bt, p\u0101rveidot statements?\u201c. \u0160obr\u012bd datub\u0101ze sevi sl\u0113pti uzved un nek\u0101d\u0101 veid\u0101 nezi\u0146o, ka kaut kur iek\u0161\u0101 statements ir main\u012bju\u0161\u0101s. <\/p>\n<p><\/p>\n<p>Un es atkal uzsv\u0113r\u0161u \u2013 tas nav tipiski Java. T\u0101pat m\u0113s redz\u0113sim PL\/pgSQL vien\u0101 un taj\u0101 pa\u0161\u0101. Bet tur tas tiks atk\u0101rtots.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL un JDBC: izspie\u017eam visu, ko varam. Vladimirs Sit\u0146ikovs\" src=\"\/wp-content\/uploads\/2020\/05\/a4e7b201d0c0aa4a0092d2b6ff152df7.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u013baujiet mums m\u0113\u0123in\u0101t v\u0113lreiz izv\u0113l\u0113ties datus. Izv\u0113lamies \u2013 izv\u0113lamies. Mums ir tabula ar miljonu rindu. Katras rindi\u0146as izm\u0113rs ir viens kilobaits. Aptuveni gigabaits datu. Un mums ir darba atmi\u0146a Java ma\u0161\u012bnai 128 megabaiti. <\/p>\n<p><\/p>\n<p>M\u0113s, k\u0101 ieteikts vis\u0101s gr\u0101mat\u0101s, izmantojam pl\u016bsmu apstr\u0101di. T.i., m\u0113s atveram resultSet un pak\u0101peniski las\u0101m datus no t\u0101. Vai tas darbosies? Vai tas neizkritis no atmi\u0146as? Vai tas las\u012bs pak\u0101peniski? \u013bausimies tic\u0113t datub\u0101zei, tic\u0113sim Postgres. Netic\u0113sim. Izkrit\u012bs OutOFMemory? Kam ir bijusi OutOfMemory? Un kas sp\u0113ja to salabot? K\u0101ds sp\u0113ja to salabot. <\/p>\n<p><\/p>\n<p>Ja jums ir miljons rindu, tad nevar vienk\u0101r\u0161i izv\u0113l\u0113ties. Ir oblig\u0101ti j\u0101izmanto OFFSET\/LIMIT. Kas ir par t\u0101du variantu? Un kas par variantu, ka j\u0101sp\u0113l\u0113jas ar autoCommit? <\/p>\n<p><\/p>\n<p>\u0160eit, k\u0101 parasti, visneparedzam\u0101kais variants izr\u0101d\u0101s pareizs. Un, ja j\u016bs p\u0113k\u0161\u0146i izsl\u0113gsiet autoCommit, tas pal\u012bdz\u0113s. K\u0101p\u0113c t\u0101? Par to zin\u0101tne nav inform\u0113ta. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL un JDBC: izspie\u017eam visu, ko varam. Vladimirs Sit\u0146ikovs\" src=\"\/wp-content\/uploads\/2020\/05\/2e5d9d2a8450a9069155de86a8ec387a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Bet p\u0113c noklus\u0113juma visi klienti, kas piesl\u0113dzas Postgres datub\u0101zei, izv\u0113las datus piln\u012bb\u0101. PgJDBC \u0161aj\u0101 zi\u0146\u0101 nav iz\u0146\u0113mums, izv\u0113las visas rindas.<\/p>\n<p><\/p>\n<p>Ir vari\u0101cija par t\u0113mu FetchSize, t.i., var uz atsevi\u0161\u0137a statements l\u012bme\u0146a pateikt, ka \u0161eit, l\u016bdzu, izv\u0113lieties datus pa 10, 50. Bet tas nedarbojas, l\u012bdz j\u016bs neizsl\u0113dziet autoCommit. Nolikts autoCommit \u2013 s\u0101k darboties. <\/p>\n<p><\/p>\n<p>Tom\u0113r, staig\u0101t pa kodu un visur iestat\u012bt setFetchSize \u2013 tas ir ne\u0113rti. T\u0101p\u0113c m\u0113s izveidoj\u0101m iestat\u012bjumu, kas visai savienojumam nor\u0101da noklus\u0113juma v\u0113rt\u012bbu.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL un JDBC: izspie\u017eam visu, ko varam. Vladimirs Sit\u0146ikovs\" src=\"\/wp-content\/uploads\/2020\/05\/c9ac8e483dc6bfdbbc300972ee1ab1e0.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>M\u0113s to esam izteiku\u0161i. Iestat\u012bj\u0101m parametru. Un ko m\u0113s pan\u0101c\u0101m? Ja izv\u0113lamies maz, piem\u0113ram, pa 10 rind\u0101m, tad mums ir diezgan lielas izmaksas. T\u0101p\u0113c \u0161ai v\u0113rt\u012bbai j\u0101b\u016bt ap simtu. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL un JDBC: izspie\u017eam visu, ko varam. Vladimirs Sit\u0146ikovs\" src=\"\/wp-content\/uploads\/2020\/05\/073e7a4af63688396eefe332ba8261d6.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ide\u0101l\u0101 gad\u012bjum\u0101, protams, ar\u012b vajadz\u0113tu iem\u0101c\u012bties ierobe\u017eot byte skait\u0101, bet recepte ir \u0161\u0101da: iestat\u0101m defaultRowFetchSize virs simta un priec\u0101jamies. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL un JDBC: izspie\u017eam visu, ko varam. Vladimirs Sit\u0146ikovs\" src=\"\/wp-content\/uploads\/2020\/05\/e3078faf2078fcaec10d6d99872a9990.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>P\u0101rl\u016bkosim datu ievieto\u0161anu. Ievieto\u0161ana ir viegla, tur ir da\u017e\u0101di varianti. Piem\u0113ram, INSERT, VALUES. Tas ir labs variants. Var teikt 'INSERT SELECT'. Praks\u0113 tas ir tas pats. Nav nek\u0101das at\u0161\u0137ir\u012bbas veiktsp\u0113j\u0101. <\/p>\n<p><\/p>\n<p>Gr\u0101matas saka, ka j\u0101izpilda Batch statements, gr\u0101matas saka, ka var izpild\u012bt sare\u017e\u0123\u012bt\u0101kas komandas ar vair\u0101k\u0101m iekav\u0101m. Un Postgres ir lieliska funkcija \u2013 var veikt COPY, t. i., dar\u012bt to \u0101tr\u0101k. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL un JDBC: izspie\u017eam visu, ko varam. Vladimirs Sit\u0146ikovs\" src=\"\/wp-content\/uploads\/2020\/05\/4d281c9515bdf8de7fbf1e9922d192d0.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ja m\u0113ram, var atkl\u0101t da\u017eas interesantas lietas. K\u0101 m\u0113s v\u0113lamies, lai tas darbotos? V\u0113lamies neizpild\u012bt liekas komandas un nep\u0101rl\u016bkot. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL un JDBC: izspie\u017eam visu, ko varam. Vladimirs Sit\u0146ikovs\" src=\"\/wp-content\/uploads\/2020\/05\/7b2e4343c51dab3ddb6919bf0f117c4d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Praks\u0113 TCP mums to nedod. Ja klients ir aiz\u0146emts ar piepras\u012bjuma s\u016bt\u012b\u0161anu, datub\u0101ze, m\u0113\u0123inot nos\u016bt\u012bt mums atbildes, piepras\u012bjumus nenolas\u012bs. Rezult\u0101t\u0101 klients gaida, kam\u0113r datub\u0101ze nolas\u012bs piepras\u012bjumu, un datub\u0101ze gaida klientu, kam\u0113r vi\u0146\u0161 nolas\u012bs atbildi. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL un JDBC: izspie\u017eam visu, ko varam. Vladimirs Sit\u0146ikovs\" src=\"\/wp-content\/uploads\/2020\/05\/17a062c30ddd83cb890775ec1722044f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>T\u0101p\u0113c klients spiests regul\u0101ri s\u016bt\u012bt sinhroniz\u0101cijas paketes. Liekas liekas t\u012bkla mijiedarb\u012bbas, lieka laika zaud\u0113\u0161ana.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL un JDBC: izspie\u017eam visu, ko varam. Vladimirs Sit\u0146ikovs\" src=\"\/wp-content\/uploads\/2020\/05\/ae7a4f32e2949c1d0550da051937de02.jpg\" style=\"display:block;margin: 0 auto;\" \/>Un jo vair\u0101k m\u0113s t\u0101s pievienojam, jo slikt\u0101k tas k\u013c\u016bst. Draiveris ir diezgan pesimistisks un pievieno t\u0101s sam\u0113r\u0101 bie\u017ei, apm\u0113ram reizi 200 rind\u0101s, atkar\u012bb\u0101 no rindu izm\u0113ra utt. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL un JDBC: izspie\u017eam visu, ko varam. Vladimirs Sit\u0146ikovs\" src=\"\/wp-content\/uploads\/2020\/05\/82b1d597986633a8c4b7952517ca6477.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/pgjdbc\/pgjdbc\/pull\/380\">https:\/\/github.com\/pgjdbc\/pgjdbc\/pull\/380<\/a><\/noindex><\/p>\n<p><\/p>\n<p>Gad\u0101s, ka izlabojat tikai vienu rindu un viss pa\u0101trin\u0101s desmitk\u0101rt\u012bgi. Tas notiek. K\u0101p\u0113c? K\u0101 parasti, k\u0101da konstante jau bija izmantota. Un v\u0113rt\u012bba '128' noz\u012bm\u0113ja \u2013 neizmantot batching.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL un JDBC: izspie\u017eam visu, ko varam. Vladimirs Sit\u0146ikovs\" src=\"\/wp-content\/uploads\/2020\/05\/7b6bcd95591b36441037b4c4631d2ad0.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"http:\/\/openjdk.java.net\/projects\/code-tools\/jmh\/\">Java microbenchmark harness<\/a><\/noindex><\/p>\n<p><\/p>\n<p>Labi, ka tas neiek\u013cuva ofici\u0101laj\u0101 versij\u0101. M\u0113s to atkl\u0101j\u0101m pirms izlaides. Visas v\u0113rt\u012bbas, ko es min\u0113ju, balst\u0101s uz m\u016bsdienu versij\u0101m. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL un JDBC: izspie\u017eam visu, ko varam. Vladimirs Sit\u0146ikovs\" src=\"\/wp-content\/uploads\/2020\/05\/28c82d9e11f6bdaf3cf62b49fc074d68.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>P\u0101rm\u0113ram. M\u0113s m\u0113ram InsertBatch vienk\u0101r\u0161i. M\u0113s m\u0113ram InsertBatch vair\u0101kk\u0101rt\u0113ju, t. i., to pa\u0161u, bet v\u0113rt\u012bbu ir daudz. Vilt\u012bgs g\u0101jiens. Ne visi t\u0101 prot, bet tas ir vienk\u0101r\u0161s g\u0101jiens, krietni viegl\u0101k nek\u0101 COPY.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL un JDBC: izspie\u017eam visu, ko varam. Vladimirs Sit\u0146ikovs\" src=\"\/wp-content\/uploads\/2020\/05\/72f7cf6c3b9d9175d3e5a6d5410fe209.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Var veikt COPY.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL un JDBC: izspie\u017eam visu, ko varam. Vladimirs Sit\u0146ikovs\" src=\"\/wp-content\/uploads\/2020\/05\/2b0d8bbcc50f1293c9a8a1eb8eb70d2e.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Un var to dar\u012bt strukt\u016br\u0101s. Pazi\u0146ojiet par User default type, nododiet mas\u012bvu un INSERT tie\u0161i tabul\u0101. <\/p>\n<p><\/p>\n<p>Ja atv\u0113rsiet saiti: pgjdbc\/ubenchmsrk\/InsertBatch.java, \u0161is kods ir pieejams GitHub. Varat apskat\u012bt, k\u0101di tie\u0161i vaic\u0101jumi tiek \u0123ener\u0113ti. Tas nav galvenais.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL un JDBC: izspie\u017eam visu, ko varam. Vladimirs Sit\u0146ikovs\" src=\"\/wp-content\/uploads\/2020\/05\/28dede211fe401286685ca62081453de.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>M\u0113s esam palaidu\u0161i. Un pirmais, ko saprat\u0101m, ir tas, ka nemit\u012bga grup\u0113\u0161ana \u2013 tas ir vienk\u0101r\u0161i nepie\u0146emami. Visi grup\u0113\u0161anas varianti ir vien\u0101di ar nulli, t. i., izpildes laiks praktiski ir vien\u0101ds ar nulli sal\u012bdzin\u0101jum\u0101 ar vienreiz\u0113ju izpildi. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL un JDBC: izspie\u017eam visu, ko varam. Vladimirs Sit\u0146ikovs\" src=\"\/wp-content\/uploads\/2020\/05\/4ea68f712bbdeadd35f5baa4ddaeff33.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>M\u0113s ievietojam datus. Tur ir \u013coti vienk\u0101r\u0161a tabula. Tr\u012bs kolonnas. Un ko m\u0113s \u0161eit redzam? M\u0113s redzam, ka visi tr\u012bs varianti ir aptuveni sal\u012bdzin\u0101mi. Un COPY, protams, ir lab\u0101ks.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL un JDBC: izspie\u017eam visu, ko varam. Vladimirs Sit\u0146ikovs\" src=\"\/wp-content\/uploads\/2020\/05\/2686f1d7eea347a839ac23aef2a27e53.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Tas ir tad, kad m\u0113s ievietojam pa da\u013c\u0101m. Kad m\u0113s run\u0101j\u0101m, ka viena v\u0113rt\u012bba VALUES, divas v\u0113rt\u012bbas VALUES, tr\u012bs v\u0113rt\u012bbas VALUES, vai m\u0113s t\u0101s 10 nor\u0101d\u012bj\u0101m ar komatu. Tas ir tie\u0161i \u0161obr\u012bd pa horizont\u0101li. 1, 2, 4, 128. Var redz\u0113t, ka Batch Insert, kas ir att\u0113lots zilaj\u0101 kr\u0101s\u0101, \u013coti atvieglo \u0161o uzdevumu. T. i., kad j\u016bs ievietojat pa vienai vai pat kad ievietojat pa \u010detriem, viss k\u013c\u016bst divas reizes lab\u0101k, tikai t\u0101p\u0113c, ka m\u0113s VALUES iek\u013c\u0101v\u0101m nedaudz vair\u0101k. Maz\u0101k EXECUTE oper\u0101ciju.<\/p>\n<p><\/p>\n<p>Izmantojot COPY mazajos apjomos \u2013 tas ir \u0101rk\u0101rt\u012bgi neefekt\u012bvi. Es pirmajos divos pat nenorakst\u012bju. Tie iet debes\u012bs, t. i., \u0161ie za\u013cie skait\u013ci COPY.<\/p>\n<p><\/p>\n<p>COPY j\u0101izmanto, kad jums datu apjoms ir vismaz vair\u0101k nek\u0101 simts rindas. P\u0101rliecino\u0161\u0101s izmaksas par savienojuma atv\u0113r\u0161anu ir lielas. Un, god\u012bgi sakot, \u0161aj\u0101 virzien\u0101 neesmu p\u0113t\u012bjis. Batch es esmu optimiz\u0113jis, COPY \u2013 n\u0113. <\/p>\n<p><\/p>\n<p>Ko m\u0113s dar\u0101m t\u0101l\u0101k? M\u0113s izm\u0113r\u0101m. Saprotam, ka j\u0101izmanto vai nu strukt\u016bras, vai ar\u012b vilt\u012bgs grup\u0113jums, kas apvieno vair\u0101kas v\u0113rt\u012bbas. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL un JDBC: izspie\u017eam visu, ko varam. Vladimirs Sit\u0146ikovs\" src=\"\/wp-content\/uploads\/2020\/05\/e02fa2574e2d1b678382db15064610d3.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ko j\u0101izce\u013c no \u0161odienas zi\u0146ojuma?<\/p>\n<p><\/p>\n<ul>\n<li>PreparedStatement \u2013 tas ir viss. Tas sniedz \u013coti daudz veiktsp\u0113jai. Tas dod lielu s\u012bkumain\u012bbu. <\/li>\n<li>Un ir j\u0101dara EXPLAIN ANALYZE 6 reizes.<\/li>\n<li>Un ir j\u0101at\u0161\u0137aida OFFSET 0 un triki, piem\u0113ram, +0, lai labotu atliku\u0161o procentu no m\u016bsu problem\u0101tiskajiem vaic\u0101jumiem.<\/li>\n<\/ul>\n<p>Avots: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/499794\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u043e\u0439 \u0434\u043e\u043a\u043b\u0430\u0434\u0430 \u043d\u0430\u0447\u0430\u043b\u0430 2016 \u0433\u043e\u0434\u0430 \u0412\u043b\u0430\u0434\u0438\u043c\u0438\u0440\u0430 \u0421\u0438\u0442\u043d\u0438\u043a\u043e\u0432\u0430 &quot;PostgreSQL \u0438 JDBC \u0432\u044b\u0436\u0438\u043c\u0430\u0435\u043c \u0432\u0441\u0435 \u0441\u043e\u043a\u0438&quot; \u0414\u043e\u0431\u0440\u044b\u0439 \u0434\u0435\u043d\u044c! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0412\u043b\u0430\u0434\u0438\u043c\u0438\u0440 \u0421\u0438\u0442\u043d\u0438\u043a\u043e\u0432. \u042f \u0440\u0430\u0431\u043e\u0442\u0430\u044e 10 \u043b\u0435\u0442 \u0432 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 NetCracker. \u0418 \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u044f \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0441\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e. \u0412\u0441\u0435, \u0447\u0442\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441 Java, \u0432\u0441\u0435, \u0447\u0442\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441 SQL \u2013 \u044d\u0442\u043e \u0442\u043e, \u0447\u0442\u043e \u044f \u043b\u044e\u0431\u043b\u044e. \u0418 \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":79894,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-79893","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.5 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u043e\u0439 \u0434\u043e\u043a\u043b\u0430\u0434\u0430 \u043d\u0430\u0447\u0430\u043b\u0430 2016 \u0433\u043e\u0434\u0430 \u0412\u043b\u0430\u0434\u0438\u043c\u0438\u0440\u0430 \u0421\u0438\u0442\u043d\u0438\u043a\u043e\u0432\u0430 &quot;PostgreSQL \u0438 JDBC \u0432\u044b\u0436\u0438\u043c\u0430\u0435\u043c \u0432\u0441\u0435 \u0441\u043e\u043a\u0438&quot;\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/lv\/blog\/administrirovanie\/postgresql-i-jdbc-vyzhimaem-vse-soki-vladimir-sitnikov\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.5\" \/>\n\t\t<meta property=\"og:locale\" content=\"lv_LV\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47PostgreSQL \u0438 JDBC \u0432\u044b\u0436\u0438\u043c\u0430\u0435\u043c \u0432\u0441\u0435 \u0441\u043e\u043a\u0438. \u0412\u043b\u0430\u0434\u0438\u043c\u0438\u0440 \u0421\u0438\u0442\u043d\u0438\u043a\u043e\u0432 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u043e\u0439 \u0434\u043e\u043a\u043b\u0430\u0434\u0430 \u043d\u0430\u0447\u0430\u043b\u0430 2016 \u0433\u043e\u0434\u0430 \u0412\u043b\u0430\u0434\u0438\u043c\u0438\u0440\u0430 \u0421\u0438\u0442\u043d\u0438\u043a\u043e\u0432\u0430 &quot;PostgreSQL \u0438 JDBC \u0432\u044b\u0436\u0438\u043c\u0430\u0435\u043c \u0432\u0441\u0435 \u0441\u043e\u043a\u0438&quot;\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/lv\/blog\/administrirovanie\/postgresql-i-jdbc-vyzhimaem-vse-soki-vladimir-sitnikov\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-05-01T11:43:12+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-05-01T11:43:12+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47PostgreSQL un JDBC izspie\u017eam visus sulas. Vladimirs Sit\u0146ikovs | ProHoster","description":"Aicinu iepaz\u012bties ar Vladimira Sitnikova 2016. gada zi\u0146ojuma \"PostgreSQL un JDBC: izspie\u017eam visu iesp\u0113jamo\" at\u0161ifr\u0113jumu.","canonical_url":"https:\/\/prohoster.info\/lv\/blog\/administrirovanie\/postgresql-i-jdbc-vyzhimaem-vse-soki-vladimir-sitnikov","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"lv_LV","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47PostgreSQL \u0438 JDBC \u0432\u044b\u0436\u0438\u043c\u0430\u0435\u043c \u0432\u0441\u0435 \u0441\u043e\u043a\u0438. \u0412\u043b\u0430\u0434\u0438\u043c\u0438\u0440 \u0421\u0438\u0442\u043d\u0438\u043a\u043e\u0432 | ProHoster","og:description":"\u041f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u043e\u0439 \u0434\u043e\u043a\u043b\u0430\u0434\u0430 \u043d\u0430\u0447\u0430\u043b\u0430 2016 \u0433\u043e\u0434\u0430 \u0412\u043b\u0430\u0434\u0438\u043c\u0438\u0440\u0430 \u0421\u0438\u0442\u043d\u0438\u043a\u043e\u0432\u0430 &quot;PostgreSQL \u0438 JDBC \u0432\u044b\u0436\u0438\u043c\u0430\u0435\u043c \u0432\u0441\u0435 \u0441\u043e\u043a\u0438&quot;","og:url":"https:\/\/prohoster.info\/lv\/blog\/administrirovanie\/postgresql-i-jdbc-vyzhimaem-vse-soki-vladimir-sitnikov","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-05-01T11:43:12+00:00","article:modified_time":"2020-05-01T11:43:12+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"79893","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 16:29:39","updated":"2022-10-10 00:32:43","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/posts\/79893","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/comments?post=79893"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/posts\/79893\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/media\/79894"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/media?parent=79893"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/categories?post=79893"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/tags?post=79893"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}