{"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\/da\/blog\/administrirovanie\/pishem-v-postgresql-na-subsvetovoj-1-host-1-day-1tb","title":{"rendered":"Vi skriver i PostgreSQL p\u00e5 relativistisk m\u00e5de: 1 v\u00e6rt, 1 dag, 1TB","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>For nylig fortalte jeg, hvordan man kan bruge standardopskrifter <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/tensor\/blog\/492694\/\">til at \u00f8ge ydeevnen af SQL-foresp\u00f8rgsler \"til l\u00e6sning\"<\/a><\/noindex> fra PostgreSQL-databasen. I dag vil jeg tale om, hvordan <b>man kan g\u00f8re skriveoperationer<\/b> i databasen mere effektive uden at bruge nogen \"drejeknapper\" i konfigurationen - blot ved at organisere datastreams korrekt.<\/p>\n<p><img decoding=\"async\" alt=\"Vi skriver i PostgreSQL p\u00e5 relativistisk m\u00e5de: 1 v\u00e6rt, 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>\nArtiklen handler om, hvordan og hvorfor man b\u00f8r organisere <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/483170\/\">applikationspartitionering \"i teorien\"<\/a><\/noindex> har allerede v\u00e6ret, men her vil jeg tale om praksis med at anvende nogle tilgange inden for vores <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/487380\/\">overv\u00e5gningstjeneste for hundrede af PostgreSQL-servere<\/a><\/noindex>.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h4>\u00abSager fra l\u00e6nge siden&#8230;\u00bb<\/h4>\n<p>\nOprindeligt, som ethvert MVP, startede vores projekt under en relativt lille belastning - overv\u00e5gning blev kun udf\u00f8rt for et dusin af de mest kritiske servere, og alle tabeller var relativt kompakte... Men tiden gik, antallet af overv\u00e5gede v\u00e6rter voksede, og da vi endnu en gang fors\u00f8gte at g\u00f8re noget med en af <b>tabellerne p\u00e5 1,5 TB<\/b>, inds\u00e5 vi, at det var muligt at leve s\u00e5dan, men meget besv\u00e6rligt.<\/p>\n<p>Tiderne var n\u00e6sten mytologiske, forskellige versioner af PostgreSQL 9.x var aktuelle, s\u00e5 al partitionering m\u00e5tte g\u00f8res \"manuelt\" - gennem <b>tabelarv og triggere<\/b> ruting med dynamisk <code>EXECUTE<\/code>.<\/p>\n<p><img decoding=\"async\" alt=\"Vi skriver i PostgreSQL p\u00e5 relativistisk m\u00e5de: 1 v\u00e6rt, 1 dag, 1TB\" src=\"\/wp-content\/uploads\/2020\/04\/a480e75ccec73080aa2d0be1435d2a2e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nDen resulterende l\u00f8sning viste sig at v\u00e6re tilstr\u00e6kkelig alsidig til at kunne overf\u00f8res til alle tabeller:<\/p>\n<ul>\n<li>Der blev erkl\u00e6ret en tom \"overskridende\" for\u00e6lder tabel, hvor alle <b>n\u00f8dvendige indekser og triggere blev beskrevet.<\/b>.<\/li>\n<li>Skrivning fra klientens perspektiv blev foretaget i den \"rodnede\" tabel, og indeni blev det med hj\u00e6lp fra <b>routing-triggeren<\/b> <code>BEFORE INSERT<\/code> optagelsen blev \u00abfysisk\u00bb indsat i den relevante sektion. Hvis en s\u00e5dan ikke eksisterede \u2014 fangede vi undtagelsen og &#8230;<\/li>\n<li>\u2026 hjalp ved at <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/492464\/\"><code>CREATE TABLE ... (LIKE ... INCLUDING ...)<\/code><\/a><\/noindex> if\u00f8lge skabelonen for for\u00e6lder-tabellen blev der oprettet en <b>sektion med en begr\u00e6nsning p\u00e5 den n\u00f8dvendige dato<\/b>, s\u00e5 ved dataudtr\u00e6kning blev l\u00e6sningen kun udf\u00f8rt i den.<\/li>\n<\/ul>\n<p><\/p>\n<h4>PG10: f\u00f8rste fors\u00f8g<\/h4>\n<p>\nMen partitioneringen gennem arv har historisk set ikke v\u00e6ret s\u00e6rlig godt egnet til arbejdet med aktiv skriveflow eller et stort antal sektioner som afkom. For eksempel kan vi huske, at algoritmen til valg af den n\u00f8dvendige sektion havde <b>kvadratisk kompleksitet<\/b>, hvilket ved 100+ sektioner fungerer, som man kan forst\u00e5...<\/p>\n<p>I PG10 blev denne situation betydeligt optimeret ved at implementere underst\u00f8ttelse af <noindex><a rel=\"nofollow\" href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/10\/ddl-partitioning\">indf\u00f8dte partitionering.<\/a><\/noindex>Derfor pr\u00f8vede vi straks at anvende det efter migrationen af lageret, men\u2026<\/p>\n<p>Som det viste sig efter at have gennemg\u00e5et manualen, underst\u00f8tter den natively sektionerede tabel i denne version:<\/p>\n<ul>\n<li>underst\u00f8tter ikke beskrivelse af indekser<\/li>\n<li>underst\u00f8tter ikke triggere<\/li>\n<li>kan ikke v\u00e6re nogen 'efterkommer'<\/li>\n<li>underst\u00f8tter ikke <code>INSERT ... ON CONFLICT<\/code><\/li>\n<li>kan ikke generere sektion automatisk<\/li>\n<\/ul>\n<p>\nEfter at have f\u00e5et en god ordre med en rake i hovedet, inds\u00e5 vi, at vi ikke kunne undg\u00e5 at modificere appen, og vi udsk\u00f8d yderligere unders\u00f8gelser i et halv\u00e5r.<\/p>\n<h4>PG10: en ny chance<\/h4>\n<p>\nS\u00e5 vi begyndte at l\u00f8se de opst\u00e5ede problemer \u00e9n ad gangen:<\/p>\n<ol>\n<li>Da triggere og <code>ON CONFLICT<\/code> viste sig at v\u00e6re n\u00f8dvendige et par steder, lavede vi en midlertidig <b>proxy-tabel<\/b>.<\/li>\n<li><b>Vi fjernede 'routing'<\/b> i triggere \u2013 hvilket vil sige <code>EXECUTE<\/code>.<\/li>\n<li>Vi udspecificerede <b>skabelon-tabellen med alle indekser<\/b>, s\u00e5 de ikke engang var til stede p\u00e5 proxy-tabellen.<\/li>\n<\/ol>\n<p>\n<img decoding=\"async\" alt=\"Vi skriver i PostgreSQL p\u00e5 relativistisk m\u00e5de: 1 v\u00e6rt, 1 dag, 1TB\" src=\"\/wp-content\/uploads\/2020\/04\/db3118798357575568489f6b575373b6.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nEndelig, efter alt dette, lavede vi natively en sektion af hovedtabellen. Oprettelsen af en ny sektion forblev stadig p\u00e5 applikationens samvittighed.<\/p>\n<h4>Vi 'sk\u00e6rer' dom\u00e6ner<\/h4>\n<p>\nSom i ethvert analytisk system havde vi ogs\u00e5 <b>fakta og dimensioner<\/b> (dom\u00e6ner). I vores tilf\u00e6lde var det for eksempel <noindex><a rel=\"nofollow\" href=\"https:\/\/youtu.be\/5XKbFb-l5Do?t=2487\">kroppen af 'skabelonen'<\/a><\/noindex> ensartede langsomme foresp\u00f8rgsler eller selve foresp\u00f8rgslen.<\/p>\n<p>Fakta havde vi allerede sektioneret efter dage i lang tid, s\u00e5 vi kunne roligt slette for\u00e6ldede sektioner, hvilket ikke generede os (logs jo!). Men med dom\u00e6nerne opstod der problemer\u2026<\/p>\n<p>Det er ikke, at der var s\u00e5 mange af dem, men omkring <b>for 100TB 'fakta' havde vi et dom\u00e6ne p\u00e5 2.5TB.<\/b>Fra s\u00e5dan en tabel er det nemt ikke at kunne slette noget, ikke at kunne komprimere det p\u00e5 en rimelig tid, og indsendelse til det blev gradvist langsommere.<\/p>\n<p>Det ser ud til, at dom\u00e6net... hver post skal pr\u00e6senteres pr\u00e6cist \u00e9n gang\u2026 og det er rigtigt, men!.. Ingen forhindrer os i at have <b>et separat dom\u00e6ne for hver dag<\/b>! Ja, det giver en vis redundans, men det g\u00f8r det muligt at:<\/p>\n<ul>\n<li><b>skrive\/l\u00e6se hurtigere<\/b> p\u00e5 grund af den mindre st\u00f8rrelse af sektionen<\/li>\n<li><b>forbruge mindre hukommelse<\/b> ved at arbejde med mere kompakte indekser<\/li>\n<li><b>opbevare f\u00e6rre data<\/b> ved at kunne hurtigt slette for\u00e6ldede<\/li>\n<\/ul>\n<p>\nSom et resultat af hele denne proces <b>blev CPU-belastningen reduceret med ca. 30%, mens diskbelastningen faldt med ca. 50%<\/b>:<\/p>\n<p><img decoding=\"async\" alt=\"Vi skriver i PostgreSQL p\u00e5 relativistisk m\u00e5de: 1 v\u00e6rt, 1 dag, 1TB\" src=\"\/wp-content\/uploads\/2020\/04\/fd3a219a304dc46173a7eb435502fe02.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nSamtidig fortsatte vi med at skrive n\u00f8jagtig det samme til databasen, blot 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 stoppede ved det punkt, at vi har <b>en sektion for hver dag<\/b> med data. Rent faktisk, <code>CHECK (dt = '2018-10-12'::date)<\/code> \u2014 og det er partitioneringsn\u00f8glen og betingelsen for at placere posten i den specifikke sektion.<\/p>\n<p>Da alle rapporter i vores service opbygges i forhold til en specifik dato, s\u00e5 var indeksene allerede fra de \"upartitionerede tider\" alle af typen <i>(Server, <b>Dato<\/b>, Skabelonplan)<\/i>, <i>(Server, <b>Dato<\/b>, Plan node)<\/i>, <i>(<b>Dato<\/b>, Fejlkode, Server)<\/i>,\u2026<\/p>\n<p>Men nu bor der p\u00e5 hver sektion <u>sine egne instanser<\/u> af hver af disse indekser\u2026 Og inden for hver sektion <u>er datoen en konstant<\/u>\u2026 S\u00e5 nu skriver vi simpelthen konstanten ind i hvert s\u00e5dant indeks <b>som et af felterne, hvilket \u00f8ger b\u00e5de dets volumen og s\u00f8getid, men ikke bringer nogen resultater. Vi har gjort tingene sv\u00e6rere for os selv, ups\u2026<\/b> Retningen for optimeringen er \u00e5benlys \u2014 vi fjerner blot<\/p>\n<p><img decoding=\"async\" alt=\"Vi skriver i PostgreSQL p\u00e5 relativistisk m\u00e5de: 1 v\u00e6rt, 1 dag, 1TB\" src=\"\/wp-content\/uploads\/2020\/04\/c7644644b960c568c4adaeec57cfef2d.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nfeltet med datoen fra alle indekser <b>p\u00e5 partitionerede tabeller. Med vores volumer er besparelsen omkring<\/b> 1TB\/uge <b>Og nu lad os bem\u00e6rke, at denne terabyte endnu skal skrives. Alts\u00e5 skal vi ogs\u00e5<\/b>!<\/p>\n<p>belaste disken mindre nu <b>! P\u00e5 dette billede er den opn\u00e5ede effekt fra den rensning, som vi dedikerede en uge til, godt synlig:<\/b>En af de store problemer i belastede systemer er<\/p>\n<p><img decoding=\"async\" alt=\"Vi skriver i PostgreSQL p\u00e5 relativistisk m\u00e5de: 1 v\u00e6rt, 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>\noverfl\u00f8dig synkronisering <b>af operationer, som ikke kr\u00e6ver det. Nogle gange \"fordi vi ikke lagde m\u00e6rke til det\", nogle gange \"fordi det var lettere\", men f\u00f8r eller siden m\u00e5 vi slippe af med den.<\/b> Vi n\u00e6rmer os det forrige billede \u2014 og ser, at disken her<\/p>\n<p>\"tr\u00e6kker\" med en belastning med dobbelt amplitude <b>mellem n\u00e6rliggende m\u00e5linger, hvilket \u00e5benlyst ikke burde v\u00e6re \"statistisk\" givet det antal operationer:<\/b> Det er ret enkelt at opn\u00e5. Vi havde allerede registreret<\/p>\n<p><img decoding=\"async\" alt=\"Vi skriver i PostgreSQL p\u00e5 relativistisk m\u00e5de: 1 v\u00e6rt, 1 dag, 1TB\" src=\"\/wp-content\/uploads\/2020\/04\/ac3f19213cba0f111864c6dbf9a73912.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nn\u00e6sten 1000 servere <b>, hver behandles af en separat logisk str\u00f8m, og hver str\u00f8m sender den samlede information til databasen med en bestemt frekvens, omtrent s\u00e5dan:<\/b>setInterval(sendToDB, interval)<\/p>\n<pre><code class=\"javascript\">Problemet ligger lige pr\u00e6cis i, at<\/code><\/pre>\n<p>\nalle str\u00f8mme starter omtrent samtidig <b>, s\u00e5 sendetidspunkterne n\u00e6sten altid falder sammen \"til punktet\". Ups nr. 2\u2026<\/b>Heldigvis er det relativt let at rette,<\/p>\n<p>ved at tilf\u00f8je en \"tilf\u00e6ldig\" forskydning <b>i tid:<\/b> setInterval(sendToDB, interval * (1 + 0.1 * (Math.random() - 0.5)))<\/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>\nDen tredje traditionelle highload-problem er <b>manglende cache<\/b> der, hvor det <i>kunne<\/i> b\u00f8r v\u00e6re.<\/p>\n<p>For eksempel har vi lavet muligheden for at analysere efter planens noder (alle disse <code>Seq Scan on users<\/code>), men at t\u00e6nke p\u00e5, at de stort set er ens \u2013 glemte vi.<\/p>\n<p>Nej, selvf\u00f8lgelig skrives der ikke noget tilbage til databasen, det lukker triggeren med <code>INSERT ... ON CONFLICT DO NOTHING<\/code>. Men dataene n\u00e5r alligevel databasen, og der er ogs\u00e5 un\u00f8dvendig <b>l\u00e6sning til konfliktkontrol<\/b> man bliver n\u00f8dt til at lave. Ups nr. 3\u2026<\/p>\n<p>Forskellen i antallet af registreringer sendt til databasen f\u00f8r\/efter aktivering af caching er tydelig:<\/p>\n<p><img decoding=\"async\" alt=\"Vi skriver i PostgreSQL p\u00e5 relativistisk m\u00e5de: 1 v\u00e6rt, 1 dag, 1TB\" src=\"\/wp-content\/uploads\/2020\/04\/37fa7e64a674f03a79f2765a79ec8138.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nOg dette er det ledsagende fald i belastningen p\u00e5 lageret:<\/p>\n<p><img decoding=\"async\" alt=\"Vi skriver i PostgreSQL p\u00e5 relativistisk m\u00e5de: 1 v\u00e6rt, 1 dag, 1TB\" src=\"\/wp-content\/uploads\/2020\/04\/b2c563b4b41755211e77768d80f8702f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h2>I alt<\/h2>\n<p>\n\u00abTerabyte-per-dag\u00bb lyder skr\u00e6mmende. Hvis du g\u00f8r alt rigtigt, er det bare <b>2^40 bytes \/ 86400 sekunder = ~12.5MB\/s<\/b>, hvilket selv desktop IDE-hukommelsesenheder kunne h\u00e5ndtere. \ud83d\ude42<\/p>\n<p>Og hvis vi taler seri\u00f8st, s\u00e5 kan du selv med en ti gange \"sk\u00e6v\u201d belastning i l\u00f8bet af dagen nemt holde dig inden for mulighederne for moderne SSD'er.<\/p>\n<p><img decoding=\"async\" alt=\"Vi skriver i PostgreSQL p\u00e5 relativistisk m\u00e5de: 1 v\u00e6rt, 1 dag, 1TB\" src=\"\/wp-content\/uploads\/2020\/04\/6f3f8d4636ba50f3d5401bf4e456757f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>Kilde: <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.3 - 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\/da\/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.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"da_DK\" \/>\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\/da\/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 i lys af lyset: 1 host, 1 dag, 1TB | ProHoster","description":"For nylig forklarede jeg, hvordan man med standardopskrifter kan \u00f8ge ydeevnen af SQL-sp\u00f8rgsm\u00e5l \"til l\u00e6sning\" fra.","canonical_url":"https:\/\/prohoster.info\/da\/blog\/administrirovanie\/pishem-v-postgresql-na-subsvetovoj-1-host-1-day-1tb","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"da_DK","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\/da\/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\/da\/wp-json\/wp\/v2\/posts\/79028","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/comments?post=79028"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts\/79028\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media\/79029"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media?parent=79028"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/categories?post=79028"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/tags?post=79028"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}