{"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\/sv\/blog\/administrirovanie\/pishem-v-postgresql-na-subsvetovoj-1-host-1-day-1tb","title":{"rendered":"Skriver i PostgreSQL p\u00e5 subljus: 1 v\u00e4rd, 1 dag, 1TB","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Nyligen ber\u00e4ttade jag hur man med hj\u00e4lp av standardrecept <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/tensor\/blog\/492694\/\">kan \u00f6ka prestandan f\u00f6r SQL-fr\u00e5gor \"f\u00f6r l\u00e4sning\"<\/a><\/noindex> fr\u00e5n PostgreSQL-databasen. Idag handlar det om hur <b>man kan g\u00f6ra skrivning<\/b> till databasen mer effektiv utan att anv\u00e4nda n\u00e5gra \"justeringar\" i konfigurationen \u2013 helt enkelt genom att organisera datastreams p\u00e5 r\u00e4tt s\u00e4tt.<\/p>\n<p><img decoding=\"async\" alt=\"Skriver i PostgreSQL p\u00e5 subljus: 1 v\u00e4rd, 1 dag, 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>\nEn artikel om hur och varf\u00f6r man b\u00f6r organisera <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/483170\/\">applikationsseparation \"i teorin\"<\/a><\/noindex> har redan funnits, h\u00e4r handlar det om praktisk till\u00e4mpning av vissa metoder inom ramen f\u00f6r v\u00e5r <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/487380\/\">\u00f6vervakningstj\u00e4nst f\u00f6r hundratals PostgreSQL-servrar<\/a><\/noindex>.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h4>\u00abTider som har svunnit\u2026\u00bb<\/h4>\n<p>\nTill en b\u00f6rjan, precis som varje MVP, startade v\u00e5rt projekt under en ganska l\u00e5g belastning \u2013 \u00f6vervakningen skedde endast f\u00f6r ett dussin av de mest kritiska servrarna, alla tabeller var relativt kompakta\u2026 Men tiden gick och antalet \u00f6vervakade v\u00e4rdar \u00f6kade, och n\u00e4r vi f\u00f6rs\u00f6kte g\u00f6ra n\u00e5got med en av <b>tabellerna som var 1,5 TB<\/b>, ins\u00e5g vi att det visserligen gick att leva s\u00e5, men det var mycket obekv\u00e4mt.<\/p>\n<p>Tiderna var n\u00e4stan legendariska och olika versioner av PostgreSQL 9.x var aktuella, s\u00e5 all separation fick g\u00f6ras \"manuellt\" \u2013 genom <b>tabell\u00e4rv och triggar<\/b> routing med dynamiska <code>K\u00d6R<\/code>.<\/p>\n<p><img decoding=\"async\" alt=\"Skriver i PostgreSQL p\u00e5 subljus: 1 v\u00e4rd, 1 dag, 1TB\" src=\"\/wp-content\/uploads\/2020\/04\/a480e75ccec73080aa2d0be1435d2a2e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nDen l\u00f6sning som uppstod visade sig vara tillr\u00e4ckligt universell f\u00f6r att kunna \u00f6verf\u00f6ras till alla tabeller:<\/p>\n<ul>\n<li>En tom \"huvud\"-f\u00f6r\u00e4ldratabell deklarerades, d\u00e4r alla <b>n\u00f6dv\u00e4ndiga index och triggar beskrevs<\/b>.<\/li>\n<li>Skrivning fr\u00e5n klientens perspektiv gjordes i \"rot\"-tabellen, och inuti med hj\u00e4lp av <b>ruttrigger<\/b> <code>BEFORE INSERT<\/code> inspelningen \u00abfysiskt\u00bb lades in i r\u00e4tt avsnitt. Om det inte redan fanns en s\u00e5dan - f\u00e5ngade vi undantaget och \u2026<\/li>\n<li>\u2026 med hj\u00e4lp av <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/492464\/\"><code>CREATE TABLE ... (LIKE ... INCLUDING ...)<\/code><\/a><\/noindex> skapades en <b>sektion med begr\u00e4nsning p\u00e5 r\u00e4tt datum<\/b>, s\u00e5 att n\u00e4r data h\u00e4mtades gjordes l\u00e4sningen endast i den.<\/li>\n<\/ul>\n<p><\/p>\n<h4>PG10: f\u00f6rsta f\u00f6rs\u00f6ket<\/h4>\n<p>\nMen sektionering genom arv har historiskt sett inte varit s\u00e4rskilt anpassad f\u00f6r att hantera en aktiv skrivstr\u00f6m eller ett stort antal underordnade sektioner. Till exempel kan man minnas att algoritmen f\u00f6r att v\u00e4lja r\u00e4tt sektion hade <b>kvadratisk komplexitet<\/b>, vilket, med 100+ sektioner, fungerar, ja ni f\u00f6rst\u00e5r ju hur\u2026<\/p>\n<p>I PG10 har denna situation optimerats kraftigt, med st\u00f6d f\u00f6r <noindex><a rel=\"nofollow\" href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/10\/ddl-partitioning\">inbyggd sektionering<\/a><\/noindex>. D\u00e4rf\u00f6r f\u00f6rs\u00f6kte vi direkt anv\u00e4nda det efter migreringen av lagringen, men\u2026<\/p>\n<p>N\u00e4r vi gr\u00e4vde igenom manualen visade det sig att den nativt partitionerade tabellen i denna version:<\/p>\n<ul>\n<li>inte st\u00f6djer beskrivning av index<\/li>\n<li>inte st\u00f6der triggers p\u00e5 den<\/li>\n<li>kan inte vara ingen \"avkomling\"<\/li>\n<li>st\u00f6djer inte <code>INSERT ... ON CONFLICT<\/code><\/li>\n<li>kan inte automatiskt generera partition<\/li>\n<\/ul>\n<p>\nEfter att ha f\u00e5tt en sm\u00e4ll i pannan med en kratta ins\u00e5g vi att vi inte skulle kunna klara oss utan att modifiera applikationen, och vi sk\u00f6t upp vidare forskning i sex m\u00e5nader.<\/p>\n<h4>PG10: en andra chans<\/h4>\n<p>\nS\u00e5 vi b\u00f6rjade l\u00f6sa de uppkomna problemen ett i taget:<\/p>\n<ol>\n<li>Eftersom triggers och <code>ON CONFLICT<\/code> visade sig vara n\u00f6dv\u00e4ndiga p\u00e5 vissa st\u00e4llen, f\u00f6r att hantera dem skapade vi en mellan- <b>proxy-tabell<\/b>.<\/li>\n<li><b>Vi blev av med \"routing\"<\/b> i triggers \u2014 det vill s\u00e4ga av <code>K\u00d6R<\/code>.<\/li>\n<li>Vi separerade ut <b>en malltabell med alla index<\/b>, s\u00e5 att de inte ens skulle finnas i proxy-tabellen.<\/li>\n<\/ol>\n<p>\n<img decoding=\"async\" alt=\"Skriver i PostgreSQL p\u00e5 subljus: 1 v\u00e4rd, 1 dag, 1TB\" src=\"\/wp-content\/uploads\/2020\/04\/db3118798357575568489f6b575373b6.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nTill slut, efter allt detta, partitionerade vi den huvudsakliga tabellen nativt. Att skapa en ny partition blev kvar p\u00e5 applikationens samvete.<\/p>\n<h4>\"Vi skapar\" ordb\u00f6cker<\/h4>\n<p>\nPrecis som i varje analytiskt system hade vi ocks\u00e5 <b>\"fakta\" och \"dimensioner\"<\/b> (ordb\u00f6cker). I v\u00e5rt fall var detta till exempel <noindex><a rel=\"nofollow\" href=\"https:\/\/youtu.be\/5XKbFb-l5Do?t=2487\">kroppen av \"mallen\"<\/a><\/noindex> av typiska l\u00e5ngsamma f\u00f6rfr\u00e5gningar eller sj\u00e4lva texten av f\u00f6rfr\u00e5gningen.<\/p>\n<p>\"Fakta\" hade vi redan partitionerat efter dagar ganska l\u00e4nge, s\u00e5 vi tog lugnt bort f\u00f6r\u00e5ldrade partitioner, och de st\u00f6rde oss inte (loggarna allts\u00e5!). Men med ordb\u00f6ckerna blev det problem\u2026<\/p>\n<p>Inte f\u00f6r att det fanns mycket av dem, men ungef\u00e4r <b>f\u00f6r 100TB \"fakta\" fick vi ett ordbok p\u00e5 2,5TB.<\/b>. Fr\u00e5n en s\u00e5dan tabell \u00e4r det bekv\u00e4mt att inte ta bort n\u00e5got, inte komprimera p\u00e5 rimlig tid, och skrivningen blev gradvis allt l\u00e5ngsammare.<\/p>\n<p>S\u00e4rskilt ordboken\u2026 varje post b\u00f6r representeras exakt en g\u00e5ng\u2026 och det \u00e4r korrekt, men!.. Ingen hindrar oss fr\u00e5n att ha <b>en separat ordbok f\u00f6r varje dag<\/b>! Ja, det ger viss \u00f6verfl\u00f6d, men det m\u00f6jligg\u00f6r:<\/p>\n<ul>\n<li><b>att skriva\/l\u00e4sa snabbare<\/b> tack vare mindre storlek p\u00e5 partitionen<\/li>\n<li><b>att anv\u00e4nda mindre minne<\/b> tack vare arbete med mer kompakta index<\/li>\n<li><b>att lagra mindre data<\/b> tack vare m\u00f6jligheten till snabb radering av f\u00f6r\u00e5ldrade<\/li>\n<\/ul>\n<p>\nSom ett resultat av hela \u00e5tg\u00e4rdskomplexet <b>minskade CPU-belastningen med ~30%, diskbelastningen med ~50%<\/b>:<\/p>\n<p><img decoding=\"async\" alt=\"Skriver i PostgreSQL p\u00e5 subljus: 1 v\u00e4rd, 1 dag, 1TB\" src=\"\/wp-content\/uploads\/2020\/04\/fd3a219a304dc46173a7eb435502fe02.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nUnder tiden fortsatte vi att skriva till databasen exakt detsamma, bara med mindre belastning.<\/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>\nS\u00e5 vi stannade vid att vi har <b>en sektion f\u00f6r varje dag<\/b> med data. Faktiskt, <code>CHECK (dt = '2018-10-12'::date)<\/code> \u2014 \u00e4r nyckeln f\u00f6r sektioneringen och villkoret f\u00f6r att en post ska hamna i en specifik sektion.<\/p>\n<p>Eftersom alla rapporter i v\u00e5r tj\u00e4nst byggs upp i samband med ett specifikt datum, s\u00e5 hade ocks\u00e5 indexen fr\u00e5n \"icke-sektionerade tider\" alltid varit av typen <i>(Server, <b>Datum<\/b>, Planmall)<\/i>, <i>(Server, <b>Datum<\/b>, Plannod)<\/i>, <i>(<b>Datum<\/b>, Felklass, Server)<\/i>,\u2026<\/p>\n<p>Men nu finns det <u>egna instanser<\/u> av varje s\u00e5dant index... Och inom varje sektion <u>\u00e4r datumet en konstant<\/u>\u2026 S\u00e5 nu skriver vi bokstavligen in konstanten <b>som ett av f\u00e4lten i varje s\u00e5dant index, vilket g\u00f6r b\u00e5de dess volym och s\u00f6ktiden st\u00f6rre, men utan att ge n\u00e5got resultat. Vi har l\u00e4mnat oss sj\u00e4lva f\u00e4llor, oops...<\/b> Riktningen f\u00f6r optimeringen \u00e4r uppenbar \u2014 helt enkelt<\/p>\n<p><img decoding=\"async\" alt=\"Skriver i PostgreSQL p\u00e5 subljus: 1 v\u00e4rd, 1 dag, 1TB\" src=\"\/wp-content\/uploads\/2020\/04\/c7644644b960c568c4adaeec57cfef2d.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\ntar vi bort f\u00e4ltet med datum fr\u00e5n alla index <b>i sektionerade tabeller. Med v\u00e5ra volymer ger det en vinst p\u00e5 omkring<\/b> 1TB\/vecka <b>Och nu l\u00e5t oss notera att denna terabyte ocks\u00e5 m\u00e5ste registreras p\u00e5 n\u00e5got s\u00e4tt. Det vill s\u00e4ga vi m\u00e5ste nu ocks\u00e5<\/b>!<\/p>\n<p>belasta disken mindre <b>! Denna bild visar tydligt effekten av den st\u00e4dning vi \u00e4gnade en vecka \u00e5t:<\/b>Ett av de stora problemen med belastade system \u00e4r<\/p>\n<p><img decoding=\"async\" alt=\"Skriver i PostgreSQL p\u00e5 subljus: 1 v\u00e4rd, 1 dag, 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>\n\u00f6verskottssynkronisering <b>av vissa operationer som inte kr\u00e4ver det. Ibland \"f\u00f6r att man inte m\u00e4rkte\", ibland \"f\u00f6r att det var enklare\", men f\u00f6rr eller senare m\u00e5ste man g\u00f6ra sig av med den.<\/b> Vi zoomar in p\u00e5 den tidigare bilden \u2014 och ser att disken<\/p>\n<p>\"drar\" i belastning med dubbla amplituden <b>mellan n\u00e4rliggande m\u00e4tningar, vilket uppenbarligen \"statistiskt\" inte borde h\u00e4nda med s\u00e5 mycket operationer:<\/b> Det \u00e4r ganska enkelt att uppn\u00e5. Vi hade redan<\/p>\n<p><img decoding=\"async\" alt=\"Skriver i PostgreSQL p\u00e5 subljus: 1 v\u00e4rd, 1 dag, 1TB\" src=\"\/wp-content\/uploads\/2020\/04\/ac3f19213cba0f111864c6dbf9a73912.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nn\u00e4stan 1000 servrar <b>, var och en hanteras av en separat logisk str\u00f6m, och varje str\u00f6m skickar den insamlade informationen f\u00f6r att skickas till databasen med en viss periodicitet, ungef\u00e4r s\u00e5 h\u00e4r:<\/b>setInterval(sendToDB, interval)<\/p>\n<pre><code class=\"javascript\">Problemet h\u00e4r ligger precis i det att<\/code><\/pre>\n<p>\nalla str\u00f6mmar startar n\u00e4stan samtidigt <b>, s\u00e5 tidpunkterna f\u00f6r att skicka sammanfaller n\u00e4stan alltid \"till punkt\". Oops nr 2...<\/b>Lyckligtvis kan detta fixas ganska enkelt,<\/p>\n<p>genom att l\u00e4gga till en \"slumptalsbaserad\" f\u00f6rskjutning <b>i tid:<\/b> setInterval(sendToDB, interval * (1 + 0.1 * (Math.random() - 0.5)))<\/p>\n<pre><code class=\"javascript\">Det tredje traditionella highload-problemet \u2014<\/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>\n\u00e4r fr\u00e5nvaron av cache <b>d\u00e4r den<\/b> borde vara. <i>skulle kunna<\/i> vara.<\/p>\n<p>Till exempel har vi m\u00f6jliggjort analys p\u00e5 planens nodniv\u00e5 (alla dessa <code>Seq Scan p\u00e5 anv\u00e4ndare<\/code>), men att direkt t\u00e4nka att de, i huvudsak, \u00e4r identiska \u2014 \u00e4r gl\u00f6mt.<\/p>\n<p>Nej, sj\u00e4lvklart skrivs inget upprepade g\u00e5nger till databasen, det blockerar triggern med <code>INSERT ... ON CONFLICT DO NOTHING<\/code>. Men dessa data n\u00e5r fortfarande databasen, och dessutom kr\u00e4vs det on\u00f6dig <b>l\u00e4sning f\u00f6r att kontrollera konflikten<\/b> m\u00e5ste g\u00f6ras. Oops nr 3\u2026<\/p>\n<p>Skillnaden i m\u00e4ngden poster som skickas till databasen f\u00f6re\/efter aktivering av cachning \u2014 \u00e4r uppenbar:<\/p>\n<p><img decoding=\"async\" alt=\"Skriver i PostgreSQL p\u00e5 subljus: 1 v\u00e4rd, 1 dag, 1TB\" src=\"\/wp-content\/uploads\/2020\/04\/37fa7e64a674f03a79f2765a79ec8138.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nOch detta \u2014 \u00e4r det tillh\u00f6rande minskningen av belastningen p\u00e5 lagringen:<\/p>\n<p><img decoding=\"async\" alt=\"Skriver i PostgreSQL p\u00e5 subljus: 1 v\u00e4rd, 1 dag, 1TB\" src=\"\/wp-content\/uploads\/2020\/04\/b2c563b4b41755211e77768d80f8702f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h2>Sammanfattningsvis<\/h2>\n<p>\n\u00abTerabyte-per-dag\u00bb l\u00e5ter bara skr\u00e4mmande. Om du g\u00f6r allt r\u00e4tt, s\u00e5 handlar det bara om <b>2^40 byte \/ 86400 sekunder = ~12.5MB\/s<\/b>, vilket \u00e4ven konsumerades av station\u00e4ra IDE-h\u00e5rddiskar. \ud83d\ude42<\/p>\n<p>Och om vi ska vara seri\u00f6sa, s\u00e5 kan du \u00e4ven med en tiodubblad belastning under ett dygn, l\u00e4tt klara av kapaciteten hos moderna SSD:er.<\/p>\n<p><img decoding=\"async\" alt=\"Skriver i PostgreSQL p\u00e5 subljus: 1 v\u00e4rd, 1 dag, 1TB\" src=\"\/wp-content\/uploads\/2020\/04\/6f3f8d4636ba50f3d5401bf4e456757f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>K\u00e4lla: <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\/sv\/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=\"sv_SE\" \/>\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\/sv\/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\udd47Vi skriver i PostgreSQL p\u00e5 ljusets hastighet: 1 host, 1 dag, 1TB | ProHoster","description":"Nyligen ber\u00e4ttade jag hur man med typiska recept kan \u00f6ka prestandan f\u00f6r SQL-fr\u00e5gor \u00abl\u00e4sning\u00bb fr\u00e5n.","canonical_url":"https:\/\/prohoster.info\/sv\/blog\/administrirovanie\/pishem-v-postgresql-na-subsvetovoj-1-host-1-day-1tb","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sv_SE","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\/sv\/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\/sv\/wp-json\/wp\/v2\/posts\/79028","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/comments?post=79028"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts\/79028\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media\/79029"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media?parent=79028"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/categories?post=79028"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/tags?post=79028"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}