{"id":79028,"date":"2020-04-23T19:43:19","date_gmt":"2020-04-23T17:43:19","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/pishem-v-postgresql-na-subsvetovoj-1-host-1-day-1tb"},"modified":"2020-04-23T19:43:19","modified_gmt":"2020-04-23T17:43:19","slug":"pishem-v-postgresql-na-subsvetovoj-1-host-1-day-1tb","status":"publish","type":"post","link":"https:\/\/prohoster.info\/hr\/blog\/administrirovanie\/pishem-v-postgresql-na-subsvetovoj-1-host-1-day-1tb","title":{"rendered":"Pi\u0161emo u PostgreSQL na subluminaciji: 1 host, 1 dan, 1TB.","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Nedavno sam pri\u010dao o tome kako standardni recepti <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/tensor\/blog\/492694\/\">pove\u0107avaju performanse SQL upita \"za \u010ditanje\"<\/a><\/noindex> iz PostgreSQL baze. Danas \u0107emo razgovarati o tome kako <b>u\u010diniti zapis<\/b> u Bazi podataka efikasnijim bez kori\u0161tenja bilo kakvih \"okvira\" u konfiguraciji \u2014 samo pravilno organiziraju\u0107i tokove podataka.<\/p>\n<p><img decoding=\"async\" alt=\"Pi\u0161emo u PostgreSQL na subluminaciji: 1 host, 1 dan, 1TB.\" src=\"\/wp-content\/uploads\/2020\/04\/cbebbe0ed0e9a6590a4e8dd144f82f40.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h2>#1. \u0421\u0435\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435<\/h2>\n<p>\n\u010clanak o tome kako i za\u0161to je va\u017eno organizirati <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/483170\/\">prakti\u010dno sekcioniranje \"u teoriji\"<\/a><\/noindex> ve\u0107 je bio, ovdje \u0107emo govoriti o primjeni nekih pristupa u okviru na\u0161eg <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/487380\/\">servisa za pra\u0107enje stotina PostgreSQL servera<\/a><\/noindex>.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h4>\u201eDoga\u0111aji davnih dana\u2026\u201c<\/h4>\n<p>\nIzvorno, kao i svaki MVP, na\u0161 projekt je zapo\u010deo pod prili\u010dno malim optere\u0107enjem \u2014 pra\u0107enje se vr\u0161ilo samo za desetero najkriti\u010dnijih servera, sve tablice su bile relativno kompaktne... Ali vrijeme je prolazilo, broj pra\u0107enih hostova je rastao, i poku\u0161avaju\u0107i jo\u0161 jednom ne\u0161to u\u010diniti s jednom od <b>tablica veli\u010dine 1.5TB<\/b>, shvatili smo da je mogu\u0107e \u017eivjeti tako, ali veoma nezgodno.<\/p>\n<p>Dani su bili gotovo bajkoviti, kori\u0161tene su razli\u010dite verzije PostgreSQL 9.x, tako da je cijelo sekcioniranje moralo biti ra\u0111eno \"ru\u010dno\" \u2014 putem <b>naslje\u0111ivanja tablica i okida\u010da<\/b> rute s dinami\u010dkim <code>EXECUTE<\/code>.<\/p>\n<p><img decoding=\"async\" alt=\"Pi\u0161emo u PostgreSQL na subluminaciji: 1 host, 1 dan, 1TB.\" src=\"\/wp-content\/uploads\/2020\/04\/a480e75ccec73080aa2d0be1435d2a2e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nKona\u010dno rje\u0161enje je bilo dovoljno univerzalno da se mo\u017ee primijeniti na sve tablice:<\/p>\n<ul>\n<li>Objavljena je prazna \"zaglavna\" roditeljska tablica, na kojoj su opisani svi <b>potrebni indeksi i okida\u010di<\/b>.<\/li>\n<li>Zapis s gledi\u0161ta klijenta vr\u0161en je u \"korijensku\" tablicu, a unutar uz pomo\u0107 <b>okida\u010da rute<\/b> <code>BEFORE INSERT<\/code> zapisa \u201efizi\u010dki\u201c je umetnut u odgovaraju\u0107i odjeljak. Ako takav jo\u0161 nije postojao \u2014 uhvatili smo iznimku i \u2026<\/li>\n<li>\u2026 uz pomo\u0107 <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/492464\/\"><code>CREATE TABLE ... (LIKE ... INCLUDING ...)<\/code><\/a><\/noindex> po uzorku roditeljske tablice stvarala se <b>sekcija s ograni\u010denjem na potrebni datum<\/b>, kako bi se prilikom izvla\u010denja podataka \u010ditanje vr\u0161ilo samo u njoj.<\/li>\n<\/ul>\n<p><\/p>\n<h4>PG10: prvi poku\u0161aj<\/h4>\n<p>\nMe\u0111utim, sekcioniranje putem naslje\u0111ivanja historijski nije bilo vrlo prilago\u0111eno za rad s aktivnim tokom zapisa ili velikim brojem sekcija-potomaca. Na primjer, mo\u017ee se sjetiti da je algoritam izbora potrebne sekcije imao <b>kvadratnu slo\u017eenost<\/b>, \u0161to uz 100+ sekcija radi, sami razumijete kako...<\/p>\n<p>U PG10 je ova situacija zna\u010dajno optimizirana, implementiraju\u0107i podr\u0161ku <noindex><a rel=\"nofollow\" href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/10\/ddl-partitioning\">nativnom sekcioniranju<\/a><\/noindex>. Stoga smo ga odmah poku\u0161ali primijeniti odmah nakon migracije pohrane, ali\u2026<\/p>\n<p>Kako smo saznali nakon pretra\u017eivanja vodi\u010da, nativno sekcionirana tablica u ovoj verziji:<\/p>\n<ul>\n<li>ne podr\u017eava opis indeksa<\/li>\n<li>ne podr\u017eava okida\u010de<\/li>\n<li>ne mo\u017ee biti ni\u010diji \"potomak\"<\/li>\n<li>ne podr\u017eava <code>INSERT ... ON CONFLICT<\/code><\/li>\n<li>ne mo\u017ee automatski generirati sekciju<\/li>\n<\/ul>\n<p>\nBolno udariv\u0161i o dno, shvatili smo da bez modifikacije aplikacije ne\u0107emo mo\u0107i pro\u0107i, i odlo\u017eili daljnja istra\u017eivanja na pola godine.<\/p>\n<h4>PG10: druga prilika<\/h4>\n<p>\nDakle, po\u010deli smo rje\u0161avati nastale probleme redom:<\/p>\n<ol>\n<li>Budu\u0107i da su okida\u010di i <code>ON CONFLICT<\/code> pokazali se potrebnima na nekoliko mjesta, za njihovo izvr\u0161avanje napravili smo privremenu <b>proksi-tablicu<\/b>.<\/li>\n<li><b>Rije\u0161ili smo se \"rutiranja\"<\/b> u okida\u010dima \u2014 odnosno od <code>EXECUTE<\/code>.<\/li>\n<li>Izvukli smo odvojeno <b>predlo\u017eak-tablicu sa svim indeksima<\/b>, tako da oni \u010dak nisu ni prisutni na proksi-tablici.<\/li>\n<\/ol>\n<p>\n<img decoding=\"async\" alt=\"Pi\u0161emo u PostgreSQL na subluminaciji: 1 host, 1 dan, 1TB.\" src=\"\/wp-content\/uploads\/2020\/04\/db3118798357575568489f6b575373b6.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nNapokon, nakon svega toga, nativno smo sekcionirali glavnu tablicu. Stvaranje nove sekcije za sada je ostalo na savjesti aplikacije.<\/p>\n<h4>\"Re\u017eemo\" rje\u010dnike<\/h4>\n<p>\nKao i u svakom analiti\u010dkom sustavu, imali smo i mi <b>\"\u010dinjenice\" i \"rezove\"<\/b> (rje\u010dnici). U na\u0161em slu\u010daju, kao takvi, pojavili su se, na primjer, <noindex><a rel=\"nofollow\" href=\"https:\/\/youtu.be\/5XKbFb-l5Do?t=2487\">tijelo \"predlo\u0161ka\"<\/a><\/noindex> jednoli\u010dnih sporih upita ili tekst samog upita.<\/p>\n<p>\"\u010cinjenice\" su nam ve\u0107 bile sekcionirane po danima, tako da smo mirno brisali zastarjele sekcije, a one nam nisu smetale (logovi!). Ali, s rje\u010dnicima je bio problem...<\/p>\n<p>Ne mo\u017ee se re\u0107i da ih je bilo previ\u0161e, ali otprilike <b>na 100TB \"\u010dinjenica\" dobio se rje\u010dnik od 2.5TB.<\/b>. Iz takve tablice nije lako ni\u0161ta izbrisati, ni komprimirati u razumnom vremenu, a i zapis u nju postajao je sve sporiji.<\/p>\n<p>Izgleda kao rje\u010dnik\u2026 u njemu bi svaki zapis trebao biti predstavljen upravo jednom\u2026 i to je to\u010dno, ali!.. Nitko nam ne brani imati <b>po jedan rje\u010dnik za svaki dan<\/b>! Da, to donosi odre\u0111enu suvi\u0161nost, ali omogu\u0107uje:<\/p>\n<ul>\n<li><b>br\u017ee pisanje\/\u010ditanje<\/b> zahvaljuju\u0107i manjoj veli\u010dini sekcije<\/li>\n<li><b>tro\u0161iti manje memorije<\/b> zbog rada s kompaktnijim indeksima<\/li>\n<li><b>pohraniti manje podataka<\/b> zahvaljuju\u0107i mogu\u0107nosti brzog brisanja zastarjelih<\/li>\n<\/ul>\n<p>\nKao rezultat cijelog kompleksa mjera <b>optere\u0107enje CPU-a smanjeno je za ~30%, na disku \u2014 za ~50%<\/b>:<\/p>\n<p><img decoding=\"async\" alt=\"Pi\u0161emo u PostgreSQL na subluminaciji: 1 host, 1 dan, 1TB.\" src=\"\/wp-content\/uploads\/2020\/04\/fd3a219a304dc46173a7eb435502fe02.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nNastavili smo zapisivati u bazu iste podatke, ali s manjim optere\u0107enjem.<\/p>\n<h2>#2. \u042d\u0432\u043e\u043b\u044e\u0446\u0438\u044f \u0438 \u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u043d\u0433 \u0411\u0414<\/h2>\n<p>\nDakle, stali smo na tome da imamo <b>sekciju za svaki dan<\/b> s podacima. U su\u0161tini, <code>CHECK (dt = '2018-10-12'::date)<\/code> je klju\u010d sekcioniranja i uvjet koji odre\u0111uje upisivanje zapisa u konkretnu sekciju.<\/p>\n<p>Budu\u0107i da se svi izvje\u0161taji u na\u0161oj usluzi kreiraju prema odre\u0111enom datumu, indeksi iz \"nesekcioniranih vremena\" tako\u0111er su bili svi <i>(Server, <b>Datum<\/b>, Predlo\u017eak plana)<\/i>, <i>(Server, <b>Datum<\/b>, \u010cvor plana)<\/i>, <i>(<b>Datum<\/b>, Klasa pogre\u0161ke, Server)<\/i>,\u2026<\/p>\n<p>No sada svaka sekcija ima <u>svoje instance<\/u> svakog od tih indeksa\u2026 I unutar svake sekcije <u>datum je konstantan<\/u>\u2026 Dakle, sada jednostavno upisujemo konstantu <b>kao jedno od polja u svaki takav indeks, \u0161to pove\u0107ava i njegovu veli\u010dinu i vrijeme pretra\u017eivanja, ali ne donosi ni\u0161ta korisno. Ostavili smo sebi zamke, ups\u2026<\/b> Pristup optimizaciji je o\u010digledan \u2014 jednostavno<\/p>\n<p><img decoding=\"async\" alt=\"Pi\u0161emo u PostgreSQL na subluminaciji: 1 host, 1 dan, 1TB.\" src=\"\/wp-content\/uploads\/2020\/04\/c7644644b960c568c4adaeec57cfef2d.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nuklanjamo polje s datumom iz svih indeksa <b>na sekcioniranim tablicama. U na\u0161im koli\u010dinama, dobitak je otprilike<\/b> 1TB\/tjedan <b>A sada primijetimo da tu terabajt jo\u0161 treba nekako zapisati. To zna\u010di da dodatno<\/b>!<\/p>\n<p>disk tako\u0111er treba manje optere\u0107ivati <b>! Na ovoj slici dobro se vidi postignuti u\u010dinak nakon \u010di\u0161\u0107enja kojem smo posvetili tjedan:<\/b>Jedna od velikih problema optere\u0107enih sustava je<\/p>\n<p><img decoding=\"async\" alt=\"Pi\u0161emo u PostgreSQL na subluminaciji: 1 host, 1 dan, 1TB.\" src=\"\/wp-content\/uploads\/2020\/04\/f45e3b26337074a07751ea28961009bf.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h2>#3. \u00ab\u0420\u0430\u0437\u043c\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u00bb \u043f\u0438\u043a\u043e\u0432\u0443\u044e \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0443<\/h2>\n<p>\nvi\u0161ak sinkronizacije <b>nepotrebnih operacija. Ponekad \"jer nisu primijetili\", ponekad \"jer je tako bilo lak\u0161e\", ali prije ili kasnije to se mora eliminirati.<\/b> Pribli\u017eimo prethodnu sliku \u2014 i vidimo da na\u0161 disk<\/p>\n<p>ima \"optere\u0107enje\" s dvostrukom amplitudom <b>izme\u0111u susjednih mjerenja, \u0161to o\u010dito \"statisti\u010dki\" ne bi smjelo biti pri tolikom broju operacija:<\/b> To je dovoljno lako posti\u0107i. Na\u0161 nadzor obuhvatio je ve\u0107<\/p>\n<p><img decoding=\"async\" alt=\"Pi\u0161emo u PostgreSQL na subluminaciji: 1 host, 1 dan, 1TB.\" src=\"\/wp-content\/uploads\/2020\/04\/ac3f19213cba0f111864c6dbf9a73912.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nskoro 1000 servera <b>, svaki od njih obra\u0111uje se zasebnim logi\u010dkim tokom, a svaki tok pohranjuje akumulirane informacije za slanje u bazu s odre\u0111enom periodi\u010dno\u0161\u0107u, otprilike ovako:<\/b>setInterval(sendToDB, interval)<\/p>\n<pre><code class=\"javascript\">Problemi su su\u0161tinski u tome da<\/code><\/pre>\n<p>\nsvi tokovi zapo\u010dinju otprilike u isto vrijeme <b>, pa se trenuci slanja gotovo uvijek poklapaju \"do ta\u010dke\". Ups br. 2\u2026<\/b>Na sre\u0107u, to se mo\u017ee lako ispraviti,<\/p>\n<p>dodavanjem \"slu\u010dajne\" razlike <b>u vremenu:<\/b> po vremenu:<\/p>\n<pre><code class=\"javascript\">setInterval(sendToDB, interval * (1 + 0.1 * (Math.random() - 0.5)))<\/code><\/pre>\n<p><\/p>\n<h2>#4. \u041a\u044d\u0448\u0438\u0440\u0443\u0435\u043c, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u043c\u043e\u0436\u043d\u043e<\/h2>\n<p>\nTre\u0107i tradicionalni problem visokog optere\u0107enja \u2014 <b>nedostatak predmemorije<\/b> tamo gdje bi on <i>mogao<\/i> biti.<\/p>\n<p>Na primjer, omogu\u0107ili smo analizu po \u010dvorovima plana (svi ovi <code>Seq Scan on users<\/code>), ali odmah pomisliti da su oni, u masi, isti \u2014 zaboravili smo.<\/p>\n<p>Ne, naravno, u bazu se ni\u0161ta ne pi\u0161e ponovo, to odbacuje okida\u010d s <code>INSERT ... ON CONFLICT DO NOTHING<\/code>. Ali do baze ti podaci ipak dolaze, a i nepotrebno <b>\u010ditanje za provjeru sukoba<\/b> moramo raditi. Ups br. 3\u2026<\/p>\n<p>Razlika u broju zapisa poslanih u bazu prije\/poslije uklju\u010divanja predmemorije \u2014 o\u010dita je:<\/p>\n<p><img decoding=\"async\" alt=\"Pi\u0161emo u PostgreSQL na subluminaciji: 1 host, 1 dan, 1TB.\" src=\"\/wp-content\/uploads\/2020\/04\/37fa7e64a674f03a79f2765a79ec8138.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nA ovo je \u2014 prate\u0107i pad optere\u0107enja na skladi\u0161tu:<\/p>\n<p><img decoding=\"async\" alt=\"Pi\u0161emo u PostgreSQL na subluminaciji: 1 host, 1 dan, 1TB.\" src=\"\/wp-content\/uploads\/2020\/04\/b2c563b4b41755211e77768d80f8702f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h2>U kona\u010dnici<\/h2>\n<p>\n\u201eTerabajt-u-dan\u201c samo zvu\u010di stra\u0161no. Ako sve radite ispravno, to je samo <b>2^40 bajtova \/ 86400 sekundi = ~12.5MB\/s<\/b>, \u0161to su \u010dak i stolni IDE diskovi mogli odr\u017eati. \ud83d\ude42<\/p>\n<p>A ako govorimo ozbiljno, \u010dak i uz deseterostruko \u201eiskrivljenje\u201c optere\u0107enja tijekom dana, mo\u017eete se lako uklopiti u mogu\u0107nosti modernih SSD-a.<\/p>\n<p><img decoding=\"async\" alt=\"Pi\u0161emo u PostgreSQL na subluminaciji: 1 host, 1 dan, 1TB.\" src=\"\/wp-content\/uploads\/2020\/04\/6f3f8d4636ba50f3d5401bf4e456757f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>Izvor: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/497008\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041d\u0435\u0434\u0430\u0432\u043d\u043e \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u043b, \u043a\u0430\u043a \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0442\u0438\u043f\u043e\u0432\u044b\u0445 \u0440\u0435\u0446\u0435\u043f\u0442\u043e\u0432 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c SQL-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u00ab\u043d\u0430 \u0447\u0442\u0435\u043d\u0438\u0435\u00bb \u0438\u0437 PostgreSQL-\u0431\u0430\u0437\u044b. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u0436\u0435 \u0440\u0435\u0447\u044c \u043f\u043e\u0439\u0434\u0435\u0442 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u044c \u0432 \u0411\u0414 \u0431\u0435\u0437 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u0430\u043a\u0438\u0445-\u043b\u0438\u0431\u043e \u00ab\u043a\u0440\u0443\u0442\u0438\u043b\u043e\u043a\u00bb \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0435 \u2014 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u0432 \u043f\u043e\u0442\u043e\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445. #1. \u0421\u0435\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0421\u0442\u0430\u0442\u044c\u044f \u043f\u0440\u043e \u0442\u043e, \u043a\u0430\u043a \u0438 \u0437\u0430\u0447\u0435\u043c \u0441\u0442\u043e\u0438\u0442 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u043f\u0440\u0438\u043a\u043b\u0430\u0434\u043d\u043e\u0435 \u0441\u0435\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u00ab\u0432 \u0442\u0435\u043e\u0440\u0438\u0438\u00bb [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":79029,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-79028","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.4 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041d\u0435\u0434\u0430\u0432\u043d\u043e \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u043b, \u043a\u0430\u043a \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0442\u0438\u043f\u043e\u0432\u044b\u0445 \u0440\u0435\u0446\u0435\u043f\u0442\u043e\u0432 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c SQL-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u00ab\u043d\u0430 \u0447\u0442\u0435\u043d\u0438\u0435\u00bb \u0438\u0437.\" \/>\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\/hr\/blog\/administrirovanie\/pishem-v-postgresql-na-subsvetovoj-1-host-1-day-1tb\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"hr_HR\" \/>\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\udd47\u041f\u0438\u0448\u0435\u043c \u0432 PostgreSQL \u043d\u0430 \u0441\u0443\u0431\u0441\u0432\u0435\u0442\u043e\u0432\u043e\u0439: 1 host, 1 day, 1TB | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041d\u0435\u0434\u0430\u0432\u043d\u043e \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u043b, \u043a\u0430\u043a \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0442\u0438\u043f\u043e\u0432\u044b\u0445 \u0440\u0435\u0446\u0435\u043f\u0442\u043e\u0432 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c SQL-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u00ab\u043d\u0430 \u0447\u0442\u0435\u043d\u0438\u0435\u00bb \u0438\u0437.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/hr\/blog\/administrirovanie\/pishem-v-postgresql-na-subsvetovoj-1-host-1-day-1tb\" \/>\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-04-23T17:43:19+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-04-23T17:43:19+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\udd47Pi\u0161emo u PostgreSQL na subsvjetlosnoj brzini: 1 host, 1 dan, 1TB | ProHoster","description":"Nedavno sam objasnio kako pomo\u0107u standardnih recepata pobolj\u0161ati performanse SQL upita \u201eza \u010ditanje\u201c iz.","canonical_url":"https:\/\/prohoster.info\/hr\/blog\/administrirovanie\/pishem-v-postgresql-na-subsvetovoj-1-host-1-day-1tb","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"hr_HR","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\udd47\u041f\u0438\u0448\u0435\u043c \u0432 PostgreSQL \u043d\u0430 \u0441\u0443\u0431\u0441\u0432\u0435\u0442\u043e\u0432\u043e\u0439: 1 host, 1 day, 1TB | ProHoster","og:description":"\u041d\u0435\u0434\u0430\u0432\u043d\u043e \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u043b, \u043a\u0430\u043a \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0442\u0438\u043f\u043e\u0432\u044b\u0445 \u0440\u0435\u0446\u0435\u043f\u0442\u043e\u0432 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c SQL-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u00ab\u043d\u0430 \u0447\u0442\u0435\u043d\u0438\u0435\u00bb \u0438\u0437.","og:url":"https:\/\/prohoster.info\/hr\/blog\/administrirovanie\/pishem-v-postgresql-na-subsvetovoj-1-host-1-day-1tb","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-04-23T17:43:19+00:00","article:modified_time":"2020-04-23T17:43:19+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"79028","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:46:34","updated":"2022-10-01 20:30:41","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/posts\/79028","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/comments?post=79028"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/posts\/79028\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/media\/79029"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/media?parent=79028"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/categories?post=79028"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/tags?post=79028"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}