{"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 in Lichtgeschwindigkeit: 1 Host, 1 Tag, 1 TB","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>K\u00fcrzlich berichtete ich dar\u00fcber, wie man mit Standardrezepten <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/tensor\/blog\/492694\/\">die Leistung von SQL-Abfragen \"zum Lesen\"<\/a><\/noindex> aus einer PostgreSQL-Datenbank steigern kann. Heute geht es darum, wie man <b>die Datenspeicherung<\/b> in der DB effektiver gestalten kann, ohne irgendwelche \u201eSchrauben\u201c in der Konfiguration zu verwenden \u2013 einfach durch eine ordnungsgem\u00e4\u00dfe Organisation der Datenstr\u00f6me.<\/p>\n<p><img decoding=\"async\" alt=\"Wir schreiben in PostgreSQL in Lichtgeschwindigkeit: 1 Host, 1 Tag, 1 TB\" 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 es sinnvoll ist, <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/483170\/\">applikative Partitionierung \u201etheoretisch\u201c<\/a><\/noindex> zu organisieren und hier wird es um die praktische Anwendung einiger Ans\u00e4tze in unserem <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/487380\/\">Monitoring-Service f\u00fcr Hunderte von PostgreSQL-Servern gehen.<\/a><\/noindex>.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h4>\u201eWie lange ist es her ...\u201c<\/h4>\n<p>\nUrspr\u00fcnglich, wie bei jedem MVP, startete unser Projekt mit einer relativ geringen Last \u2013 das Monitoring erfolgte nur f\u00fcr ein Dutzend der kritischsten Server, alle Tabellen waren relativ kompakt\u2026 Doch die Zeit verging, die \u00fcberwachten Hosts wurden immer zahlreicher, und als wir erneut versuchten, etwas mit einer der <b>Tabellen mit einer Gr\u00f6\u00dfe von 1,5 TB<\/b>, zu machen, erkannten wir, dass es zwar m\u00f6glich war, so weiterzuleben, aber es war \u00e4u\u00dferst unpraktisch.<\/p>\n<p>Die Zeiten waren fast schon legend\u00e4r, unterschiedliche Versionen von PostgreSQL 9.x waren aktuell, und daher musste die gesamte Partitionierung \u201emanuell\u201c vorgenommen werden \u2013 durch <b>Tabellenvererbung und Trigger<\/b> Routing mit dynamischem <code>EXECUTE<\/code>.<\/p>\n<p><img decoding=\"async\" alt=\"Wir schreiben in PostgreSQL in Lichtgeschwindigkeit: 1 Host, 1 Tag, 1 TB\" src=\"\/wp-content\/uploads\/2020\/04\/a480e75ccec73080aa2d0be1435d2a2e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nDie entstandene L\u00f6sung erwies sich als ausreichend universell, um sie auf alle Tabellen anwenden zu k\u00f6nnen:<\/p>\n<ul>\n<li>Eine leere \u201eHeader\u201c-Elterntabelle wurde definiert, in der alle <b>erforderlichen Indizes und Trigger beschrieben wurden<\/b>.<\/li>\n<li>Die Datens\u00e4tze wurden aus Sicht des Clients in die \u201eRoot\u201c-Tabelle geschrieben, und innerhalb dieser durch <b>den Routing-Trigger<\/b> <code>BEFORE INSERT<\/code> Der Eintrag wurde \u201ephysisch\u201c in den gew\u00fcnschten Abschnitt eingef\u00fcgt. Falls ein solcher noch nicht vorhanden war \u2013 fingen wir die Ausnahme und ...<\/li>\n<li>\u2026 mit Hilfe von <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/492464\/\"><code>CREATE TABLE ... (LIKE ... INCLUDING ...)<\/code><\/a><\/noindex> wurde entsprechend der Vorlage der Elterntabelle <b>ein Abschnitt mit einer Einschr\u00e4nkung auf das erforderliche Datum erstellt<\/b>, damit bei der Datenauslesung nur darin gelesen wird.<\/li>\n<\/ul>\n<p><\/p>\n<h4>PG10: Der erste Versuch<\/h4>\n<p>\nAber die Partitionierung \u00fcber Vererbung war historisch gesehen nicht besonders gut geeignet f\u00fcr aktive Schreibstr\u00f6me oder eine gro\u00dfe Anzahl an Nachkommen-Partitionen. Man kann sich erinnern, dass der Algorithmus zur Auswahl des ben\u00f6tigten Abschnitts <b>quadratische Komplexit\u00e4t<\/b>, sodass bei 100+ Abschnitten, Sie wissen schon, wie das funktioniert\u2026<\/p>\n<p>In PG10 wurde diese Situation stark optimiert, indem die Unterst\u00fctzung f\u00fcr <noindex><a rel=\"nofollow\" href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/10\/ddl-partitioning\">natives Partitioning implementiert wurde<\/a><\/noindex>. Daher haben wir es sofort nach der Migration des Speichers ausprobiert, aber\u2026<\/p>\n<p>Wie sich nach eingehender Durchsicht des Handbuchs herausstellte, unterst\u00fctzt die nativ partitionierte Tabelle in dieser Version:<\/p>\n<ul>\n<li>keine Indexbeschreibungen<\/li>\n<li>keine Trigger<\/li>\n<li>kann nicht selbst ein Nachkomme sein<\/li>\n<li>unterst\u00fctzt nicht <code>INSERT ... ON CONFLICT<\/code><\/li>\n<li>kann keine Sektion automatisch erzeugen<\/li>\n<\/ul>\n<p>\nNach dem schmerzhaften Schock haben wir verstanden, dass wir ohne Modifikation der Anwendung nicht auskommen werden und haben die weiteren Untersuchungen 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 doch an einigen Stellen ben\u00f6tigt wurden, haben wir daf\u00fcr eine Zwischen- <b>Proxy-Tabelle erstellt<\/b>.<\/li>\n<li><b>Wir haben das \"Routing\"<\/b> in den Triggern entfernt \u2014 also <code>EXECUTE<\/code>.<\/li>\n<li>Wir haben separat <b>eine Vorlage-Tabelle mit allen Indizes erstellt<\/b>, damit sie nicht einmal in der Proxy-Tabelle vorhanden sind.<\/li>\n<\/ol>\n<p>\n<img decoding=\"async\" alt=\"Wir schreiben in PostgreSQL in Lichtgeschwindigkeit: 1 Host, 1 Tag, 1 TB\" src=\"\/wp-content\/uploads\/2020\/04\/db3118798357575568489f6b575373b6.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nSchlie\u00dflich haben wir nach all dem die Haupttabelle nativ partitioniert. Die Erstellung eines neuen Abschnitts verblieb bis dahin in der Verantwortung der Anwendung.<\/p>\n<h4>\"Wir bearbeiten\" W\u00f6rterb\u00fccher<\/h4>\n<p>\nWie in jedem analytischen System hatten wir auch bei uns <b>\"Fakten\" und \"Schnitte\"<\/b> (W\u00f6rterb\u00fccher). In unserem Fall waren dies beispielsweise <noindex><a rel=\"nofollow\" href=\"https:\/\/youtu.be\/5XKbFb-l5Do?t=2487\">die Struktur des \u00abTemplates\u00bb<\/a><\/noindex> homogener langsamer Abfragen oder der Abfrage selbst.<\/p>\n<p>Die \u00abFakten\u00bb waren bei uns bereits seit langem nach Tagen segmentiert, weshalb wir ruhig veraltete Abschnitte entfernen konnten, und sie haben uns nicht gest\u00f6rt (die Protokolle eben!). Mit den W\u00f6rterb\u00fcchern jedoch gab es Probleme\u2026<\/p>\n<p>Es kann nicht gesagt werden, dass es sehr viele waren, aber etwa <b>f\u00fcr 100TB \u00abFakten\u00bb gab es ein W\u00f6rterbuch von 2,5TB.<\/b>Aus so einer Tabelle l\u00e4sst sich nichts einfach entfernen, nicht einpacken in angemessener Zeit, und das Schreiben wurde allm\u00e4hlich immer langsamer.<\/p>\n<p>Es scheint ein W\u00f6rterbuch zu sein\u2026 In ihm sollte jeder Eintrag genau einmal vorhanden sein\u2026 und das ist korrekt, aber!.. Nichts hindert uns daran, <b>ein separates W\u00f6rterbuch f\u00fcr jeden Tag<\/b>! Ja, das bringt einen gewissen \u00dcberfluss, aber es erm\u00f6glicht:<\/p>\n<ul>\n<li><b>schnelleres Schreiben\/Lesen<\/b> wegen der kleineren Abschnittsgr\u00f6\u00dfe<\/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, veraltete schnell zu entfernen.<\/li>\n<\/ul>\n<p>\nInfolge des gesamten Ma\u00dfnahmenpakets <b>sank die CPU-Auslastung um ~30%, die Festplattenauslastung um ~50%.<\/b>:<\/p>\n<p><img decoding=\"async\" alt=\"Wir schreiben in PostgreSQL in Lichtgeschwindigkeit: 1 Host, 1 Tag, 1 TB\" src=\"\/wp-content\/uploads\/2020\/04\/fd3a219a304dc46173a7eb435502fe02.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nDabei haben wir weiterhin genau dieselben Daten in die Datenbank geschrieben, jedoch 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, wir sind zu dem Punkt gekommen, dass wir <b>f\u00fcr jeden Tag einen eigenen Abschnitt<\/b> mit Daten haben. Tats\u00e4chlich <code>CHECK (dt = '2018-10-12'::date)<\/code> \u2014 das ist der Schl\u00fcssel zur Partitionierung und die Bedingung, dass ein Datensatz in den bestimmten Abschnitt f\u00e4llt.<\/p>\n<p>Da alle Berichte in unserem Dienst auf spezifischen Daten beruhen, waren die Indizes aus den \"nicht partitionierten Zeiten\" auch alle vom Typ <i>(Server, <b>Datum<\/b>, Planvorlage)<\/i>, <i>(Server, <b>Datum<\/b>, Knoten des Plans)<\/i>, <i>(<b>Datum<\/b>, Fehlerklasse, Server)<\/i>,\u2026<\/p>\n<p>Aber jetzt wohnen in jedem Abschnitt <u>eigenst\u00e4ndige Instanzen<\/u> jeder dieser Indizes\u2026 Und innerhalb jedes Abschnitts <u>ist das Datum eine Konstante<\/u>\u2026 Das bedeutet, dass wir jetzt in jeden solchen Index <b>einfach eine Konstante<\/b> als eines der Felder eintragen, was sowohl das Volumen als auch die Suchzeit erh\u00f6ht, jedoch keinen Nutzen bringt. Wir haben uns selbst Fallstricke hinterlassen, ups\u2026<\/p>\n<p><img decoding=\"async\" alt=\"Wir schreiben in PostgreSQL in Lichtgeschwindigkeit: 1 Host, 1 Tag, 1 TB\" src=\"\/wp-content\/uploads\/2020\/04\/c7644644b960c568c4adaeec57cfef2d.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nDie Richtung der Optimierung ist offensichtlich \u2014 einfach <b>das Datumsfeld aus allen Indizes<\/b> in den partitionierten Tabellen entfernen. Bei unseren Volumina ergibt sich ein Gewinn von etwa <b>1TB\/Woche<\/b>!<\/p>\n<p>Und jetzt lassen Sie uns beachten, dass dieses Terabyte auch irgendwie aufgezeichnet werden musste. Das hei\u00dft, wir mussten auch <b>Die Festplatte sollte jetzt weniger belastet werden.<\/b>! Auf diesem Bild ist der erhaltene Effekt der durchgef\u00fchrten Reinigung gut sichtbar, der eine Woche in Anspruch nahm:<\/p>\n<p><img decoding=\"async\" alt=\"Wir schreiben in PostgreSQL in Lichtgeschwindigkeit: 1 Host, 1 Tag, 1 TB\" 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>\nEine der gr\u00f6\u00dften Herausforderungen f\u00fcr belastete Systeme ist <b>\u00fcberm\u00e4\u00dfige Synchronisation<\/b> von Operationen, die dies nicht erfordern. Manchmal \u201eweil wir es nicht bemerkt haben\u201c, manchmal \u201eweil es einfacher war\u201c, aber irgendwann m\u00fcssen wir uns davon befreien.<\/p>\n<p>Wenn wir das vorherige Bild vergr\u00f6\u00dfern, sehen wir, dass die Festplatte <b>in der Last mit doppelter Amplitude \u201eschwankt\u201c<\/b> zwischen benachbarten Messpunkten, was statistisch nicht der Fall sein sollte bei dieser Anzahl von Operationen:<\/p>\n<p><img decoding=\"async\" alt=\"Wir schreiben in PostgreSQL in Lichtgeschwindigkeit: 1 Host, 1 Tag, 1 TB\" src=\"\/wp-content\/uploads\/2020\/04\/ac3f19213cba0f111864c6dbf9a73912.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDas zu erreichen ist recht einfach. Wir hatten bereits <b>fast 1000 Server<\/b>, jeder wird von einem separaten logischen Prozess verarbeitet, und jeder Prozess sendet die gesammelten Informationen zu bestimmten Zeitintervallen an die Datenbank, etwa so:<\/p>\n<pre><code class=\"javascript\">setInterval(sendToDB, interval)<\/code><\/pre>\n<p>\nDas Problem liegt genau darin, dass <b>alle Prozesse ungef\u00e4hr zur gleichen Zeit starten<\/b>, deshalb stimmen die \u00dcbermittlungszeitpunkte fast immer \u201e\u00fcber Punkt\u201c \u00fcberein. Ups Nr. 2\u2026<\/p>\n<p>Zum Gl\u00fcck l\u00e4sst sich das relativ einfach beheben, <b>indem man eine \u201ezuf\u00e4llige\u201c Zeitversetzung<\/b> hinzuf\u00fcgt:<\/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>\nDas dritte traditionelle Hochlastproblem ist <b>das Fehlen von Cache<\/b> an Orten, wo er <i>einf\u00fcgen k\u00f6nnte<\/i> ben\u00f6tigt wird.<\/p>\n<p>Zum Beispiel haben wir die M\u00f6glichkeit zur Analyse im Hinblick auf die Knoten im Plan geschaffen (alle diese <code>Seq Scan on users<\/code>), aber man sollte sofort denken, dass sie in der Masse gleich sind \u2013 das wurde \u00fcbersehen.<\/p>\n<p>Nat\u00fcrlich wird nichts erneut in die Datenbank geschrieben, das wird durch den Trigger mit <code>INSERT ... ON CONFLICT DO NOTHING<\/code>verhindert. Aber die Daten erreichen die Datenbank dennoch, was zus\u00e4tzliches <b>Lesen zur \u00dcberpr\u00fcfung von Konflikten<\/b> notwendig macht. Ups Nr. 3\u2026<\/p>\n<p>Der Unterschied in der Anzahl der in die Datenbank gesendeten Datens\u00e4tze vor\/nach der Aktivierung des Cachings ist offensichtlich:<\/p>\n<p><img decoding=\"async\" alt=\"Wir schreiben in PostgreSQL in Lichtgeschwindigkeit: 1 Host, 1 Tag, 1 TB\" src=\"\/wp-content\/uploads\/2020\/04\/37fa7e64a674f03a79f2765a79ec8138.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nUnd das ist der begleitende R\u00fcckgang der Belastung des Speichers:<\/p>\n<p><img decoding=\"async\" alt=\"Wir schreiben in PostgreSQL in Lichtgeschwindigkeit: 1 Host, 1 Tag, 1 TB\" src=\"\/wp-content\/uploads\/2020\/04\/b2c563b4b41755211e77768d80f8702f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h2>Gesamt<\/h2>\n<p>\n\u201eTerabyte-pro-Tag\u201c klingt nur erschreckend. Wenn Sie alles richtig machen, sind das lediglich <b>2^40 Byte \/ 86400 Sekunden = ~12,5 MB\/s<\/b>, was selbst Desktop-IDE-Festplatten verkraften konnten. \ud83d\ude42<\/p>\n<p>Und ehrlich gesagt, selbst bei einer zehnfachen \u201eVerzerrung\u201c der Last \u00fcber einen Tag k\u00f6nnen Sie problemlos die Kapazit\u00e4ten moderner SSDs aussch\u00f6pfen.<\/p>\n<p><img decoding=\"async\" alt=\"Wir schreiben in PostgreSQL in Lichtgeschwindigkeit: 1 Host, 1 Tag, 1 TB\" 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 4.9.10 - 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 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\" \/>\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) 4.9.10\" \/>\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 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\" \/>\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 im \u00dcberlicht: 1 Host, 1 Tag, 1TB | ProHoster","description":"K\u00fcrzlich habe ich erkl\u00e4rt, wie man mit Hilfe von Standardrezepten die Performance von Lese-SQL-Abfragen aus einer PostgreSQL-Datenbank steigern kann. Heute bespreche ich, wie Sie das Schreiben in die Datenbank effizienter gestalten k\u00f6nnen, ohne die Konfiguration mit 'Tweaks' zu ver\u00e4ndern \u2014 einfach durch eine sinnvolle Organisation der Datenstr\u00f6me. #1. Partitionierung Ein Artikel dar\u00fcber, wie und warum man applicative Partitionierung 'theoretisch' organisieren sollte.","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 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","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"},"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}]}}