{"id":79039,"date":"2020-04-23T19:43:26","date_gmt":"2020-04-23T17:43:26","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/ekonomim-kopeechku-na-bolshih-obemah-v-postgresql"},"modified":"2020-04-23T19:43:26","modified_gmt":"2020-04-23T17:43:26","slug":"ekonomim-kopeechku-na-bolshih-obemah-v-postgresql","status":"publish","type":"post","link":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/ekonomim-kopeechku-na-bolshih-obemah-v-postgresql","title":{"rendered":"Sparen wir ein bisschen bei hohen Volumina in PostgreSQL","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Im Zusammenhang mit dem Thema der Aufzeichnung gro\u00dfer Datenmengen, das <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/497008\/\">im vorherigen Artikel \u00fcber Partitionierung angesprochen wurde,<\/a><\/noindex>, betrachten wir hier M\u00f6glichkeiten, wie man <b>die \u201ephysikalische\u201c Gr\u00f6\u00dfe des gespeicherten<\/b> in PostgreSQL verringern kann und ihren Einfluss auf die Serverleistung.<\/p>\n<p>Es geht um <b>TOAST-Einstellungen und Datenausrichtung.<\/b>Im Durchschnitt erm\u00f6glichen diese Methoden nicht allzu viele Ressourcen zu sparen, jedoch \u2014 ganz ohne Modifizierung des Anwendungscodes.<\/p>\n<p><img decoding=\"async\" alt=\"Sparen wir ein bisschen bei hohen Volumina in PostgreSQL\" src=\"\/wp-content\/uploads\/2020\/04\/4d43b9b43edb10c4c8f13159c7dd1eac.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nUnserer Erfahrung nach war dies in dieser Hinsicht jedoch sehr produktiv, da das Speichersystem nahezu jeder \u00dcberwachung aufgrund seiner Natur <b>gr\u00f6\u00dftenteils append-only ist,<\/b> was die geschriebenen Daten betrifft. Und falls Sie sich fragen, wie man die Datenbank anweisen kann, auf die Festplatte zu schreiben, anstatt <b>200MB\/s<\/b> um die H\u00e4lfte weniger \u2014 bitte weiterlesen.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Kleine Geheimnisse gro\u00dfer Daten<\/h2>\n<p>\nIm Rahmen unserer <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/487380\/\">Servicearbeit<\/a><\/noindex>, erh\u00e4lt er regelm\u00e4\u00dfig aus den Protokollen <b>Textpakete.<\/b>.<\/p>\n<p>Und da <noindex><a rel=\"nofollow\" href=\"https:\/\/sbis.ru\/all_services\">die SBIS-Komplexit\u00e4t<\/a><\/noindex>, dessen Datenbanken wir \u00fcberwachen, ein vielschichtiges Produkt mit komplexen Datenstrukturen ist, ergeben sich auch die Anfragen <b>, um eine maximale Leistung zu erzielen,<\/b> als durchaus solche <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/486072\/\">\u201eMultivolumen\u201c mit komplexer algorithmischer Logik.<\/a><\/noindex>So ist auch das Volumen jeder einzelnen Instanz von Anfragen oder des resultierenden Ausf\u00fchrungsplans in den Protokollen, die zu uns gelangen, \u201eim Durchschnitt\u201c ausreichend gro\u00df.<\/p>\n<p>Schauen wir uns die Struktur einer der Tabellen an, in die wir \u201erohe\u201c Daten schreiben \u2014 das hei\u00dft, direkt den urspr\u00fcnglichen Text aus dem Protokoll:<\/p>\n<pre><code class=\"sql\">CREATE TABLE rawdata_orig(\n  pack -- PK\n    uuid NOT NULL\n, recno -- PK\n    smallint NOT NULL\n, dt -- Abschnittsschl\u00fcssel\n    date\n, data -- das Wichtigste\n    text\n, PRIMARY KEY(pack, recno)\n);<\/code><\/pre>\n<p>\nEine typische solche Tabelle (bereits partitioniert, selbstverst\u00e4ndlich, daher ist dies ein Abschnitts-Template), in der das Wichtigste der Text ist. Manchmal recht umfangreich.<\/p>\n<p>Erinnern wir uns daran, dass die \u201ephysikalische\u201c Gr\u00f6\u00dfe eines Eintrags in PG nicht mehr als eine Datenseite einnehmen kann, aber die \u201elogische\u201c Gr\u00f6\u00dfe \u2014 v\u00f6llig anders. Um einen umfangreichen Wert (varchar\/text\/bytea) in einem Feld zu speichern, wird <noindex><a rel=\"nofollow\" href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/12\/storage-toast\">die TOAST-Technologie verwendet.<\/a><\/noindex>:<\/p>\n<blockquote><p>PostgreSQL verwendet eine feste Seitengr\u00f6\u00dfe (in der Regel 8 KB) und erlaubt es nicht, dass Tupel mehrere Seiten einnehmen. Daher ist es nicht m\u00f6glich, sehr gro\u00dfe Werte von Feldern direkt zu speichern. Um diese Einschr\u00e4nkung zu \u00fcberwinden, werden gro\u00dfe Werte von Feldern komprimiert und\/oder in mehrere physische Zeilen aufgeteilt. Dies geschieht unsichtbar f\u00fcr den Benutzer und hat nur geringe Auswirkungen auf den Gro\u00dfteil des Servercodes. Diese Methode ist als TOAST bekannt ...<\/p><\/blockquote>\n<p>\nTats\u00e4chlich wird f\u00fcr jede Tabelle mit \"potenziell gro\u00dfen\" Feldern automatisch <noindex><a rel=\"nofollow\" href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/12\/storage-toast#STORAGE-TOAST-ONDISK\">eine passende Tabelle mit \"St\u00fcckelungen\"<\/a><\/noindex> jeder \"gro\u00dfen\" Aufzeichnung in Segmente von je 2KB erstellt:<\/p>\n<pre><code class=\"sql\">TOAST(\n  chunk_id\n    integer\n, chunk_seq\n    integer\n, chunk_data\n    bytea\n, PRIMARY KEY(chunk_id, chunk_seq)\n);<\/code><\/pre>\n<p>\nDas hei\u00dft, wenn wir eine Zeile mit einem \"gro\u00dfen\" Wert schreiben m\u00fcssen, <code>data<\/code>, wird die tats\u00e4chliche Speicherung <b>nicht nur in der Haupttabelle und ihrem PK erfolgen, sondern auch in TOAST und ihrem PK.<\/b>.<\/p>\n<h4>TOAST-Einfluss verringern<\/h4>\n<p>\nAber die meisten Aufzeichnungen sind dennoch nicht allzu gro\u00df, <b>sollten in 8KB passen<\/b> \u2014 wie k\u00f6nnen wir dabei sparen?..<\/p>\n<p>Hier kommt uns das Attribut <noindex><a rel=\"nofollow\" href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/12\/storage-toast#STORAGE-TOAST-ONDISK\"><code>STORAGE<\/code><\/a><\/noindex> der Spalte der Tabelle zugute:<\/p>\n<blockquote>\n<ul>\n<li><b>EXTENDED<\/b> erlaubt sowohl Kompression als auch getrennte Speicherung. Dies <b>ist die Standardoption<\/b> f\u00fcr die meisten Datentypen, die mit TOAST kompatibel sind. Zuerst wird versucht, eine Kompression durchzuf\u00fchren, danach\u2014 wenn die Zeile immer noch zu gro\u00df ist \u2014 erfolgt die Speicherung au\u00dferhalb der Tabelle.<\/li>\n<li><b>MAIN<\/b> erlaubt Kompression, jedoch keine separate Speicherung. (Tats\u00e4chlich wird dennoch eine separate Speicherung f\u00fcr solche Spalten durchgef\u00fchrt, aber nur <b>als letzte Ma\u00dfnahme<\/b>, wenn es keine andere M\u00f6glichkeit gibt, die Zeile so zu reduzieren, dass sie auf die Seite passt.)<\/li>\n<\/ul>\n<\/blockquote>\n<p>Tats\u00e4chlich ist dies genau das, was wir f\u00fcr Texte ben\u00f6tigen \u2014 <b>maximal komprimieren, und falls es nicht passt \u2014 nach TOAST auslagern.<\/b>Das kann direkt \"on the fly\" mit einem Befehl gemacht werden:<\/p>\n<pre><code class=\"sql\">ALTER TABLE rawdata_orig ALTER COLUMN data SET STORAGE MAIN;<\/code><\/pre>\n<p><\/p>\n<h4>Wie man den Effekt bewertet<\/h4>\n<p>\nDa der Datenfluss t\u00e4glich variiert, k\u00f6nnen wir keine absoluten Zahlen vergleichen, aber relativ gilt: <b>je kleiner der Anteil,<\/b> den wir in TOAST geschrieben haben \u2014 desto besser. Aber hier besteht die Gefahr \u2014 je gr\u00f6\u00dfer unser \"physikalisches\" Volumen jeder einzelnen Aufzeichnung ist, desto \"breiter\" wird der Index, da mehr Seitenabdeckung erforderlich ist.<\/p>\n<p>Abschnitt <b>vor den \u00c4nderungen<\/b>:<\/p>\n<pre><code class=\"plaintext\">heap  = 37GB (39%)\nTOAST = 54GB (57%)\nPK    =  4GB ( 4%)\n<\/code><\/pre>\n<p>\nAbschnitt <b>nach den \u00c4nderungen<\/b>:<\/p>\n<pre><code class=\"plaintext\">heap  = 37GB (67%)\nTOAST = 16GB (29%)\nPK    =  2GB ( 4%)<\/code><\/pre>\n<p>\nTats\u00e4chlich <b>schreiben wir jetzt dreimal seltener in TOAST.<\/b>, was nicht nur die Festplatte, sondern auch die CPU entlastete:<\/p>\n<p><img decoding=\"async\" alt=\"Sparen wir ein bisschen bei hohen Volumina in PostgreSQL\" src=\"\/wp-content\/uploads\/2020\/04\/547485eff9c6491ffe4d59e5c81f656d.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<img decoding=\"async\" alt=\"Sparen wir ein bisschen bei hohen Volumina in PostgreSQL\" src=\"\/wp-content\/uploads\/2020\/04\/6bd3b18146c20959693f961e41fff447.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nIch bemerke, dass wir auch weniger \u00ablesen\u00bb von der Festplatte, nicht nur \u00abschreiben\u00bb \u2014 da beim Einf\u00fcgen eines Eintrags in eine Tabelle auch Teile des Baums jedes der Indizes \u00abausgelesen\u00bb werden m\u00fcssen, um die zuk\u00fcnftige Position darin zu bestimmen.<\/p>\n<h2>Wer gut mit PostgreSQL 11 leben kann<\/h2>\n<p>\nNach dem Upgrade auf PG11 haben wir entschieden, das TOAST-\u00abTuning\u00bb fortzusetzen und festgestellt, dass ab dieser Version ein konfigurierbarer Parameter verf\u00fcgbar ist, <noindex><a rel=\"nofollow\" href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/11\/storage-toast#STORAGE-TOAST-ONDISK\"><code>toast_tuple_target<\/code><\/a><\/noindex>:<\/p>\n<blockquote><p>Der TOAST-Verarbeitungs-Code wird nur aktiv, wenn die Zeilenwertgr\u00f6\u00dfe, die in der Tabelle gespeichert werden soll, gr\u00f6\u00dfer ist als TOAST_TUPLE_THRESHOLD Bytes (in der Regel 2 KB). Der TOAST-Code wird die Feldwerte komprimieren und\/oder au\u00dferhalb der Tabelle lagern, solange der Zeilenwert nicht kleiner als TOAST_TUPLE_TARGET Bytes (variable Gr\u00f6\u00dfe, normalerweise ebenfalls 2 KB) wird oder eine Reduzierung nicht mehr m\u00f6glich ist.<\/p><\/blockquote>\n<p>Wir haben beschlossen, dass unsere Daten in der Regel entweder \u00absehr kurz\u00bb oder \u00absehr lang\u00bb sind, daher haben wir uns entschieden, mit dem minimal m\u00f6glichen Wert zu arbeiten:<\/p>\n<pre><code class=\"sql\">ALTER TABLE rawplan_orig SET (toast_tuple_target = 128);<\/code><\/pre>\n<p>\nLassen Sie uns sehen, wie sich die neuen Einstellungen auf die Festplattenbelastung nach der Umstellung ausgewirkt haben:<\/p>\n<p><img decoding=\"async\" alt=\"Sparen wir ein bisschen bei hohen Volumina in PostgreSQL\" src=\"\/wp-content\/uploads\/2020\/04\/ccaa4879e413a566b362d01582eb8c19.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nNicht schlecht! Die durchschnittliche <b>Wartezeit auf die Festplatte ist<\/b> ungef\u00e4hr um das 1,5-Fache gesunken, und die \u00abAuslastung\u00bb der Festplatte um etwa 20%! Aber vielleicht hat sich das auch auf die CPU ausgewirkt?<\/p>\n<p><img decoding=\"async\" alt=\"Sparen wir ein bisschen bei hohen Volumina in PostgreSQL\" src=\"\/wp-content\/uploads\/2020\/04\/f7026e5809853d35c6fb7a8376b9f369.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nZumindest ist es definitiv nicht schlechter geworden. Es ist jedoch schwer zu sagen, wenn selbst solche Volumina die durchschnittliche CPU-Auslastung nicht \u00fcber <b>5%<\/b>.<\/p>\n<h2>Die Summe \u00e4ndert sich durch den Tausch der Summanden!<\/h2>\n<p>\nWie bekannt ist, spart der Pfennig den Rubel, und bei unseren Speichervolumina von etwa <b>10 TB\/Monat<\/b> kann selbst eine kleine Optimierung einen guten Gewinn bringen. Daher haben wir auf die physische Struktur unserer Daten geachtet \u2014 wie konkret <b>die Felder innerhalb eines Eintrags<\/b> in jeder der Tabellen \u00abangeordnet\u00bb sind.<\/p>\n<p>Denn aufgrund der <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/postgrespro\/blog\/444536\/\">Ausrichtung der Daten<\/a><\/noindex> wirkt sich dies direkt <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.gitlab.com\/ee\/development\/ordering_table_columns.html\">auf das resultierende Volumen<\/a><\/noindex>:<\/p>\n<blockquote><p>Viele Architekturen sehen eine Ausrichtung der Daten nach den Grenzen maschinenlesbarer W\u00f6rter vor. Zum Beispiel werden in einem 32-Bit-x86-System Ganzzahlen (Datentyp integer, der 4 Bytes ben\u00f6tigt) nach einer 4-Byte-Grenze ausgerichtet, ebenso wie Gleitkommazahlen (Datentyp double precision, 8 Bytes). In einem 64-Bit-System werden double-Werte nach der Grenze von 8-Byte-Worten ausgerichtet. Dies ist ein weiterer Grund f\u00fcr die Inkompatibilit\u00e4t.<\/p>\n<p>Aufgrund der Ausrichtung h\u00e4ngt die Gr\u00f6\u00dfe der Tabellenspalte von der Reihenfolge der Felder ab. In der Regel ist dieser Effekt nicht sehr auff\u00e4llig, aber in einigen F\u00e4llen kann er zu einer erheblichen Gr\u00f6\u00dfensteigerung f\u00fchren. Zum Beispiel, wenn man die Felder der Typen char(1) und integer vermischt, gehen in der Regel 3 Bytes verloren.<\/p><\/blockquote>\n<p>\nLassen Sie uns mit synthetischen Modellen beginnen:<\/p>\n<pre><code class=\"sql\">SELECT pg_column_size(ROW(\n  '0000-0000-0000-0000-0000-0000-0000-0000'::uuid\n, 0::smallint\n, '2019-01-01'::date\n));\n-- 48 Bytes\n\nSELECT pg_column_size(ROW(\n  '2019-01-01'::date\n, '0000-0000-0000-0000-0000-0000-0000-0000'::uuid\n, 0::smallint\n));\n-- 46 Bytes<\/code><\/pre>\n<p>\nWoher kommen die zus\u00e4tzlichen Bytes im ersten Fall? Ganz einfach \u2014 <b>Ein 2-Byte-smallint wird auf eine 4-Byte-Grenze ausgerichtet<\/b> vor dem n\u00e4chsten Feld, und wenn es das letzte ist, gibt es nichts mehr auszurichten und keinen Grund daf\u00fcr.<\/p>\n<p>In der Theorie ist alles gut und man kann die Felder beliebig verschieben. Lassen Sie uns dies mit echten Daten \u00fcberpr\u00fcfen, anhand eines Beispiels einer Tabelle, deren t\u00e4glicher Abschnitt 10-15 GB umfasst.<\/p>\n<p>Urspr\u00fcngliche Struktur:<\/p>\n<pre><code class=\"sql\">CREATE TABLE public.plan_20190220\n(\n-- Abgeleitet von Tabelle plan:  pack uuid NOT NULL,\n-- Abgeleitet von Tabelle plan:  recno smallint NOT NULL,\n-- Abgeleitet von Tabelle plan:  host uuid,\n-- Abgeleitet von Tabelle plan:  ts timestamp with time zone,\n-- Abgeleitet von Tabelle plan:  exectime numeric(32,3),\n-- Abgeleitet von Tabelle plan:  duration numeric(32,3),\n-- Abgeleitet von Tabelle plan:  bufint bigint,\n-- Abgeleitet von Tabelle plan:  bufmem bigint,\n-- Abgeleitet von Tabelle plan:  bufdsk bigint,\n-- Abgeleitet von Tabelle plan:  apn uuid,\n-- Abgeleitet von Tabelle plan:  ptr uuid,\n-- Abgeleitet von Tabelle plan:  dt date,\n  CONSTRAINT plan_20190220_pkey PRIMARY KEY (pack, recno),\n  CONSTRAINT chck_ptr CHECK (ptr IS NOT NULL),\n  CONSTRAINT plan_20190220_dt_check CHECK (dt = '2019-02-20'::date)\n)\nINHERITS (public.plan)<\/code><\/pre>\n<p>\nDer Abschnitt nach der \u00c4nderung der Spaltenreihenfolge \u2013 genau <b>die gleichen Felder, nur in anderer Reihenfolge<\/b>:<\/p>\n<pre><code class=\"sql\">CREATE TABLE public.plan_20190221\n(\n-- Abgeleitet von Tabelle plan:  dt date NOT NULL,\n-- Abgeleitet von Tabelle plan:  ts timestamp with time zone,\n-- Abgeleitet von Tabelle plan:  pack uuid NOT NULL,\n-- Abgeleitet von Tabelle plan:  recno smallint NOT NULL,\n-- Abgeleitet von Tabelle plan:  host uuid,\n-- Abgeleitet von Tabelle plan:  apn uuid,\n-- Abgeleitet von Tabelle plan:  ptr uuid,\n-- Abgeleitet von Tabelle plan:  bufint bigint,\n-- Abgeleitet von Tabelle plan:  bufmem bigint,\n-- Abgeleitet von Tabelle plan:  bufdsk bigint,\n-- Abgeleitet von Tabelle plan:  exectime numeric(32,3),\n-- Abgeleitet von Tabelle plan:  duration numeric(32,3),\n  CONSTRAINT plan_20190221_pkey PRIMARY KEY (pack, recno),\n  CONSTRAINT chck_ptr CHECK (ptr IS NOT NULL),\n  CONSTRAINT plan_20190221_dt_check CHECK (dt = '2019-02-21'::date)\n)\nINHERITS (public.plan)<\/code><\/pre>\n<p>\nDas Gesamtvolumen des Abschnitts wird durch die Anzahl der \u201eFakten\u201c bestimmt und h\u00e4ngt nur von externen Prozessen ab, deshalb teilen wir die Gr\u00f6\u00dfe des Heaps (<code>pg_relation_size<\/code>) zur Anzahl der Eintr\u00e4ge darin \u2013 also erhalten wir <b>die durchschnittliche Gr\u00f6\u00dfe des tats\u00e4chlich gespeicherten Eintrags<\/b>:<\/p>\n<p><img decoding=\"async\" alt=\"Sparen wir ein bisschen bei hohen Volumina in PostgreSQL\" src=\"\/wp-content\/uploads\/2020\/04\/06be2d7d70d223e7678f9a478e4c293f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<b>Minus 6 % des Volumens<\/b>, hervorragend!<\/p>\n<p>Aber nat\u00fcrlich ist nicht alles so rosig \u2013 denn <b>k\u00f6nnen wir die Reihenfolge der Felder in den Indizes nicht \u00e4ndern<\/b>, und deshalb \"insgesamt\" (<code>pg_total_relation_size<\/code>)\u2026<\/p>\n<p><img decoding=\"async\" alt=\"Sparen wir ein bisschen bei hohen Volumina in PostgreSQL\" src=\"\/wp-content\/uploads\/2020\/04\/8beff38e5034fc0d40665b75cb3b3625.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n\u2026 letztendlich aber auch hier <b>1,5 % gespart<\/b>, ohne eine Zeile Code zu \u00e4ndern. Tats\u00e4chlich!<\/p>\n<p><img decoding=\"async\" alt=\"Sparen wir ein bisschen bei hohen Volumina in PostgreSQL\" src=\"\/wp-content\/uploads\/2020\/04\/10f4a2151465a38bf45823a5d360302b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Ich m\u00f6chte anmerken, dass die oben angegebene Anordnung der Felder nicht garantiert die optimalste ist. Denn aus \u00e4sthetischen Gr\u00fcnden m\u00f6chte man manche Feldbl\u00f6cke nicht schon \u201ezerrei\u00dfen\u201c \u2013 zum Beispiel das Paar <code>(pack, recno)<\/code>, das der PK f\u00fcr diese Tabelle entspricht.<\/p>\n<p>Insgesamt ist die Bestimmung der \u201eminimalen\u201c Anordnung der Felder eine relativ einfache \u201eErmusterungs\u201c-Aufgabe. Daher k\u00f6nnen Sie mit Ihren Daten sogar bessere Ergebnisse erzielen als wir \u2013 probieren Sie es aus!<br \/>\n<br \/>Quelle: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/tensor\/blog\/498292\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u044f \u0442\u0435\u043c\u0443 \u0437\u0430\u043f\u0438\u0441\u0438 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445, \u043f\u043e\u0434\u043d\u044f\u0442\u0443\u044e \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435\u0439 \u043f\u0440\u043e \u0441\u0435\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u0432 \u044d\u0442\u043e\u0439 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043c\u043e\u0436\u043d\u043e \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u00ab\u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0439\u00bb \u0440\u0430\u0437\u043c\u0435\u0440 \u0445\u0440\u0430\u043d\u0438\u043c\u043e\u0433\u043e \u0432 PostgreSQL, \u0438 \u0438\u0445 \u0432\u043b\u0438\u044f\u043d\u0438\u0435 \u043d\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0441\u0435\u0440\u0432\u0435\u0440\u0430. \u0420\u0435\u0447\u044c \u043f\u043e\u0439\u0434\u0435\u0442 \u043f\u0440\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 TOAST \u0438 \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445. \u00ab\u0412 \u0441\u0440\u0435\u0434\u043d\u0435\u043c\u00bb \u044d\u0442\u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u044b \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0442 \u0441\u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0442\u044c \u043d\u0435 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u043d\u043e\u0433\u043e \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432, \u0437\u0430\u0442\u043e \u2014 \u0432\u043e\u043e\u0431\u0449\u0435 \u0431\u0435\u0437 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u043a\u043e\u0434\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u041e\u0434\u043d\u0430\u043a\u043e, [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":79040,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-79039","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=\"\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u044f \u0442\u0435\u043c\u0443 \u0437\u0430\u043f\u0438\u0441\u0438 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445, \u043f\u043e\u0434\u043d\u044f\u0442\u0443\u044e \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435\u0439 \u043f\u0440\u043e \u0441\u0435\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u0432 \u044d\u0442\u043e\u0439 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043c\u043e\u0436\u043d\u043e.\" \/>\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\/ekonomim-kopeechku-na-bolshih-obemah-v-postgresql\" \/>\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\u042d\u043a\u043e\u043d\u043e\u043c\u0438\u043c \u043a\u043e\u043f\u0435\u0435\u0447\u043a\u0443 \u043d\u0430 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043e\u0431\u044a\u0435\u043c\u0430\u0445 \u0432 PostgreSQL | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u044f \u0442\u0435\u043c\u0443 \u0437\u0430\u043f\u0438\u0441\u0438 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445, \u043f\u043e\u0434\u043d\u044f\u0442\u0443\u044e \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435\u0439 \u043f\u0440\u043e \u0441\u0435\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u0432 \u044d\u0442\u043e\u0439 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043c\u043e\u0436\u043d\u043e.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/ekonomim-kopeechku-na-bolshih-obemah-v-postgresql\" \/>\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:26+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-04-23T17:43:26+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 sparen ein paar Cent bei gro\u00dfen Volumen in PostgreSQL | ProHoster","description":"Im Zusammenhang mit dem Thema der Aufzeichnung gro\u00dfer Datenstr\u00f6me, das im vorherigen Artikel \u00fcber Partitionierung angesprochen wurde, werden wir hier die Methoden betrachten, mit denen dies m\u00f6glich ist.","canonical_url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/ekonomim-kopeechku-na-bolshih-obemah-v-postgresql","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\u042d\u043a\u043e\u043d\u043e\u043c\u0438\u043c \u043a\u043e\u043f\u0435\u0435\u0447\u043a\u0443 \u043d\u0430 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043e\u0431\u044a\u0435\u043c\u0430\u0445 \u0432 PostgreSQL | ProHoster","og:description":"\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u044f \u0442\u0435\u043c\u0443 \u0437\u0430\u043f\u0438\u0441\u0438 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445, \u043f\u043e\u0434\u043d\u044f\u0442\u0443\u044e \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435\u0439 \u043f\u0440\u043e \u0441\u0435\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u0432 \u044d\u0442\u043e\u0439 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043c\u043e\u0436\u043d\u043e.","og:url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/ekonomim-kopeechku-na-bolshih-obemah-v-postgresql","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:26+00:00","article:modified_time":"2020-04-23T17:43:26+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"79039","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:33","updated":"2022-09-28 06:02:32","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\/79039","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=79039"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/79039\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media\/79040"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=79039"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=79039"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=79039"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}