{"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\/sk\/blog\/administrirovanie\/postgresql-i-jdbc-vyzhimaem-vse-soki-vladimir-sitnikov","title":{"rendered":"PostgreSQL a JDBC \u2013 vy\u017em\u00fdkame v\u0161etko. Vladim\u00edr Sitnikov","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><strong>Odpor\u00fa\u010dam si pre\u010d\u00edta\u0165 preh\u013ead spr\u00e1vy z za\u010diatku roka 2016 od Vladim\u00edra Sitnikova \"PostgreSQL a JDBC: vytiahnite maximum\"<\/strong><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL a JDBC \u2013 vy\u017em\u00fdkame v\u0161etko. Vladim\u00edr Sitnikov\" 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 a JDBC \u2013 vy\u017em\u00fdkame v\u0161etko. Vladim\u00edr Sitnikov\" src=\"\/wp-content\/uploads\/2020\/05\/030666abda53aa388b1cb1d0c46a7524.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dobr\u00fd de\u0148! Vol\u00e1m sa Vladim\u00edr Sitnikov. Pracujem 10 rokov vo firme NetCracker. Hlavne sa zaober\u00e1m v\u00fdkonom. V\u0161etko, \u010do s\u00favis\u00ed s Javou, v\u0161etko, \u010do s\u00favis\u00ed so SQL \u2013 to je to, \u010do m\u00e1m r\u00e1d. <\/p>\n<p><\/p>\n<p>A dnes v\u00e1m poviem o tom, s \u010d\u00edm sme sa v spolo\u010dnosti stretli, ke\u010f sme za\u010dali pou\u017e\u00edva\u0165 PostgreSQL ako datab\u00e1zov\u00fd server. A v\u00e4\u010d\u0161inou pracujeme s Javou. Ale to, o \u010dom dnes hovor\u00edm, nes\u00favis\u00ed len s Javou. Ako prax uk\u00e1zala, objavuje sa to aj v in\u00fdch jazykoch. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL a JDBC \u2013 vy\u017em\u00fdkame v\u0161etko. Vladim\u00edr Sitnikov\" src=\"\/wp-content\/uploads\/2020\/05\/b01a214d782c7e32797a6c6466457979.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Budeme hovori\u0165 o:<\/p>\n<p><\/p>\n<ul>\n<li>v\u00fdbere \u00fadajov. <\/li>\n<li>Ulo\u017een\u00ed \u00fadajov. <\/li>\n<li>A taktie\u017e o v\u00fdkone. <\/li>\n<li>A o skryt\u00fdch n\u00e1strah\u00e1ch, ktor\u00e9 tam s\u00fa zakopan\u00e9. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL a JDBC \u2013 vy\u017em\u00fdkame v\u0161etko. Vladim\u00edr Sitnikov\" src=\"\/wp-content\/uploads\/2020\/05\/57da0c6aa4bb62e1beb77160f5aee7e7.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Za\u010dnime s jednoduchou ot\u00e1zkou. Vyber\u00e1me jeden riadok z tabu\u013eky pod\u013ea prim\u00e1rneho k\u013e\u00fa\u010da. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL a JDBC \u2013 vy\u017em\u00fdkame v\u0161etko. Vladim\u00edr Sitnikov\" src=\"\/wp-content\/uploads\/2020\/05\/d5fcb1172aef402a87064498bf8a5218.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Datab\u00e1za sa nach\u00e1dza na tom istom hostite\u013eovi. A cel\u00e9 toto trv\u00e1 20 milisek\u00fand.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL a JDBC \u2013 vy\u017em\u00fdkame v\u0161etko. Vladim\u00edr Sitnikov\" src=\"\/wp-content\/uploads\/2020\/05\/103b7f9736b82a3313491b2f0d2a5824.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>T\u00fdch 20 milisek\u00fand je ve\u013emi ve\u013ea. Ak m\u00e1te tak\u00fdch 100 dopytov, tak miniete \u010das na sekundu na to, aby ste tieto dopyty spravili, t. j. prem\u00e1rnime \u010das.<\/p>\n<p><\/p>\n<p>Toto neradi rob\u00edme a sledujeme, \u010do n\u00e1m pon\u00faka datab\u00e1za. Datab\u00e1za n\u00e1m pon\u00faka dve mo\u017enosti vykon\u00e1vania dopytov. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL a JDBC \u2013 vy\u017em\u00fdkame v\u0161etko. Vladim\u00edr Sitnikov\" src=\"\/wp-content\/uploads\/2020\/05\/b467e86a0f8c4c32cea182fe27a28e6e.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Prv\u00e1 mo\u017enos\u0165 \u2013 to je jednoduch\u00fd dopyt. V \u010dom je dobr\u00fd? V tom, \u017ee ho vezmeme a po\u0161leme, a ni\u010d viac. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL a JDBC \u2013 vy\u017em\u00fdkame v\u0161etko. Vladim\u00edr Sitnikov\" 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>Datab\u00e1za m\u00e1 e\u0161te aj roz\u0161\u00edren\u00fd dopyt, ktor\u00fd je rafinovanej\u0161\u00ed, ale funk\u010dnej\u0161\u00ed. M\u00f4\u017eete posiela\u0165 dopyty na anal\u00fdzu, vykon\u00e1vanie, prepojenie premenn\u00fdch at\u010f. <\/p>\n<p><\/p>\n<p>Super roz\u0161\u00edren\u00fd dopyt \u2013 to je to, \u010do nebudeme pokr\u00fdva\u0165 v aktu\u00e1lnej prezent\u00e1cii. Mo\u017eno m\u00e1me nie\u010do, \u010do chceme od datab\u00e1zy, a existuje tak\u00fd zoznam prian\u00ed, ktor\u00fd je v nejakom form\u00e1te formulovan\u00fd, t. j. to je to, \u010do chceme, ale moment\u00e1lne a v najbli\u017e\u0161om roku to nie je mo\u017en\u00e9. Preto sme to jednoducho zap\u00edsali a budeme chodi\u0165, aby sme presved\u010dili hlavn\u00fdch \u013eud\u00ed.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL a JDBC \u2013 vy\u017em\u00fdkame v\u0161etko. Vladim\u00edr Sitnikov\" src=\"\/wp-content\/uploads\/2020\/05\/19094729074fd28c5b9f236833a9a266.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ale to, \u010do m\u00f4\u017eeme urobi\u0165, s\u00fa jednoduch\u00fd dopyt a roz\u0161\u00edren\u00fd dopyt.<\/p>\n<p><\/p>\n<p>Ak\u00e1 je \u0161pecifik\u00e1cia ka\u017ed\u00e9ho pr\u00edstupu? <\/p>\n<p><\/p>\n<p>Jednoduch\u00fd dopyt je dobr\u00e9 pou\u017ei\u0165 na jednorazov\u00e9 vykonanie. Raz ho vykon\u00e1te a zabudnete. Probl\u00e9m je, \u017ee nepodporuje bin\u00e1rny form\u00e1t \u00fadajov, t. j. na niektor\u00e9 vysoko v\u00fdkonn\u00e9 syst\u00e9my sa nehod\u00ed.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL a JDBC \u2013 vy\u017em\u00fdkame v\u0161etko. Vladim\u00edr Sitnikov\" src=\"\/wp-content\/uploads\/2020\/05\/062c0e45cefd91ece331a306a7651bde.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Roz\u0161\u00edren\u00e9 dopyty \u2013 \u0161etria \u010das pri parsovan\u00ed. To je to, \u010do sme urobili a za\u010dali pou\u017e\u00edva\u0165. Ve\u013emi n\u00e1m to pomohlo. Nie je to len \u00faspora na parsovan\u00ed. Je aj \u00faspora na prenosu d\u00e1t. Pren\u00e1\u0161a\u0165 d\u00e1ta v bin\u00e1rnom form\u00e1te je ove\u013ea efekt\u00edvnej\u0161ie. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL a JDBC \u2013 vy\u017em\u00fdkame v\u0161etko. Vladim\u00edr Sitnikov\" src=\"\/wp-content\/uploads\/2020\/05\/6df83a2f3736568668cf9d74de5d9758.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Prejdime k praxi. Takto vyzer\u00e1 typick\u00e1 aplik\u00e1cia. M\u00f4\u017ee to by\u0165 Java a podobne. <\/p>\n<p><\/p>\n<p>Vytvorili sme statement. Vykonali sme pr\u00edkaz. Vytvorili sme close. Kde je tu chyba? Ak\u00fd je probl\u00e9m? \u017diadny probl\u00e9m. Tak je nap\u00edsan\u00e9 vo v\u0161etk\u00fdch knih\u00e1ch. Takto sa to m\u00e1 p\u00edsa\u0165. Ak chcete maxim\u00e1lny v\u00fdkon, p\u00ed\u0161te tak. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL a JDBC \u2013 vy\u017em\u00fdkame v\u0161etko. Vladim\u00edr Sitnikov\" src=\"\/wp-content\/uploads\/2020\/05\/6923293946dec45b3fd508235728ab95.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ale prax uk\u00e1zala, \u017ee to nefunguje. Pre\u010do? Preto\u017ee m\u00e1me met\u00f3du \u201eclose\u201c. A ke\u010f to rob\u00edme takto, pre datab\u00e1zu to vyzer\u00e1 \u2013 je to ako pr\u00e1ca faj\u010diara s datab\u00e1zou. Povedali sme \u201ePARSE EXECUTE DEALLOCATE\u201c.<\/p>\n<p><\/p>\n<p>Pre\u010do tieto zbyto\u010dn\u00e9 vytvorenia a uvo\u013enenie statements? Nikomu nie s\u00fa potrebn\u00e9. Ale zvy\u010dajne v PreparedStatement sa to tak deje, ke\u010f ich zatv\u00e1rame, uzatv\u00e1raj\u00fa v\u0161etko v datab\u00e1ze. To nie je to, \u010do chceme. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL a JDBC \u2013 vy\u017em\u00fdkame v\u0161etko. Vladim\u00edr Sitnikov\" src=\"\/wp-content\/uploads\/2020\/05\/5a357a209e414024c437d042f600f251.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Chceme, aby sme s datab\u00e1zou pracovali ako zdrav\u00ed \u013eudia. Jedenkr\u00e1t sme vzali a pripravili n\u00e1\u0161 statement, potom ho vykon\u00e1vame mnohokr\u00e1t. V skuto\u010dnosti mnohokr\u00e1t \u2013 to je jedenkr\u00e1t za cel\u00fa existenciu aplik\u00e1cie, kedy sme ho parsovali. A na r\u00f4znych REST pou\u017e\u00edvame ten ist\u00fd statement id. Toto je n\u00e1\u0161 cie\u013e. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL a JDBC \u2013 vy\u017em\u00fdkame v\u0161etko. Vladim\u00edr Sitnikov\" src=\"\/wp-content\/uploads\/2020\/05\/ac4aed702a624ad9f9addc4362daf760.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ako to dosiahnu\u0165? <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL a JDBC \u2013 vy\u017em\u00fdkame v\u0161etko. Vladim\u00edr Sitnikov\" src=\"\/wp-content\/uploads\/2020\/05\/0f101d890d1a2af8e99f8a3a8a06fd5a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ve\u013emi jednoducho \u2013 netreba zatv\u00e1ra\u0165 statements. P\u00ed\u0161eme to takto: \u201eprepare\u201c \u201eexecute\u201c. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL a JDBC \u2013 vy\u017em\u00fdkame v\u0161etko. Vladim\u00edr Sitnikov\" 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 a JDBC \u2013 vy\u017em\u00fdkame v\u0161etko. Vladim\u00edr Sitnikov\" src=\"\/wp-content\/uploads\/2020\/05\/724646bfc55b5e2b611b1584ca8ba6aa.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ak spust\u00edme nie\u010do tak\u00e9, je jasn\u00e9, \u017ee niekde nie\u010do prete\u010die. Ak to nie je zrejm\u00e9, m\u00f4\u017eeme to zmera\u0165. Vytvorme a nap\u00ed\u0161me benchmark, v ktorom m\u00e1me tak\u00fa jednoduch\u00fa met\u00f3du. Vytvor\u00edme statement. Spust\u00edme na ur\u010ditej verzii ovl\u00e1da\u010da a zist\u00edme, \u017ee sa celkom r\u00fdchlo zr\u00fati s celou pam\u00e4\u0165ou, ktor\u00e1 sa n\u00e1m stratila. <\/p>\n<p><\/p>\n<p>Je jasn\u00e9, \u017ee tak\u00e9to chyby s\u00fa \u013eahko opravite\u013en\u00e9. Nebudem o nich hovori\u0165. Ale poviem, \u017ee v novej verzii to funguje ove\u013ea r\u00fdchlej\u0161ie. Met\u00f3da je bezv\u00fdznamn\u00e1, ale aj tak. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL a JDBC \u2013 vy\u017em\u00fdkame v\u0161etko. Vladim\u00edr Sitnikov\" src=\"\/wp-content\/uploads\/2020\/05\/b232a6205e708c70f52be0024bbe9980.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ako pracova\u0165 spr\u00e1vne? \u010co na to potrebujeme robi\u0165?<\/p>\n<p><\/p>\n<p>V skuto\u010dnosti aplik\u00e1cie v\u017edy zatv\u00e1raj\u00fa statements. Vo v\u0161etk\u00fdch knih\u00e1ch sa p\u00ed\u0161e, aby sme ich zatv\u00e1rali, inak d\u00f4jde k \u00faniku pam\u00e4ti. <\/p>\n<p><\/p>\n<p>A PostgreSQL nevie cacheova\u0165 dopyty. Ka\u017ed\u00e1 rel\u00e1cia si mus\u00ed sama vytvori\u0165 tento cache. <\/p>\n<p><\/p>\n<p>A nechceme ani str\u00e1ca\u0165 \u010das na parsovanie. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL a JDBC \u2013 vy\u017em\u00fdkame v\u0161etko. Vladim\u00edr Sitnikov\" src=\"\/wp-content\/uploads\/2020\/05\/85b9574938aa6e6bf59c956e3728bdc3.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A ako obvykle m\u00e1me dva varianty. <\/p>\n<p><\/p>\n<p>Prv\u00e1 mo\u017enos\u0165 \u2013 vezmeme a povieme, \u017ee v\u0161etko zabal\u00edme do PgSQL. Tam je cache. V\u0161etko uklad\u00e1 do cache. Bude to skvel\u00e9. Na toto sme sa u\u017e pozreli. M\u00e1me 100500 dopytov. Nepracuje to. Nes\u00fahlas\u00edme \u2013 ru\u010dne premie\u0148a\u0165 dopyty na proced\u00fary. Nie-nie. <\/p>\n<p><\/p>\n<p>M\u00e1me druh\u00fa mo\u017enos\u0165 \u2013 vzia\u0165 a sami to spravi\u0165. Otvor\u00edme zdrojov\u00e9 k\u00f3dy a za\u010dneme k\u00f3dova\u0165. K\u00f3dujeme-k\u00f3dujeme. Zistilo sa, \u017ee nie je tak \u0165a\u017ek\u00e9 to spravi\u0165. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL a JDBC \u2013 vy\u017em\u00fdkame v\u0161etko. Vladim\u00edr Sitnikov\" 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>Objavilo sa to v auguste 2015. Teraz je to u\u017e modernej\u0161ia verzia. A v\u0161etko funguje skvele. Pracuje to tak dobre, \u017ee v aplik\u00e1cii ni\u010d nemen\u00edme. A dokonca sme prestali zva\u017eova\u0165 PgSQL, t.j. to n\u00e1m \u00faplne sta\u010dilo na to, aby sme v\u0161etky ved\u013eaj\u0161ie n\u00e1klady zn\u00ed\u017eili takmer na nulu. <\/p>\n<p><\/p>\n<p>Pr\u00edslu\u0161ne sa Server-prepared statements aktivuje na 5. vykonan\u00ed, aby sa nestr\u00e1cala pam\u00e4\u0165 v datab\u00e1ze na ka\u017ed\u00fd jednorazov\u00fd dopyt. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL a JDBC \u2013 vy\u017em\u00fdkame v\u0161etko. Vladim\u00edr Sitnikov\" src=\"\/wp-content\/uploads\/2020\/05\/8ee95e71f92187941989ad0c18ece0c0.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>M\u00f4\u017eete sa op\u00fdta\u0165 \u2013 kde s\u00fa \u010d\u00edsla? \u010co dostanete? A tu v\u00e1m \u010d\u00edsla ned\u00e1m, preto\u017ee pre ka\u017ed\u00fd dopyt s\u00fa svoje.<\/p>\n<p><\/p>\n<p>Mal som dopyty tak\u00e9, \u017ee na OLTP dopytoch sme m\u00ed\u0148ali okolo 20 milisek\u00fand na parsovanie. Tam bolo 0,5 milisekundy na vykonanie, 20 milisek\u00fand na parsovanie. Dopyt \u2013 10 KiB textu, 170 riadkov pl\u00e1nu. Toto je OLTP dopyt. P\u00fdta 1, 5, 10 riadkov, niekedy viac. <\/p>\n<p><\/p>\n<p>Ale v\u00f4bec sme nechceli m\u00ed\u0148a\u0165 20 milisek\u00fand. Zn\u00ed\u017eili sme to na 0. V\u0161etko funguje skvele. <\/p>\n<p><\/p>\n<p>\u010co si odtia\u013eto m\u00f4\u017eete vzia\u0165? Ak m\u00e1te Java, zoberte modern\u00fa verziu ovl\u00e1da\u010da a te\u0161te sa. <\/p>\n<p><\/p>\n<p>Ak m\u00e1te nejak\u00fd in\u00fd jazyk, zamyslite sa \u2013 mo\u017eno to potrebujete aj vy? Preto\u017ee z poh\u013eadu kone\u010dn\u00e9ho jazyka, napr\u00edklad, ak je to PL 8 alebo m\u00e1te LibPQ, tak v\u00e1m nie je zrejm\u00e9, \u017ee m\u00ed\u0148ate \u010das nie na vykonanie, ale na parsovanie a to stoj\u00ed za to skontrolova\u0165. Ako? V\u0161etko zadarmo. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL a JDBC \u2013 vy\u017em\u00fdkame v\u0161etko. Vladim\u00edr Sitnikov\" src=\"\/wp-content\/uploads\/2020\/05\/fda6b1c1b126cb85c970e42335e1dc24.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Okrem toho, \u017ee s\u00fa tam chyby, nejak\u00e9 \u0161pecifik\u00e1. A pr\u00e1ve o nich budeme teraz hovori\u0165. Ve\u013ek\u00e1 \u010das\u0165 bude o priemyselnej archeol\u00f3gii, o tom, \u010do sme na\u0161li, na \u010do sme narazili. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL a JDBC \u2013 vy\u017em\u00fdkame v\u0161etko. Vladim\u00edr Sitnikov\" src=\"\/wp-content\/uploads\/2020\/05\/9a3b383f83c5e227cd02952c5825b64f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ak je dopyt generovan\u00fd dynamicky. To sa st\u00e1va. Niekto re\u0165az\u00ed riadky, vznik\u00e1 SQL dopyt.<\/p>\n<p><\/p>\n<p>\u010c\u00edm je zl\u00fd? Je zl\u00fd t\u00fdm, \u017ee ka\u017ed\u00fd raz m\u00e1me nakoniec in\u00fa re\u0165azec.<\/p>\n<p><\/p>\n<p>A aj tento r\u00f4zny riadok je potrebn\u00e9 znovu spo\u010d\u00edta\u0165 hashCode. Je to naozaj CPU \u00faloha \u2013 n\u00e1js\u0165 dlh\u00fd text dotazu v existuj\u00facom hashi nie je jednoduch\u00e9. Preto je v\u00fdstup jednoduch\u00fd \u2013 nevytv\u00e1rajte dotazy. Ulo\u017ete ich do jednej premennej. A radujte sa.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL a JDBC \u2013 vy\u017em\u00fdkame v\u0161etko. Vladim\u00edr Sitnikov\" src=\"\/wp-content\/uploads\/2020\/05\/bcd4f729204cecdb572a98f357bcc33f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nasleduj\u00faci probl\u00e9m. Typy \u00fadajov s\u00fa d\u00f4le\u017eit\u00e9. Existuj\u00fa ORM, ktor\u00e9 tvrdia, \u017ee na ak\u00fdko\u013evek NULL nez\u00e1le\u017e\u00ed, nech je ak\u00fdko\u013evek. Ak je to Int, povedzme setInt. A ak je NULL, tak nech je v\u017edy VARCHAR. A ak\u00fd je vlastne rozdiel, \u010di je tam NULL? Datab\u00e1za to sama pochop\u00ed. A tak\u00e1to predstava nefunguje. <\/p>\n<p><\/p>\n<p>V praxi datab\u00e1ze naozaj nez\u00e1le\u017e\u00ed. <strong>Ak ste po prv\u00fdkr\u00e1t povedali, \u017ee to m\u00e1te ako \u010d\u00edslo, a druh\u00fdkr\u00e1t ste povedali, \u017ee je to VARCHAR, nie je mo\u017en\u00e9 znovu pou\u017ei\u0165 Server-prepared statements. A v takom pr\u00edpade mus\u00edme n\u00e1\u0161 statement znovu vytvori\u0165.<\/strong><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL a JDBC \u2013 vy\u017em\u00fdkame v\u0161etko. Vladim\u00edr Sitnikov\" src=\"\/wp-content\/uploads\/2020\/05\/552d9c2e25cf9abbdfef12c98d027740.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ak vykon\u00e1vate ten ist\u00fd dotaz, dbajte na to, aby ste nemali pomie\u0161an\u00e9 typy \u00fadajov v st\u013apci. Je potrebn\u00e9 d\u00e1va\u0165 pozor na NULL. To je \u010dast\u00e1 chyba, ktor\u00fa sme mali po tom, \u010do sme za\u010dali pou\u017e\u00edva\u0165 PreparedStatements.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL a JDBC \u2013 vy\u017em\u00fdkame v\u0161etko. Vladim\u00edr Sitnikov\" src=\"\/wp-content\/uploads\/2020\/05\/5d73c8f5dfa281c3bda962fc3e5edd84.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dobre, zapli sme to. Zobrali sme, mo\u017eno, ovl\u00e1da\u010d. A v\u00fdkon klesol. V\u0161etko sa zhor\u0161ilo. <\/p>\n<p><\/p>\n<p>Ako to m\u00f4\u017ee by\u0165? Je to chyba alebo funkcia? Bohu\u017eia\u013e, nedok\u00e1zal som zisti\u0165 \u2013 \u010di je to chyba alebo funkcia. Ale je tu celkom jednoduch\u00fd scen\u00e1r, ako t\u00fato probl\u00e9mov\u00fa situ\u00e1ciu reprodukova\u0165. Ne\u010dakane n\u00e1s to prekvapilo. Spo\u010d\u00edva to v dotaze iba z jednej tabu\u013eky. Samozrejme, mali sme tak\u00fdch dotazov viac. Zvy\u010dajne zah\u0155\u0148ali dve a\u017e tri tabu\u013eky, ale existuje aj tak\u00fdto scen\u00e1r reprodukcie. Na va\u0161ej datab\u00e1ze akejko\u013evek verzie ho m\u00f4\u017eete reprodukova\u0165.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL a JDBC \u2013 vy\u017em\u00fdkame v\u0161etko. Vladim\u00edr Sitnikov\" 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>Podstatou je, \u017ee m\u00e1me dve kol\u00f3ny, z ktor\u00fdch ka\u017ed\u00e1 je indexovan\u00e1. V jednej kol\u00f3ne je pod\u013ea hodnoty NULL mili\u00f3n riadkov. A v druhej kol\u00f3ne je len 20 riadkov. Ke\u010f vykon\u00e1vame bez prepojen\u00fdch premenn\u00fdch, v\u0161etko funguje dobre. <\/p>\n<p><\/p>\n<p>Ak za\u010dneme vykon\u00e1va\u0165 s prepojen\u00fdmi premenn\u00fdmi, t. j. vykon\u00e1vame znak \u201e?\u201c alebo \u201e$1\u201c pre n\u00e1\u0161 dopyt, \u010do vlastne dostaneme?<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL a JDBC \u2013 vy\u017em\u00fdkame v\u0161etko. Vladim\u00edr Sitnikov\" 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>Prv\u00e9 vykonanie \u2013 ako m\u00e1 by\u0165. Druh\u00e9 \u2013 o nie\u010do r\u00fdchlej\u0161ie. Nie\u010do bolo vyrovnan\u00e9. Tretie-\u0161tvrt\u00e9-piate. Potom bum \u2013 a nejako takto. A najhor\u0161ie je, \u017ee sa to stane pri \u0161iestom vykonan\u00ed. Kto vedel, \u017ee treba urobi\u0165 presne \u0161es\u0165 vykonan\u00ed, aby sme pochopili, ak\u00fd je skuto\u010dn\u00fd pl\u00e1n vykonania?<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL a JDBC \u2013 vy\u017em\u00fdkame v\u0161etko. Vladim\u00edr Sitnikov\" src=\"\/wp-content\/uploads\/2020\/05\/893c955bc1e2e15a6986690e516f72a9.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Kto je zodpovedn\u00fd? \u010co sa stalo? Datab\u00e1za obsahuje optimaliz\u00e1ciu. A je takpovediac optimalizovan\u00e1 pre generick\u00fd pr\u00edpad. A teda, za\u010d\u00ednaj\u00fac ur\u010dit\u00fdm sp\u00f4sobom, prech\u00e1dza na generick\u00fd pl\u00e1n, ktor\u00fd, bohu\u017eia\u013e, m\u00f4\u017ee by\u0165 in\u00fd. M\u00f4\u017ee sa uk\u00e1za\u0165, \u017ee je tak\u00fd ist\u00fd, ale m\u00f4\u017ee by\u0165 aj in\u00fd. A existuje nejak\u00e1 prahov\u00e1 hodnota, ktor\u00e1 vedie k tak\u00e9mu spr\u00e1vaniu. <\/p>\n<p><\/p>\n<p>\u010co s t\u00fdm m\u00f4\u017eeme robi\u0165? Tu je samozrejme \u0165a\u017e\u0161ie nie\u010do predpoklada\u0165. Existuje jednoduch\u00e9 rie\u0161enie, ktor\u00e9 pou\u017e\u00edvame. Je to +0, OFFSET 0. Ur\u010dite pozn\u00e1te tak\u00e9to rie\u0161enia. Jednoducho vezmeme a do dopytu prid\u00e1me \u201e+0\u201c a v\u0161etko je dobr\u00e9. Uk\u00e1\u017eem nesk\u00f4r. <\/p>\n<p><\/p>\n<p>A je tu e\u0161te jedna mo\u017enos\u0165 \u2013 pozrie\u0165 sa pozornej\u0161ie na pl\u00e1ny. V\u00fdvoj\u00e1r by mal nielen nap\u00edsa\u0165 dopyt, ale aj \u0161es\u0165kr\u00e1t poveda\u0165 \u201eexplain analyze\u201c. Ak p\u00e4\u0165kr\u00e1t, tak to nevyhovuje. <\/p>\n<p><\/p>\n<p>A existuje e\u0161te tretia mo\u017enos\u0165 \u2013 nap\u00edsa\u0165 list na pgsql-hackers. Nap\u00edsal som, ale zatia\u013e nie je jasn\u00e9, \u010di ide o chybu alebo funkciu.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL a JDBC \u2013 vy\u017em\u00fdkame v\u0161etko. Vladim\u00edr Sitnikov\" 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>Ne\u017e budeme uva\u017eova\u0165, \u010di ide o chybu alebo funkciu, po\u010fme to opravi\u0165. Vezmeme n\u00e1\u0161 dopyt a prid\u00e1me \u201e+0\u201c. V\u0161etko je dobr\u00e9. Dva symboly a ani netreba prem\u00fd\u0161\u013ea\u0165, ako a \u010do tam je. Ve\u013emi jednoduch\u00e9. Jednoducho sme datab\u00e1ze zak\u00e1zali pou\u017e\u00edva\u0165 index pre tento st\u013apec. Nem\u00e1me index pre st\u013apec \u201e+0\u201c a v\u0161etko, datab\u00e1za pou\u017e\u00edva index, v\u0161etko je v poriadku. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL a JDBC \u2013 vy\u017em\u00fdkame v\u0161etko. Vladim\u00edr Sitnikov\" src=\"\/wp-content\/uploads\/2020\/05\/5261d80d084786a15b9764f6367014cd.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Toto je pravidlo \u0161iestich explainov. V aktu\u00e1lnych verzi\u00e1ch je potrebn\u00e9 robi\u0165 to \u0161es\u0165kr\u00e1t, ak m\u00e1te s\u00favisiace premenn\u00e9. Ak nem\u00e1te s\u00favisiace premenn\u00e9, rob\u00edme to takto. A na konci tento dopyt pad\u00e1. Ni\u010d zlo\u017eit\u00e1 z\u00e1le\u017eitos\u0165.<\/p>\n<p><\/p>\n<p>Na prv\u00fd poh\u013ead, ko\u013eko toho m\u00f4\u017ee by\u0165? Tu chyba, tam chyba. V skuto\u010dnosti je chyba v\u0161ade. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL a JDBC \u2013 vy\u017em\u00fdkame v\u0161etko. Vladim\u00edr Sitnikov\" src=\"\/wp-content\/uploads\/2020\/05\/674dc7e7b4624baa5c79eee9e1e89db0.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Po\u010fme sa pozrie\u0165 e\u0161te raz. Napr\u00edklad, m\u00e1me dve sch\u00e9my. Sch\u00e9ma A s tabu\u013ekou Y a sch\u00e9ma B s tabu\u013ekou Y. Dopyt \u2013 vybra\u0165 \u00fadaje z tabu\u013eky. \u010co m\u00e1me pri tom? Budeme ma\u0165 chybu. Budeme ma\u0165 v\u0161etko, \u010do bolo uveden\u00e9 vy\u0161\u0161ie. Pravidlo je tak\u00e9 \u2013 chyba je v\u0161ade, budeme ma\u0165 v\u0161etko vy\u0161\u0161ie uveden\u00e9.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL a JDBC \u2013 vy\u017em\u00fdkame v\u0161etko. Vladim\u00edr Sitnikov\" src=\"\/wp-content\/uploads\/2020\/05\/dd6f544bb9e930c39e36523c9afe6003.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Teraz ot\u00e1zka: \u201ePre\u010do?\u201c. Na prv\u00fd poh\u013ead je tu dokument\u00e1cia, ktor\u00e1 hovor\u00ed, \u017ee ak m\u00e1me sch\u00e9mu, tak existuje premenn\u00e1 \u201esearch_path\u201c, ktor\u00e1 ur\u010duje, kde treba h\u013eada\u0165 tabu\u013eku. Na prv\u00fd poh\u013ead, premenn\u00e1 existuje.<\/p>\n<p><\/p>\n<p>V \u010dom je probl\u00e9m? Probl\u00e9m je v tom, \u017ee server-prepared statements si neuvedomuj\u00fa, \u017ee niekto m\u00f4\u017ee meni\u0165 search_path. T\u00e1to hodnota zost\u00e1va akoby kon\u0161tantn\u00e1 pre datab\u00e1zu. A niektor\u00e9 \u010dasti nemusia z\u00edska\u0165 nov\u00e9 hodnoty. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL a JDBC \u2013 vy\u017em\u00fdkame v\u0161etko. Vladim\u00edr Sitnikov\" src=\"\/wp-content\/uploads\/2020\/05\/f738301606d84d72bfa7cc5b568c0df8.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Samozrejme, z\u00e1vis\u00ed to od verzie, na ktorej testujete. Z\u00e1le\u017e\u00ed na tom, ako ve\u013emi sa va\u0161e tabu\u013eky l\u00ed\u0161ia. A verzia 9.1 jednoducho spracuje star\u00e9 dotazy. Nov\u0161ie verzie m\u00f4\u017eu odhali\u0165 podvod a poveda\u0165, \u017ee m\u00e1te chybu.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL a JDBC \u2013 vy\u017em\u00fdkame v\u0161etko. Vladim\u00edr Sitnikov\" 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\">Nastavi\u0165 search_path + server-prepared statements =<br \/>\ncacheovan\u00fd pl\u00e1n nesmie meni\u0165 typ v\u00fdsledku<\/a><\/noindex><\/p>\n<p><\/p>\n<p>Ako to opravi\u0165? Existuje jednoduch\u00fd recept \u2013 nerobte to. Neme\u0148te search_path v pr\u00e1ci aplik\u00e1cie. Ak pou\u017eijete in\u00e9, je lep\u0161ie vytvori\u0165 nov\u00e9 pripojenie.<\/p>\n<p><\/p>\n<p>M\u00f4\u017eeme to prediskutova\u0165, tj. otvori\u0165, prediskutova\u0165, dop\u00edsa\u0165. Mo\u017eno presved\u010d\u00edme v\u00fdvoj\u00e1rov datab\u00e1zy, \u017ee v pr\u00edpade, ak niekto zmen\u00ed hodnotu, datab\u00e1za by mala klientovi poveda\u0165: \u201ePozrite, tu sa hodnota aktualizovala. Mo\u017eno by ste mali resetova\u0165 statements, prekona\u0165 ich?\u201c. Teraz sa datab\u00e1za spr\u00e1va obmedzene a nijako neoznamuje, \u017ee sa niekde vo vn\u00fatri statements zmenili. <\/p>\n<p><\/p>\n<p>A op\u00e4\u0165 zd\u00f4razn\u00edm \u2013 to nie je typick\u00e9 pre Java. To ist\u00e9 uvid\u00edme v PL\/pgSQL jeden k jedn\u00e9mu. Ale tam sa to obnov\u00ed.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL a JDBC \u2013 vy\u017em\u00fdkame v\u0161etko. Vladim\u00edr Sitnikov\" src=\"\/wp-content\/uploads\/2020\/05\/a4e7b201d0c0aa4a0092d2b6ff152df7.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Sk\u00fasme znovu vybra\u0165 \u00fadaje. Vyber\u00e1me, vyber\u00e1me. M\u00e1me tabu\u013eku s mili\u00f3nom riadkov. Ka\u017ed\u00fd riadok m\u00e1 kilobajt. Pribli\u017ene gigabajt \u00fadajov. A m\u00e1me pracovn\u00fa pam\u00e4\u0165 v Java stroj v 128 megabajtoch. <\/p>\n<p><\/p>\n<p>My, ako je odpor\u00fa\u010dan\u00e9 vo v\u0161etk\u00fdch knih\u00e1ch, pou\u017e\u00edvame pr\u00fadov\u00fa spracovanie. Tj. otv\u00e1rame resultSet a \u010d\u00edtame z neho \u00fadaje po kusoch. Bude to fungova\u0165? Nepadneme kv\u00f4li pam\u00e4ti? Bude to \u010d\u00edta\u0165 po tro\u0161k\u00e1ch? Po\u010fme veri\u0165 datab\u00e1ze, ver\u00edme v Postgres. Never\u00edme. Spadneme OutOFMemory? Kto mal OutOfMemory? A kto to dok\u00e1zal opravi\u0165 potom? Niekto to dok\u00e1zal opravi\u0165. <\/p>\n<p><\/p>\n<p>Ak m\u00e1te mili\u00f3n riadkov, ned\u00e1 sa len tak vybra\u0165. Je nutn\u00e9 pou\u017ei\u0165 OFFSET\/LIMIT. Kto je za tak\u00fd variant? A kto je za variant, \u017ee by sme sa mali hra\u0165 s autoCommitom? <\/p>\n<p><\/p>\n<p>Tu, ako obvykle, sa najne\u010dakanej\u0161\u00ed variant ukazuje ako spr\u00e1vny. A ak n\u00e1hodou vypnete autoCommit, pom\u00f4\u017ee to. Pre\u010do je to tak? Veda o tom nevie. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL a JDBC \u2013 vy\u017em\u00fdkame v\u0161etko. Vladim\u00edr Sitnikov\" src=\"\/wp-content\/uploads\/2020\/05\/2e5d9d2a8450a9069155de86a8ec387a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ale predvolene v\u0161etci klienti pripojuj\u00faci sa k datab\u00e1ze Postgres vyberaj\u00fa \u00fadaje cel\u00e9. PgJDBC nie je v tomto oh\u013eade v\u00fdnimkou, vyber\u00e1 v\u0161etky riadky.<\/p>\n<p><\/p>\n<p>Existuje vari\u00e1cia na t\u00e9mu FetchSize, t.j. m\u00f4\u017eete na \u00farovni jednotliv\u00e9ho statementu poveda\u0165, \u017ee tu, pros\u00edm, vyberte \u00fadaje po 10, 50. Ale to nefunguje, pok\u00fdm nevypnete autoCommit. Vypnut\u00fd autoCommit \u2013 za\u010dne to fungova\u0165. <\/p>\n<p><\/p>\n<p>Chodi\u0165 po k\u00f3de a v\u0161ade nastavova\u0165 setFetchSize je nepraktick\u00e9. Preto sme vytvorili nastavenie, ktor\u00e9 bude pre cel\u00e9 spojenie hovori\u0165 predvolen\u00fa hodnotu.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL a JDBC \u2013 vy\u017em\u00fdkame v\u0161etko. Vladim\u00edr Sitnikov\" src=\"\/wp-content\/uploads\/2020\/05\/c9ac8e483dc6bfdbbc300972ee1ab1e0.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Povedali sme to. Nastavili sme parameter. A \u010do sme dosiahli? Ak vyber\u00e1me mal\u00e9 mno\u017estvo, napr\u00edklad 10 riadkov, m\u00e1me dos\u0165 vysok\u00e9 n\u00e1klady. Preto by sme mali nastavi\u0165 t\u00fato hodnotu na pribli\u017ene sto. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL a JDBC \u2013 vy\u017em\u00fdkame v\u0161etko. Vladim\u00edr Sitnikov\" src=\"\/wp-content\/uploads\/2020\/05\/073e7a4af63688396eefe332ba8261d6.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ide\u00e1lne by bolo nau\u010di\u0165 sa obmedzova\u0165 aj v bajtoch, ale recept je tak\u00fd: nastavujeme defaultRowFetchSize na viac ako sto a te\u0161\u00edme sa. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL a JDBC \u2013 vy\u017em\u00fdkame v\u0161etko. Vladim\u00edr Sitnikov\" src=\"\/wp-content\/uploads\/2020\/05\/e3078faf2078fcaec10d6d99872a9990.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Prejdime k vkladaniu \u00fadajov. Vkladanie je jednoduch\u00e9, existuj\u00fa r\u00f4zne mo\u017enosti. Napr\u00edklad, INSERT, VALUES. To je dobr\u00e1 mo\u017enos\u0165. M\u00f4\u017eeme poveda\u0165 'INSERT SELECT'. V praxi je to to ist\u00e9. \u017diadny rozdiel vo v\u00fdkonnosti. <\/p>\n<p><\/p>\n<p>Knihy hovoria, \u017ee treba vykon\u00e1va\u0165 Batch statement, knihy hovoria, \u017ee je mo\u017en\u00e9 vykon\u00e1va\u0165 zlo\u017eitej\u0161ie pr\u00edkazy s viacer\u00fdmi z\u00e1tvorkami. A v Postgres je v\u00fdborn\u00e1 funkcia \u2013 m\u00f4\u017eeme robi\u0165 COPY, t.j. robi\u0165 to r\u00fdchlej\u0161ie. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL a JDBC \u2013 vy\u017em\u00fdkame v\u0161etko. Vladim\u00edr Sitnikov\" src=\"\/wp-content\/uploads\/2020\/05\/4d281c9515bdf8de7fbf1e9922d192d0.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ak sa to zmeria, m\u00f4\u017eeme urobi\u0165 nieko\u013eko zauj\u00edmav\u00fdch objavov. Ako chceme, aby to fungovalo? Chceme, aby sme neparsanovali a vykon\u00e1vali zbyto\u010dn\u00e9 pr\u00edkazy. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL a JDBC \u2013 vy\u017em\u00fdkame v\u0161etko. Vladim\u00edr Sitnikov\" src=\"\/wp-content\/uploads\/2020\/05\/7b2e4343c51dab3ddb6919bf0f117c4d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>V praxi n\u00e1m to TCP takto nedovol\u00ed. Ak je klient zanepr\u00e1zdnen\u00fd odosielan\u00edm po\u017eiadavky, datab\u00e1za sa sna\u017e\u00ed odosla\u0165 n\u00e1m odpovede, po\u017eiadavky ne\u010d\u00edta. Nakoniec klient \u010dak\u00e1 na datab\u00e1zu, k\u00fdm pre\u010d\u00edta po\u017eiadavku, a datab\u00e1za \u010dak\u00e1 na klienta, k\u00fdm pre\u010d\u00edta odpove\u010f. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL a JDBC \u2013 vy\u017em\u00fdkame v\u0161etko. Vladim\u00edr Sitnikov\" src=\"\/wp-content\/uploads\/2020\/05\/17a062c30ddd83cb890775ec1722044f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A preto je klient n\u00faten\u00fd ob\u010das posiela\u0165 synchroniza\u010dn\u00fd paket. Zbyto\u010dn\u00e9 sie\u0165ov\u00e9 interakcie, zbyto\u010dn\u00e1 strata \u010dasu.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL a JDBC \u2013 vy\u017em\u00fdkame v\u0161etko. Vladim\u00edr Sitnikov\" src=\"\/wp-content\/uploads\/2020\/05\/ae7a4f32e2949c1d0550da051937de02.jpg\" style=\"display:block;margin: 0 auto;\" \/>A \u010d\u00edm viac ich prid\u00e1vame, t\u00fdm hor\u0161ie to je. Ovl\u00e1da\u010d je ve\u013emi pesimistick\u00fd a prid\u00e1va ich dos\u0165 \u010dasto, asi raz ka\u017ed\u00fdch 200 riadkov, v z\u00e1vislosti od ve\u013ekosti riadkov a pod. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL a JDBC \u2013 vy\u017em\u00fdkame v\u0161etko. Vladim\u00edr Sitnikov\" 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>St\u00e1va sa, \u017ee ak oprav\u00edte jeden riadok, zrazu sa to cel\u00e9 zr\u00fdchli desa\u0165kr\u00e1t. Tak\u00e9to pr\u00edpady sa st\u00e1vaj\u00fa. Pre\u010do? Ako v\u017edy, nejak\u00e1 kon\u0161tanta u\u017e bola niekde pou\u017eit\u00e1. A hodnota '128' znamenala \u2013 nepou\u017e\u00edva\u0165 batching.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL a JDBC \u2013 vy\u017em\u00fdkame v\u0161etko. Vladim\u00edr Sitnikov\" 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>Je dobr\u00e9, \u017ee sa to nedostalo do ofici\u00e1lnej verzie. Zistili sme to predt\u00fdm, ako sme za\u010dali vyd\u00e1va\u0165 release. V\u0161etky hodnoty, ktor\u00e9 uv\u00e1dzam, s\u00fa zalo\u017een\u00e9 na modern\u00fdch verzi\u00e1ch. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL a JDBC \u2013 vy\u017em\u00fdkame v\u0161etko. Vladim\u00edr Sitnikov\" src=\"\/wp-content\/uploads\/2020\/05\/28c82d9e11f6bdaf3cf62b49fc074d68.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Zmerajme to. Meriame jednoduch\u00fd InsertBatch. Meriame viackr\u00e1t InsertBatch, t.j. to ist\u00e9, ale s mnoh\u00fdmi hodnotami. Chytr\u00fd \u0165ah. Nie ka\u017ed\u00fd to tak dok\u00e1\u017ee, ale je to jednoduch\u00fd pr\u00edstup, ove\u013ea jednoduch\u0161\u00ed ako COPY.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL a JDBC \u2013 vy\u017em\u00fdkame v\u0161etko. Vladim\u00edr Sitnikov\" src=\"\/wp-content\/uploads\/2020\/05\/72f7cf6c3b9d9175d3e5a6d5410fe209.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>M\u00f4\u017eeme robi\u0165 COPY.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL a JDBC \u2013 vy\u017em\u00fdkame v\u0161etko. Vladim\u00edr Sitnikov\" src=\"\/wp-content\/uploads\/2020\/05\/2b0d8bbcc50f1293c9a8a1eb8eb70d2e.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A mo\u017eno to robi\u0165 na \u0161trukt\u00farach. Vyhl\u00e1si\u0165 predvolen\u00fd typ pou\u017e\u00edvate\u013ea, posla\u0165 pole a priamo vlo\u017ei\u0165 do tabu\u013eky. <\/p>\n<p><\/p>\n<p>Ak otvor\u00edte odkaz: pgjdbc\/ubenchmsrk\/InsertBatch.java, tento k\u00f3d je na GitHub. M\u00f4\u017eete si pozrie\u0165 konkr\u00e9tne, ak\u00e9 dopyty sa tam generuj\u00fa. Nie je to podstatn\u00e9.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL a JDBC \u2013 vy\u017em\u00fdkame v\u0161etko. Vladim\u00edr Sitnikov\" src=\"\/wp-content\/uploads\/2020\/05\/28dede211fe401286685ca62081453de.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Spustili sme to. A prv\u00e9, \u010do sme pochopili, je, \u017ee batch sa jednoducho nesmie nepou\u017e\u00edva\u0165. V\u0161etky mo\u017enosti batching s\u00fa nulov\u00e9, t. j. \u010das vykon\u00e1vania je prakticky nulov\u00fd v porovnan\u00ed s jednorazov\u00fdm vykonan\u00edm. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL a JDBC \u2013 vy\u017em\u00fdkame v\u0161etko. Vladim\u00edr Sitnikov\" src=\"\/wp-content\/uploads\/2020\/05\/4ea68f712bbdeadd35f5baa4ddaeff33.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vklad\u00e1me \u00fadaje. Je to relat\u00edvne jednoduch\u00e1 tabu\u013eka. Tri st\u013apce. A \u010do tu vid\u00edme? Vid\u00edme, \u017ee v\u0161etky tieto tri mo\u017enosti s\u00fa pribli\u017ene porovnate\u013en\u00e9. A COPY je samozrejme lep\u0161ia.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL a JDBC \u2013 vy\u017em\u00fdkame v\u0161etko. Vladim\u00edr Sitnikov\" src=\"\/wp-content\/uploads\/2020\/05\/2686f1d7eea347a839ac23aef2a27e53.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>To je, ke\u010f vklad\u00e1me po \u010dastiach. Ke\u010f sme hovorili o jednom hodnote VALUES, dvoch hodnot\u00e1ch VALUES, troch hodnot\u00e1ch VALUES alebo sme ich tam 10 uviedli cez \u010diarku. To je presne teraz horizont\u00e1lne. 1, 2, 4, 128. Je zrejm\u00e9, \u017ee Batch Insert, ktor\u00fd je zobrazen\u00fd modro, sa t\u00fdm naozaj u\u013eah\u010duje. T. j. ke\u010f vklad\u00e1te po jednom alebo aj ke\u010f d\u00e1vate po \u0161tyroch, je to dvakr\u00e1t lep\u0161ie, jednoducho preto, \u017ee sme do VALUES nalo\u017eili nie\u010do viac. Menej oper\u00e1ci\u00ed EXECUTE.<\/p>\n<p><\/p>\n<p>Pou\u017e\u00edva\u0165 COPY pri mal\u00fdch objemoch \u2013 je to extr\u00e9mne nevyhliadnute\u013en\u00e9. Na prv\u00e9 dva som ani nenakreslil. Id\u00fa k oblohe, t. j. tieto zelen\u00e9 \u010d\u00edsla pre COPY.<\/p>\n<p><\/p>\n<p>COPY treba pou\u017e\u00edva\u0165, ke\u010f m\u00e1te objem \u00fadajov aspo\u0148 viac ako sto riadkov. N\u00e1klady na otvorenie tohto pripojenia s\u00fa ve\u013ek\u00e9. A, \u00faprimne, do tejto oblasti som sa nepustil. Batching som optimalizoval, COPY \u2013 nie. <\/p>\n<p><\/p>\n<p>\u010co rob\u00edme \u010falej? Zmerali sme. Rozumieme, \u017ee treba pou\u017e\u00edva\u0165 bu\u010f \u0161trukt\u00fary, alebo rafinovan\u00fd batch, ktor\u00fd sp\u00e1ja nieko\u013eko hodn\u00f4t. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL a JDBC \u2013 vy\u017em\u00fdkame v\u0161etko. Vladim\u00edr Sitnikov\" src=\"\/wp-content\/uploads\/2020\/05\/e02fa2574e2d1b678382db15064610d3.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u010co treba vy\u0165a\u017ei\u0165 z dne\u0161nej prezent\u00e1cie?<\/p>\n<p><\/p>\n<ul>\n<li>PreparedStatement \u2013 to je na\u0161e v\u0161etko. To dos\u0165 pom\u00e1ha v\u00fdkonu. Prin\u00e1\u0161a ve\u013ek\u00fa n\u00e1dobu dechtu. <\/li>\n<li>A treba robi\u0165 EXPLAIN ANALYZE 6-kr\u00e1t.<\/li>\n<li>A treba na\u010falej rozmixova\u0165 OFFSET 0 a triky ako +0, aby sme upravili zost\u00e1vaj\u00faci percento z na\u0161ich probl\u00e9mov\u00fdch dopytov.<\/li>\n<\/ul>\n<p>Zdroj: <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.3 - 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\/sk\/blog\/administrirovanie\/postgresql-i-jdbc-vyzhimaem-vse-soki-vladimir-sitnikov\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"sk_SK\" \/>\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\/sk\/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 a JDBC vy\u017em\u00fdkame v\u0161etky \u0161\u0165avy. Vladimir Sitnikov | ProHoster","description":"Pon\u00fakam na obozn\u00e1menie sa s prepisom v\u00fdkladu z janu\u00e1ra 2016 od Vladim\u00edra Sitnikova \"PostgreSQL a JDBC \u2013 vy\u017em\u00fdkame v\u0161etko\"","canonical_url":"https:\/\/prohoster.info\/sk\/blog\/administrirovanie\/postgresql-i-jdbc-vyzhimaem-vse-soki-vladimir-sitnikov","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sk_SK","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\/sk\/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\/sk\/wp-json\/wp\/v2\/posts\/79893","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/comments?post=79893"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/posts\/79893\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/media\/79894"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/media?parent=79893"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/categories?post=79893"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/tags?post=79893"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}