{"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\/de\/blog\/administrirovanie\/pishem-v-postgresql-na-subsvetovoj-1-host-1-day-1tb","title":{"rendered":"Wir schreiben in PostgreSQL auf \u00dcberlichtgeschwindigkeit: 1 Host, 1 Tag, 1TB","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>K\u00fcrzlich habe ich erz\u00e4hlt, wie man mit Standardrezepten <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/tensor\/blog\/492694\/\">die Leistung von \"Lese\"-SQL-Abfragen<\/a><\/noindex> aus der PostgreSQL-Datenbank steigern kann. Heute wird es darum gehen, wie <b>man das Schreiben<\/b> in die Datenbank effizienter gestalten kann, ohne irgendwelche \"Regler\" in der Konfiguration zu verwenden \u2013 einfach durch die richtige Organisation der Datenstr\u00f6me.<\/p>\n<p><img decoding=\"async\" alt=\"Wir schreiben in PostgreSQL auf \u00dcberlichtgeschwindigkeit: 1 Host, 1 Tag, 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>\nDer Artikel behandelt, wie und warum man die <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/483170\/\">anwendungsbezogene Partitionierung \"theoretisch\"<\/a><\/noindex> organisieren sollte, hier geht es jedoch um die praktische Anwendung einiger Ans\u00e4tze in unserem <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/487380\/\">\u00dcberwachungsdienst f\u00fcr Hunderte von PostgreSQL-Servern.<\/a><\/noindex>.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h4>\u201eDie Geschichten l\u00e4ngst vergangener Tage\u2026\u201c<\/h4>\n<p>\nUrspr\u00fcnglich, wie es bei jedem MVP der Fall ist, startete unser Projekt unter einer recht geringen Last \u2013 die \u00dcberwachung fand nur f\u00fcr eine Handvoll der kritischsten Server statt, alle Tabellen waren relativ kompakt... Aber die Zeit verging, die \u00fcberwachten Hosts wurden immer mehr, und als wir erneut versuchten, etwas mit einer der <b>Tabellen mit einer Gr\u00f6\u00dfe von 1,5 TB<\/b>, stellten wir fest, dass es zwar m\u00f6glich war, so weiterzumachen, aber es war sehr umst\u00e4ndlich.<\/p>\n<p>Die Zeiten waren fast legend\u00e4r, verschiedene Versionen von PostgreSQL 9.x waren aktuell, daher musste die ganze Partitionierung \"manuell\" erfolgen \u2013 durch <b>Tabellenvererbung und Trigger<\/b> Routing mit dynamischen <code>EXECUTE<\/code>.<\/p>\n<p><img decoding=\"async\" alt=\"Wir schreiben in PostgreSQL auf \u00dcberlichtgeschwindigkeit: 1 Host, 1 Tag, 1TB\" src=\"\/wp-content\/uploads\/2020\/04\/a480e75ccec73080aa2d0be1435d2a2e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nDie entstandene L\u00f6sung erwies sich als ziemlich universell, sodass sie auf alle Tabellen anwendbar war:<\/p>\n<ul>\n<li>Es wurde eine leere \"Header\"-Elterntabelle deklariert, in der alle <b>notwendigen Indizes und Trigger beschrieben wurden.<\/b>.<\/li>\n<li>Die Aufnahme aus Sicht des Clients erfolgte in die \"Wurzel\"-Tabelle, und innerhalb davon mit <b>dem Routing-Trigger<\/b> <code>BEFORE INSERT<\/code> Der Eintrag wurde \u201ephysisch\u201c in den ben\u00f6tigten Abschnitt eingef\u00fcgt. Falls dieser noch nicht existierte, haben wir die Ausnahme abgefangen und \u2026<\/li>\n<li>... erstellten mit <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/492464\/\"><code>CREATE TABLE ... (LIKE ... INCLUDING ...)<\/code><\/a><\/noindex> nach dem Muster der Elterntabelle einen <b>Abschnitt mit einer Einschr\u00e4nkung auf das ben\u00f6tigte Datum<\/b>, damit beim Abrufen von Daten nur in diesem gelesen wurde.<\/li>\n<\/ul>\n<p><\/p>\n<h4>PG10: der erste Versuch<\/h4>\n<p>\nAber die Partitionierung \u00fcber Vererbung war historisch gesehen nicht gut geeignet f\u00fcr die Arbeit mit aktivem Schreibstrom oder einer gro\u00dfen Anzahl von Nachkommentabellen. Zum Beispiel kann man sich erinnern, dass der Algorithmus zur Auswahl des erforderlichen Abschnitts eine <b>quadratische Komplexit\u00e4t<\/b>hatte, was bei 100+ Abschnitten, wie Sie sich denken k\u00f6nnen, nicht optimal funktionierte...<\/p>\n<p>In PG10 wurde diese Situation erheblich optimiert, indem die Unterst\u00fctzung f\u00fcr <noindex><a rel=\"nofollow\" href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/10\/ddl-partitioning\">natives Partitionieren implementiert wurde.<\/a><\/noindex>. Daher haben wir versucht, es sofort nach der Migration des Speichers anzuwenden, aber\u2026<\/p>\n<p>Wie sich nach eingehendem Lesen des Handbuchs herausstellte, unterst\u00fctzt die nativ partitionierte Tabelle in dieser Version:<\/p>\n<ul>\n<li>nicht die Beschreibung von Indizes<\/li>\n<li>unterst\u00fctzt keine Trigger<\/li>\n<li>kann selbst kein \"Nachkomme\" sein<\/li>\n<li>unterst\u00fctzt <code>INSERT ... ON CONFLICT<\/code><\/li>\n<li>kann keine Sektion automatisch erzeugen<\/li>\n<\/ul>\n<p>\nNach einem schmerzhaften Schlag mit dem Rechen auf die Stirn haben wir verstanden, dass wir nicht ohne eine Modifikation der Anwendung auskommen werden, und haben die weiteren Forschungen um ein halbes Jahr verschoben.<\/p>\n<h4>PG10: Eine zweite Chance<\/h4>\n<p>\nAlso begannen wir, die aufgetretenen Probleme nacheinander zu l\u00f6sen:<\/p>\n<ol>\n<li>Da Trigger und <code>ON CONFLICT<\/code> uns an manchen Stellen doch erforderlich waren, haben wir eine Zwischen- <b>Proxy-Tabelle<\/b>.<\/li>\n<li><b>Den \"Routing\"-Prozess entfernt<\/b> in Triggern \u2014 also von <code>EXECUTE<\/code>.<\/li>\n<li>Wir haben separat <b>eine Vorlage-Tabelle mit allen Indizes erstellt<\/b>, sodass sie nicht einmal in der Proxy-Tabelle vorhanden waren.<\/li>\n<\/ol>\n<p>\n<img decoding=\"async\" alt=\"Wir schreiben in PostgreSQL auf \u00dcberlichtgeschwindigkeit: 1 Host, 1 Tag, 1TB\" src=\"\/wp-content\/uploads\/2020\/04\/db3118798357575568489f6b575373b6.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nSchlie\u00dflich, nach alledem, haben wir die Haupttabelle nativ partitioniert. Die Erstellung einer neuen Sektion blieb vorerst in der Verantwortung der Anwendung.<\/p>\n<h4>\"Wir bearbeiten\" W\u00f6rterb\u00fccher<\/h4>\n<p>\nWie in jedem analytischen System hatten wir auch <b>\"Fakten\" und \"Schnitte\"<\/b> (W\u00f6rterb\u00fccher). In unserem Fall fungierten zum Beispiel <noindex><a rel=\"nofollow\" href=\"https:\/\/youtu.be\/5XKbFb-l5Do?t=2487\">der K\u00f6rper des \"Templates\"<\/a><\/noindex> einheitlicher langsamer Abfragen oder der Text der Anfrage selbst.<\/p>\n<p>\"Fakten\" waren bei uns seit langem nach Tagen partitioniert, daher konnten wir veraltete Sektionen problemlos l\u00f6schen, und sie st\u00f6rten uns nicht (Logs!). Aber mit den W\u00f6rterb\u00fcchern gab es Probleme\u2026<\/p>\n<p>Es kann nicht gesagt werden, dass es sehr viele waren, aber ungef\u00e4hr <b>auf 100TB \"Fakten\" erhielten wir ein W\u00f6rterbuch von 2.5TB<\/b>. Aus einer solchen Tabelle kann man nichts bequem l\u00f6schen, nicht komprimieren in angemessener Zeit, und das Schreiben darin wurde allm\u00e4hlich immer langsamer.<\/p>\n<p>Einen W\u00f6rterbuch\u2026 in dem jeder Eintrag genau einmal vertreten sein sollte\u2026 und das ist richtig, aber!.. Niemand hindert uns daran, <b>ein separates W\u00f6rterbuch f\u00fcr jeden Tag<\/b>! Ja, das bringt eine gewisse Redundanz mit sich, erm\u00f6glicht aber:<\/p>\n<ul>\n<li><b>schneller zu schreiben\/zu lesen<\/b> durch die kleinere Gr\u00f6\u00dfe der Sektionen<\/li>\n<li><b>weniger Speicher zu verbrauchen<\/b> durch die Arbeit mit kompakteren Indizes<\/li>\n<li><b>weniger Daten zu speichern<\/b> durch die M\u00f6glichkeit, schnell veraltete Daten zu l\u00f6schen<\/li>\n<\/ul>\n<p>\nInfolge des gesamten Ma\u00dfnahmenpakets <b>sank die CPU-Auslastung um ~30%, und die Festplattennutzung um ~50%<\/b>:<\/p>\n<p><img decoding=\"async\" alt=\"Wir schreiben in PostgreSQL auf \u00dcberlichtgeschwindigkeit: 1 Host, 1 Tag, 1TB\" src=\"\/wp-content\/uploads\/2020\/04\/fd3a219a304dc46173a7eb435502fe02.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nDabei haben wir weiterhin genau das gleiche in die Datenbank geschrieben, einfach mit einer geringeren Belastung.<\/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>\nAlso, we stopped at the point where we have <b>a section for each day<\/b> with data. Essentially, <code>CHECK (dt = '2018-10-12'::date)<\/code> \u2014 is the partitioning key and the condition for a record to fit into a specific section.<\/p>\n<p>Since all reports in our service are built over a specific date, the indexes from the 'non-partitioned times' were all of the type <i>(Server, <b>Datum<\/b>, Plan Template)<\/i>, <i>(Server, <b>Datum<\/b>, Plan Node)<\/i>, <i>(<b>Datum<\/b>, Error Class, Server)<\/i>,\u2026<\/p>\n<p>But now each section contains <u>its own instances<\/u> of each such index\u2026 And within each section <u>the date is a constant<\/u>\u2026 It turns out that now we simply write a constant <b>as one of the fields into each such index, which increases both its size and the search time across it, but yields no results. We\u2019ve created a stumbling block for ourselves, oops\u2026<\/b> The direction for optimization is obvious \u2014 we simply<\/p>\n<p><img decoding=\"async\" alt=\"Wir schreiben in PostgreSQL auf \u00dcberlichtgeschwindigkeit: 1 Host, 1 Tag, 1TB\" src=\"\/wp-content\/uploads\/2020\/04\/c7644644b960c568c4adaeec57cfef2d.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nremove the date field from all indexes <b>on partitioned tables. Given our volumes, the gain is about<\/b> 1TB\/week <b>And now let\u2019s note that this terabyte still had to be recorded somehow. This means we also need to<\/b>!<\/p>\n<p>load the disk less now <b>! This picture clearly shows the effect achieved from the cleaning we dedicated a week to:<\/b>One of the major troubles of overloaded systems is<\/p>\n<p><img decoding=\"async\" alt=\"Wir schreiben in PostgreSQL auf \u00dcberlichtgeschwindigkeit: 1 Host, 1 Tag, 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>\nexcessive synchronization <b>of operations that do not require it. Sometimes it's 'because we didn't notice,' sometimes 'it was easier that way,' but sooner or later, you have to get rid of it.<\/b> If we zoom in on the previous picture, we can see that the disk is<\/p>\n<p>loading <b>with twice the amplitude<\/b> between adjacent readings, which clearly should not happen statistically with such a number of operations:<\/p>\n<p><img decoding=\"async\" alt=\"Wir schreiben in PostgreSQL auf \u00dcberlichtgeschwindigkeit: 1 Host, 1 Tag, 1TB\" src=\"\/wp-content\/uploads\/2020\/04\/ac3f19213cba0f111864c6dbf9a73912.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAchieving this is quite simple. We had already monitored nearly <b>1000 servers,<\/b>each processed by a separate logical thread, and each thread dumps the accumulated information for sending to the database at a certain regularity, approximately like this:<\/p>\n<pre><code class=\"javascript\">setInterval(sendToDB, interval)<\/code><\/pre>\n<p>\nThe problem lies exactly in the fact that <b>all threads start at roughly the same time,<\/b>so their sending moments almost always coincide 'down to the dot.' Oops #2\u2026<\/p>\n<p>Fortunately, this can be fixed quite easily by <b>adding a 'random' offset<\/b> in time:<\/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>\nThe third traditional problem of high load is <b>the lack of cache<\/b> where it <i>k\u00f6nnte<\/i> should be.<\/p>\n<p>Zum Beispiel haben wir die M\u00f6glichkeit geschaffen, Analysen nach Plan-Knoten durchzuf\u00fchren (all das <code>Seq Scan auf Benutzer<\/code>), aber sofort zu denken, dass sie im Gro\u00dfen und Ganzen gleich sind \u2014 das haben wir vergessen.<\/p>\n<p>Nat\u00fcrlich wird in die Datenbank nichts erneut geschrieben, das schneidet den Trigger mit <code>INSERT ... ON CONFLICT DO NOTHING<\/code>. Aber die Daten gelangen trotzdem zur Datenbank, und zus\u00e4tzlich ist es unn\u00f6tig <b>Lesen zur \u00dcberpr\u00fcfung von Konflikten<\/b> muss gemacht werden. Ups Nr. 3\u2026<\/p>\n<p>Der Unterschied in der Anzahl der in die Datenbank gesendeten Datens\u00e4tze vor\/nach Aktivierung des Caching ist offensichtlich:<\/p>\n<p><img decoding=\"async\" alt=\"Wir schreiben in PostgreSQL auf \u00dcberlichtgeschwindigkeit: 1 Host, 1 Tag, 1TB\" src=\"\/wp-content\/uploads\/2020\/04\/37fa7e64a674f03a79f2765a79ec8138.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nUnd dies f\u00fchrt zu einer gleichzeitig sinkenden Last auf dem Speicher:<\/p>\n<p><img decoding=\"async\" alt=\"Wir schreiben in PostgreSQL auf \u00dcberlichtgeschwindigkeit: 1 Host, 1 Tag, 1TB\" src=\"\/wp-content\/uploads\/2020\/04\/b2c563b4b41755211e77768d80f8702f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h2>Insgesamt<\/h2>\n<p>\n\u201eTerabyte-pro-Tag\u201c klingt nur erschreckend. Wenn Sie alles richtig machen, sind das nur <b>2^40 Byte \/ 86400 Sekunden = ~12.5MB\/s<\/b>, was sogar von Desktop-IDE-Festplatten gehalten wurde. \ud83d\ude42<\/p>\n<p>Und mal ernsthaft, selbst bei einem zehnfachen \u201eUngleichgewicht\u201c der Last \u00fcber einen Tag k\u00f6nnen Sie problemlos innerhalb der M\u00f6glichkeiten moderner SSDs bleiben.<\/p>\n<p><img decoding=\"async\" alt=\"Wir schreiben in PostgreSQL auf \u00dcberlichtgeschwindigkeit: 1 Host, 1 Tag, 1TB\" src=\"\/wp-content\/uploads\/2020\/04\/6f3f8d4636ba50f3d5401bf4e456757f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>Quelle: <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.1.1 - 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\/de\/blog\/administrirovanie\/pishem-v-postgresql-na-subsvetovoj-1-host-1-day-1tb\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"de_DE\" \/>\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\/de\/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\udd47Wir schreiben in PostgreSQL \u00fcber Lichtgeschwindigkeit: 1 Host, 1 Tag, 1TB | ProHoster","description":"Vor kurzem habe ich erz\u00e4hlt, wie man mit Hilfe typischer Rezepte die Leistung von SQL-Abfragen \u201ezum Lesen\u201c steigern kann.","canonical_url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/pishem-v-postgresql-na-subsvetovoj-1-host-1-day-1tb","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"de_DE","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\/de\/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\/de\/wp-json\/wp\/v2\/posts\/79028","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/comments?post=79028"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/79028\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media\/79029"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=79028"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=79028"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=79028"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}