{"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\/es\/blog\/administrirovanie\/ekonomim-kopeechku-na-bolshih-obemah-v-postgresql","title":{"rendered":"Ahorra unos centavos en grandes vol\u00famenes en PostgreSQL","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Continuando con el tema de registrar grandes flujos de datos, planteado <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/497008\/\">en el art\u00edculo anterior sobre particionamiento<\/a><\/noindex>, en este exploraremos las maneras en que se puede <b>reducir el tama\u00f1o 'f\u00edsico' del almacenamiento<\/b> en PostgreSQL y su impacto en el rendimiento del servidor.<\/p>\n<p>Vamos a hablar sobre <b>configuraciones de TOAST y alineaci\u00f3n de datos<\/b>. 'En promedio', estas alternativas permiten ahorrar no demasiado recursos, pero s\u00ed \u2014 sin modificar el c\u00f3digo de la aplicaci\u00f3n.<\/p>\n<p><img decoding=\"async\" alt=\"Ahorra unos centavos en grandes vol\u00famenes en PostgreSQL\" src=\"\/wp-content\/uploads\/2020\/04\/4d43b9b43edb10c4c8f13159c7dd1eac.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nSin embargo, nuestra experiencia result\u00f3 ser bastante productiva en este sentido, dado que el almacenamiento de casi cualquier monitoreo por su naturaleza es <b>en su mayor parte append-only<\/b> en t\u00e9rminos de datos registrados. Y si te interesa c\u00f3mo se puede ense\u00f1ar a la base a escribir en disco en lugar de <b>200MB\/s<\/b> la mitad \u2014 te invito a seguir leyendo.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Peque\u00f1os secretos de grandes datos<\/h2>\n<p>\nPor el perfil de trabajo <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/487380\/\">de nuestro servicio<\/a><\/noindex>, recibe regularmente desde los logs <b>paquetes de texto<\/b>.<\/p>\n<p>Y dado que <noindex><a rel=\"nofollow\" href=\"https:\/\/sbis.ru\/all_services\">el complejo SBIS<\/a><\/noindex>, cuyas bases de datos monitoreamos, es un producto multicomponente con estructuras de datos complejas, las consultas <b>para lograr la m\u00e1xima performance<\/b> resultan bastante <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/486072\/\">'de m\u00faltiples vol\u00famenes' con una l\u00f3gica algor\u00edtmica compleja<\/a><\/noindex>. As\u00ed que el tama\u00f1o de cada instancia individual de consulta o plan de ejecuci\u00f3n resultado en el log que recibimos resulta ser 'en promedio' bastante grande.<\/p>\n<p>Veamos la estructura de una de las tablas en las que escribimos datos 'crudos' \u2014 es decir, justo el texto original del registro del log:<\/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 -- clave de secci\u00f3n\n    date\n, data -- lo m\u00e1s importante\n    text\n, PRIMARY KEY(pack, recno)\n);<\/code><\/pre>\n<p>\nUna tabla t\u00edpica (ya particionada, por supuesto, as\u00ed que esto es un template de secci\u00f3n), donde lo m\u00e1s importante es el texto. A veces, bastante voluminoso.<\/p>\n<p>Recordemos que el tama\u00f1o 'f\u00edsico' de un registro en PG no puede ocupar m\u00e1s de una p\u00e1gina de datos, pero el tama\u00f1o 'l\u00f3gico' es otra historia. Para insertar un valor voluminoso en un campo (varchar\/text\/bytea) se utiliza <noindex><a rel=\"nofollow\" href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/12\/storage-toast\">la tecnolog\u00eda TOAST<\/a><\/noindex>:<\/p>\n<blockquote><p>PostgreSQL utiliza un tama\u00f1o de p\u00e1gina fijo (generalmente 8 KB), y no permite que los tuplas ocupen varias p\u00e1ginas. Por lo tanto, no es posible almacenar directamente valores de campo muy grandes. Para superar esta limitaci\u00f3n, los valores de campo grandes se comprimen y\/o se dividen en varias filas f\u00edsicas. Esto ocurre de manera imperceptible para el usuario y afecta de forma m\u00ednima la mayor parte del c\u00f3digo del servidor. Este m\u00e9todo se conoce como TOAST \u2026<\/p><\/blockquote>\n<p>\nDe hecho, para cada tabla con campos \"potencialmente grandes\" se crea autom\u00e1ticamente <noindex><a rel=\"nofollow\" href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/12\/storage-toast#STORAGE-TOAST-ONDISK\">una tabla complementaria con \"segmentaci\u00f3n\"<\/a><\/noindex> de cada registro \"grande\" en segmentos de 2KB:<\/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>\nEs decir, si tenemos que grabar una fila con un valor \"grande\" <code>data<\/code>, la grabaci\u00f3n real ocurrir\u00e1 <b>no solo en la tabla principal y su clave primaria, sino tambi\u00e9n en TOAST y su clave primaria.<\/b>.<\/p>\n<h4>Reduciendo el impacto de TOAST<\/h4>\n<p>\nPero la mayor\u00eda de nuestros registros no son tan grandes, <b>deber\u00edan caber en 8KB.<\/b> \u00bfC\u00f3mo podemos ahorrar en esto?<\/p>\n<p>Aqu\u00ed entra en juego el atributo <noindex><a rel=\"nofollow\" href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/12\/storage-toast#STORAGE-TOAST-ONDISK\"><code>STORAGE<\/code><\/a><\/noindex> de la columna de la tabla:<\/p>\n<blockquote>\n<ul>\n<li><b>EXTENDED<\/b> permite tanto la compresi\u00f3n como el almacenamiento separado. Esta <b>es la opci\u00f3n est\u00e1ndar<\/b> para la mayor\u00eda de los tipos de datos compatibles con TOAST. Primero se intenta realizar la compresi\u00f3n, luego se guarda fuera de la tabla si la fila sigue siendo demasiado grande.<\/li>\n<li><b>MAIN<\/b> permite compresi\u00f3n, pero no almacenamiento separado. (De hecho, el almacenamiento separado, sin embargo, se llevar\u00e1 a cabo para esas columnas, pero solo <b>como \u00faltimo recurso<\/b>, cuando no hay otra manera de reducir la fila de manera que quepa en la p\u00e1gina.)<\/li>\n<\/ul>\n<\/blockquote>\n<p>De hecho, esto es exactamente lo que necesitamos para el texto \u2014 <b>comprimir al m\u00e1ximo, y si no cabe de ninguna manera \u2014 sacarlo a TOAST.<\/b>Esto se puede hacer directamente \"sobre la marcha\", con un solo comando:<\/p>\n<pre><code class=\"sql\">ALTER TABLE rawdata_orig ALTER COLUMN data SET STORAGE MAIN;<\/code><\/pre>\n<p><\/p>\n<h4>C\u00f3mo evaluar el efecto<\/h4>\n<p>\nDado que cada d\u00eda el flujo de datos cambia, no podemos comparar cifras absolutas, pero en relativos, cuanto <b>menor porcentaje<\/b> hay en TOAST \u2014 mejor. Pero aqu\u00ed hay un peligro: cuanto mayor sea nuestro volumen \"f\u00edsico\" de cada registro individual, m\u00e1s \"amplio\" se vuelve el \u00edndice, ya que es necesario cubrir una mayor cantidad de p\u00e1ginas de datos.<\/p>\n<p>Secci\u00f3n <b>antes de los cambios<\/b>:<\/p>\n<pre><code class=\"plaintext\">heap  = 37GB (39%)\nTOAST = 54GB (57%)\nPK    =  4GB ( 4%)\n<\/code><\/pre>\n<p>\nSecci\u00f3n <b>despu\u00e9s de los cambios<\/b>:<\/p>\n<pre><code class=\"plaintext\">heap  = 37GB (67%)\nTOAST = 16GB (29%)\nPK    =  2GB ( 4%)<\/code><\/pre>\n<p>\nDe hecho, <b>hemos comenzado a escribir en TOAST con el doble de frecuencia.<\/b>, lo que liber\u00f3 no solo el disco, sino tambi\u00e9n la CPU:<\/p>\n<p><img decoding=\"async\" alt=\"Ahorra unos centavos en grandes vol\u00famenes en PostgreSQL\" src=\"\/wp-content\/uploads\/2020\/04\/547485eff9c6491ffe4d59e5c81f656d.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<img decoding=\"async\" alt=\"Ahorra unos centavos en grandes vol\u00famenes en PostgreSQL\" src=\"\/wp-content\/uploads\/2020\/04\/6bd3b18146c20959693f961e41fff447.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nCabe destacar que ahora \u2018leemos\u2019 menos el disco, no solo \u2018escribimos\u2019 \u2014 ya que al insertar un registro en alguna tabla, hay que \u2018leer\u2019 tambi\u00e9n parte del \u00e1rbol de cada uno de los \u00edndices para determinar su futura posici\u00f3n en ellos.<\/p>\n<h2>A qui\u00e9n le va bien vivir en PostgreSQL 11<\/h2>\n<p>\nDespu\u00e9s de actualizar a PG11, decidimos continuar con la \u2018optimizaci\u00f3n\u2019 de TOAST y notamos que a partir de esta versi\u00f3n se hizo disponible un par\u00e1metro para su configuraci\u00f3n <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>El c\u00f3digo de manejo de TOAST se activa solo cuando el valor de la fila que debe almacenarse en la tabla supera el tama\u00f1o de TOAST_TUPLE_THRESHOLD bytes (generalmente son 2 Kb). El c\u00f3digo de TOAST comprimir\u00e1 y\/o mover\u00e1 los valores del campo fuera de la tabla hasta que el valor de la fila sea menor que TOAST_TUPLE_TARGET bytes (un valor variable, que tambi\u00e9n suele ser 2 Kb) o no se podr\u00e1 reducir su tama\u00f1o.<\/p><\/blockquote>\n<p>Decidimos que nuestros datos suelen ser \u2018muy cortos\u2019 o \u2018muy largos\u2019, as\u00ed que decidimos limitarnos al valor m\u00ednimo posible:<\/p>\n<pre><code class=\"sql\">ALTER TABLE rawplan_orig SET (toast_tuple_target = 128);<\/code><\/pre>\n<p>\nVeamos c\u00f3mo las nuevas configuraciones han afectado a la carga del disco despu\u00e9s de la reconfiguraci\u00f3n:<\/p>\n<p><img decoding=\"async\" alt=\"Ahorra unos centavos en grandes vol\u00famenes en PostgreSQL\" src=\"\/wp-content\/uploads\/2020\/04\/ccaa4879e413a566b362d01582eb8c19.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n\u00a1No est\u00e1 mal! La <b>cola hacia el disco se redujo<\/b> aproximadamente en 1.5 veces, y la \u2018ocupaci\u00f3n\u2019 del disco \u2014 un 20% menos. Pero, \u00bfpodr\u00eda esto haber afectado a la CPU?<\/p>\n<p><img decoding=\"async\" alt=\"Ahorra unos centavos en grandes vol\u00famenes en PostgreSQL\" src=\"\/wp-content\/uploads\/2020\/04\/f7026e5809853d35c6fb7a8376b9f369.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nAl menos no ha empeorado. Aunque es dif\u00edcil opinar, si incluso estos vol\u00famenes no pueden elevar la carga promedio de la CPU por encima de <b>5%<\/b>.<\/p>\n<h2>\u00a1El cambio de lugar de los sumandos\u2026 \u00a1cambia la suma!<\/h2>\n<p>\nComo es bien sabido, el centavo ahorra el rublo, y con nuestros vol\u00famenes de almacenamiento de aproximadamente <b>10TB\/mes<\/b> incluso una peque\u00f1a optimizaci\u00f3n puede ofrecer un buen beneficio. As\u00ed que prestamos atenci\u00f3n a la estructura f\u00edsica de nuestros datos \u2014 como espec\u00edficamente <b>los campos est\u00e1n 'dispuestos' dentro del registro<\/b> de cada una de las tablas.<\/p>\n<p>Porque debido a <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/postgrespro\/blog\/444536\/\">la alineaci\u00f3n de datos<\/a><\/noindex> esto influye directamente <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.gitlab.com\/ee\/development\/ordering_table_columns.html\">en el volumen resultante<\/a><\/noindex>:<\/p>\n<blockquote><p>Muchas arquitecturas hacen de la alineaci\u00f3n de datos un requisito a los l\u00edmites de palabras de la m\u00e1quina. Por ejemplo, en un sistema de 32 bits x86, los enteros (tipo integer, que ocupa 4 bytes) estar\u00e1n alineados a la frontera de palabras de 4 bytes, al igual que los n\u00fameros de punto flotante de doble precisi\u00f3n (tipo double precision, 8 bytes). Y en un sistema de 64 bits, los valores dobles estar\u00e1n alineados a la frontera de palabras de 8 bytes. Esta es otra raz\u00f3n para la incompatibilidad.<\/p>\n<p>Debido a la alineaci\u00f3n, el tama\u00f1o de la fila de la tabla depende del orden de los campos. Normalmente, este efecto no es muy notable, pero en algunos casos puede provocar un aumento considerable en el tama\u00f1o. Por ejemplo, si se mezclan campos de tipos char(1) e integer, entre ellos, por lo general, se perder\u00e1n 3 bytes de manera innecesaria.<\/p><\/blockquote>\n<p>\nComencemos con modelos sint\u00e9ticos:<\/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>\n\u00bfDe d\u00f3nde provienen un par de bytes adicionales en el primer caso? Es simple \u2014 <b>un smallint de 2 bytes se alinea a un l\u00edmite de 4 bytes<\/b> antes del siguiente campo, y cuando ocupa la \u00faltima posici\u00f3n, no hay nada que alinear y no se necesita.<\/p>\n<p>En teor\u00eda, todo est\u00e1 bien y se pueden mover los campos de cualquier manera. Verifiquemos con datos reales usando como ejemplo una de las tablas, cuya secci\u00f3n diaria ocupa entre 10-15GB.<\/p>\n<p>Estructura original:<\/p>\n<pre><code class=\"sql\">CREATE TABLE public.plan_20190220\n(\n-- Heredada de la tabla plan:  pack uuid NOT NULL,\n-- Heredada de la tabla plan:  recno smallint NOT NULL,\n-- Heredada de la tabla plan:  host uuid,\n-- Heredada de la tabla plan:  ts timestamp with time zone,\n-- Heredada de la tabla plan:  exectime numeric(32,3),\n-- Heredada de la tabla plan:  duration numeric(32,3),\n-- Heredada de la tabla plan:  bufint bigint,\n-- Heredada de la tabla plan:  bufmem bigint,\n-- Heredada de la tabla plan:  bufdsk bigint,\n-- Heredada de la tabla plan:  apn uuid,\n-- Heredada de la tabla plan:  ptr uuid,\n-- Heredada de la tabla 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>\nLa secci\u00f3n despu\u00e9s de cambiar el orden de las columnas \u2014 exactamente <b>los mismos campos, solo en otro orden<\/b>:<\/p>\n<pre><code class=\"sql\">CREATE TABLE public.plan_20190221\n(\n-- Heredada de la tabla plan:  dt date NOT NULL,\n-- Heredada de la tabla plan:  ts timestamp with time zone,\n-- Heredada de la tabla plan:  pack uuid NOT NULL,\n-- Heredada de la tabla plan:  recno smallint NOT NULL,\n-- Heredada de la tabla plan:  host uuid,\n-- Heredada de la tabla plan:  apn uuid,\n-- Heredada de la tabla plan:  ptr uuid,\n-- Heredada de la tabla plan:  bufint bigint,\n-- Heredada de la tabla plan:  bufmem bigint,\n-- Heredada de la tabla plan:  bufdsk bigint,\n-- Heredada de la tabla plan:  exectime numeric(32,3),\n-- Heredada de la tabla 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>\nEl volumen total de la secci\u00f3n se determina por la cantidad de \"hechos\" y depende \u00fanicamente de procesos externos, por lo tanto, dividimos el tama\u00f1o heap (<code>pg_relation_size<\/code>) sobre el n\u00famero de registros en ella \u2014 es decir, obtendremos <b>el tama\u00f1o medio de un registro almacenado real<\/b>:<\/p>\n<p><img decoding=\"async\" alt=\"Ahorra unos centavos en grandes vol\u00famenes en PostgreSQL\" src=\"\/wp-content\/uploads\/2020\/04\/06be2d7d70d223e7678f9a478e4c293f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<b>Menos 6% del volumen<\/b>, \u00a1excelente!<\/p>\n<p>Pero, por supuesto, no todo es tan color de rosa \u2014 porque <b>en los \u00edndices no podemos cambiar el orden de los campos<\/b>, y por lo tanto \"en general\" (<code>pg_total_relation_size<\/code>)\u2026<\/p>\n<p><img decoding=\"async\" alt=\"Ahorra unos centavos en grandes vol\u00famenes en PostgreSQL\" src=\"\/wp-content\/uploads\/2020\/04\/8beff38e5034fc0d40665b75cb3b3625.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n\u2026 a pesar de ello aqu\u00ed tambi\u00e9n <b>ahorramos un 1.5%<\/b>, sin cambiar una l\u00ednea de c\u00f3digo. \u00a1As\u00ed es!<\/p>\n<p><img decoding=\"async\" alt=\"Ahorra unos centavos en grandes vol\u00famenes en PostgreSQL\" src=\"\/wp-content\/uploads\/2020\/04\/10f4a2151465a38bf45823a5d360302b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Quiero se\u00f1alar que la disposici\u00f3n de campos mencionada anteriormente no es un hecho de que sea la m\u00e1s \u00f3ptima. Porque algunos bloques de campos no queremos \"romper\" ya por razones est\u00e9ticas \u2014 por ejemplo, un par <code>(pack, recno)<\/code>, que es la PK para esta tabla.<\/p>\n<p>En general, la definici\u00f3n de la disposici\u00f3n \"m\u00ednima\" de campos es una tarea de \"b\u00fasqueda\" bastante sencilla. Por lo tanto, puedes obtener resultados en tus propios datos incluso mejores que los nuestros \u2014 \u00a1pru\u00e9balo!<br \/>\n<br \/>Fuente: <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.2 - 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\/es\/blog\/administrirovanie\/ekonomim-kopeechku-na-bolshih-obemah-v-postgresql\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"es_ES\" \/>\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\/es\/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\udd47Ahorra un centavo en grandes vol\u00famenes en PostgreSQL | ProHoster","description":"Continuando con el tema de registrar grandes flujos de datos, planteado en el art\u00edculo anterior sobre particionamiento, en este veremos las formas en las que se puede.","canonical_url":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/ekonomim-kopeechku-na-bolshih-obemah-v-postgresql","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"es_ES","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\/es\/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\/es\/wp-json\/wp\/v2\/posts\/79039","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/comments?post=79039"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/79039\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media\/79040"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media?parent=79039"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/categories?post=79039"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/tags?post=79039"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}