{"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\/pt\/blog\/administrirovanie\/ekonomim-kopeechku-na-bolshih-obemah-v-postgresql","title":{"rendered":"Economizando um pouco em grandes volumes no PostgreSQL","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Dando continuidade ao tema de registro de grandes fluxos de dados, levantado <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/497008\/\">no artigo anterior sobre particionamento<\/a><\/noindex>, neste artigo vamos explorar m\u00e9todos para <b>reduzir o tamanho \"f\u00edsico\" dos dados armazenados<\/b> no PostgreSQL e seu impacto no desempenho do servidor.<\/p>\n<p>Vamos falar sobre <b>as configura\u00e7\u00f5es TOAST e o alinhamento de dados<\/b>. \"Em m\u00e9dia\", esses m\u00e9todos permitir\u00e3o economizar n\u00e3o muitos recursos, mas \u2014 sem qualquer modifica\u00e7\u00e3o no c\u00f3digo do aplicativo.<\/p>\n<p><img decoding=\"async\" alt=\"Economizando um pouco em grandes volumes no PostgreSQL\" src=\"\/wp-content\/uploads\/2020\/04\/4d43b9b43edb10c4c8f13159c7dd1eac.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nNo entanto, nossa experi\u00eancia foi bastante produtiva nesse aspecto, j\u00e1 que o armazenamento da maioria das monitoriza\u00e7\u00f5es \u00e9 <b>em grande parte apenas append-only<\/b> no que diz respeito aos dados gravados. E se voc\u00ea est\u00e1 curioso sobre como fazer um banco escrever em disco em vez de <b>200MB\/s<\/b> metade disso \u2014 continue lendo.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Pequenos segredos de grandes dados<\/h2>\n<p>\nDe acordo com o perfil de trabalho <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/487380\/\">do nosso servi\u00e7o<\/a><\/noindex>, ele recebe regularmente dos logs <b>pacotes de texto<\/b>.<\/p>\n<p>E como <noindex><a rel=\"nofollow\" href=\"https:\/\/sbis.ru\/all_services\">o complexo SBIS<\/a><\/noindex>, cujos bancos de dados monitoramos, \u00e9 um produto multi-componente com estruturas de dados complexas, as consultas <b>para alcan\u00e7ar o m\u00e1ximo desempenho<\/b> s\u00e3o, portanto, <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/486072\/\">\"multivolumes\" com l\u00f3gica algor\u00edtmica complexa<\/a><\/noindex>. Assim, o volume de cada inst\u00e2ncia de consulta ou do plano de execu\u00e7\u00e3o resultante nos logs \u00e9, em m\u00e9dia, bastante grande.<\/p>\n<p>Vamos dar uma olhada na estrutura de uma das tabelas onde escrevemos os dados \"brutos\" \u2014 ou seja, o texto original do registro no 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 -- chave de se\u00e7\u00e3o\n    date\n, data -- o mais importante\n    text\n, PRIMARY KEY(pack, recno)\n);<\/code><\/pre>\n<p>\nUma tabela t\u00edpica (j\u00e1 particionada, sem d\u00favida, portanto, isso \u00e9 um modelo de se\u00e7\u00e3o), onde o mais importante \u00e9 o texto. \u00c0s vezes, bastante extenso.<\/p>\n<p>Lembre-se de que o tamanho \"f\u00edsico\" de um registro no PG n\u00e3o pode ocupar mais do que uma p\u00e1gina de dados, mas o tamanho \"l\u00f3gico\" \u00e9 outra hist\u00f3ria. Para gravar um valor extenso (varchar\/text\/bytea) no campo \u00e9 utilizada <noindex><a rel=\"nofollow\" href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/12\/storage-toast\">a tecnologia TOAST<\/a><\/noindex>:<\/p>\n<blockquote><p>O PostgreSQL utiliza um tamanho fixo de p\u00e1gina (geralmente 8 KB) e n\u00e3o permite que tuplas ocupem v\u00e1rias p\u00e1ginas. Portanto, n\u00e3o \u00e9 poss\u00edvel armazenar valores muito grandes diretamente em campos. Para contornar essa limita\u00e7\u00e3o, grandes valores de campos s\u00e3o comprimidos e\/ou divididos em v\u00e1rias linhas f\u00edsicas. Isso acontece de forma discreta para o usu\u00e1rio e impacta pouco a maior parte do c\u00f3digo do servidor. Esse m\u00e9todo \u00e9 conhecido como TOAST \u2026<\/p><\/blockquote>\n<p>\nNa verdade, para cada tabela com campos \"potencialmente grandes\", automaticamente <noindex><a rel=\"nofollow\" href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/12\/storage-toast#STORAGE-TOAST-ONDISK\">\u00e9 criada uma tabela auxiliar com \"fatiamento\"<\/a><\/noindex> de cada registro \"grande\" em segmentos de 2KB:<\/p>\n<pre><code class=\"sql\">TOAST(\n  chunk_id\n    inteiro\n, chunk_seq\n    inteiro\n, chunk_data\n    bytea\n, CHAVE PRIM\u00c1RIA(chunk_id, chunk_seq)\n);<\/code><\/pre>\n<p>\nOu seja, se precisamos gravar uma linha com um valor \"grande\" <code>data<\/code>, a grava\u00e7\u00e3o real ocorrer\u00e1 <b>n\u00e3o apenas na tabela principal e seu PK, mas tamb\u00e9m no TOAST e seu PK<\/b>.<\/p>\n<h4>Reduzindo o impacto do TOAST<\/h4>\n<p>\nMas a maioria dos registros n\u00e3o \u00e9 t\u00e3o grande assim, <b>deveriam caber nos 8KB<\/b> \u2014 como economizar nisso?..<\/p>\n<p>Aqui, o atributo <noindex><a rel=\"nofollow\" href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/12\/storage-toast#STORAGE-TOAST-ONDISK\"><code>STORAGE<\/code><\/a><\/noindex> da coluna da tabela vem em nosso aux\u00edlio:<\/p>\n<blockquote>\n<ul>\n<li><b>EXTENDED<\/b> permite tanto compress\u00e3o quanto armazenamento separado. Este \u00e9 <b>o padr\u00e3o para a maioria dos tipos de dados compat\u00edveis com TOAST. Primeiro, \u00e9 feita uma tentativa de compress\u00e3o, depois \u2014 o armazenamento fora da tabela, se a linha ainda for grande demais.<\/b> MAIN<\/li>\n<li><b>permite compress\u00e3o, mas n\u00e3o armazenamento separado. (Na verdade, o armazenamento separado, no entanto, ser\u00e1 realizado para tais colunas, mas apenas<\/b> como uma \u00faltima medida <b>, quando n\u00e3o h\u00e1 outra maneira de reduzir a linha para que ela caiba na p\u00e1gina.)<\/b>Na verdade, isso \u00e9 exatamente o que precisamos para texto \u2014<\/li>\n<\/ul>\n<\/blockquote>\n<p>comprimir ao m\u00e1ximo, e se n\u00e3o couber de forma alguma \u2014 transferir para TOAST <b>. Isso pode ser feito diretamente \"em tempo real\", com um \u00fanico comando:<\/b>ALTER TABLE rawdata_orig ALTER COLUMN data SET STORAGE MAIN;<\/p>\n<pre><code class=\"sql\">Como avaliar o efeito<\/code><\/pre>\n<p><\/p>\n<h4>Como o fluxo de dados muda a cada dia, n\u00e3o podemos comparar n\u00fameros absolutos, mas em termos relativos quanto<\/h4>\n<p>\nmenor a propor\u00e7\u00e3o <b>que gravamos no TOAST \u2014 melhor. Mas h\u00e1 um perigo aqui \u2014 quanto maior for o \"volume f\u00edsico\" de cada registro individual, mais \"amplo\" se torna o \u00edndice, pois \u00e9 necess\u00e1rio cobrir uma maior quantidade de p\u00e1ginas de dados.<\/b> antes das altera\u00e7\u00f5es<\/p>\n<p>Se\u00e7\u00e3o <b>heap  = 37GB (39%)\nTOAST = 54GB (57%)\nPK    =  4GB ( 4%)<\/b>:<\/p>\n<pre><code class=\"plaintext\">depois das altera\u00e7\u00f5es\n<\/code><\/pre>\n<p>\nSe\u00e7\u00e3o <b>heap  = 37GB (67%)\nTOAST = 16GB (29%)\nPK    =  2GB ( 4%)<\/b>:<\/p>\n<pre><code class=\"plaintext\">Na verdade, n\u00f3s<\/code><\/pre>\n<p>\ncome\u00e7amos a gravar no TOAST com 2 vezes menos frequ\u00eancia. <b>passaram a escrever no TOAST duas vezes menos<\/b>, que aliviou n\u00e3o apenas o disco, mas tamb\u00e9m a CPU:<\/p>\n<p><img decoding=\"async\" alt=\"Economizando um pouco em grandes volumes no PostgreSQL\" src=\"\/wp-content\/uploads\/2020\/04\/547485eff9c6491ffe4d59e5c81f656d.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<img decoding=\"async\" alt=\"Economizando um pouco em grandes volumes no PostgreSQL\" src=\"\/wp-content\/uploads\/2020\/04\/6bd3b18146c20959693f961e41fff447.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nObserve que agora tamb\u00e9m lemos o disco menos, n\u00e3o apenas escrevemos \u2014 pois ao inserir um registro em uma tabela, precisamos \"ler\" uma parte da \u00e1rvore de cada um dos \u00edndices para determinar sua futura posi\u00e7\u00e3o.<\/p>\n<h2>Quem vive bem com PostgreSQL 11<\/h2>\n<p>\nAp\u00f3s a atualiza\u00e7\u00e3o para PG11, decidimos continuar o \"ajuste\" do TOAST e notamos que a partir desta vers\u00e3o, um par\u00e2metro tornou-se configur\u00e1vel <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>O c\u00f3digo de processamento do TOAST \u00e9 acionado apenas quando o valor da linha que deve ser armazenado na tabela \u00e9 maior do que TOAST_TUPLE_THRESHOLD bytes (geralmente 2 KB). O c\u00f3digo TOAST ir\u00e1 comprimir e\/ou mover os valores do campo para fora da tabela at\u00e9 que o valor da linha seja menor que TOAST_TUPLE_TARGET bytes (um valor vari\u00e1vel, geralmente tamb\u00e9m 2 KB) ou at\u00e9 que n\u00e3o seja mais poss\u00edvel reduzir o volume.<\/p><\/blockquote>\n<p>Decidimos que os dados costumam ser ou \"muito curtos\" ou \"muito longos\", ent\u00e3o optamos pelo valor minimamente poss\u00edvel:<\/p>\n<pre><code class=\"sql\">ALTER TABLE rawplan_orig SET (toast_tuple_target = 128);<\/code><\/pre>\n<p>\nVamos ver como as novas configura\u00e7\u00f5es afetaram o uso do disco ap\u00f3s a reconfigura\u00e7\u00e3o:<\/p>\n<p><img decoding=\"async\" alt=\"Economizando um pouco em grandes volumes no PostgreSQL\" src=\"\/wp-content\/uploads\/2020\/04\/ccaa4879e413a566b362d01582eb8c19.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nMuito bom! A m\u00e9dia <b>da fila para o disco foi reduzida<\/b> em cerca de 1,5 vezes, e a \"ocupa\u00e7\u00e3o\" do disco \u2013 em cerca de 20%! Mas ser\u00e1 que isso teve algum impacto na CPU?<\/p>\n<p><img decoding=\"async\" alt=\"Economizando um pouco em grandes volumes no PostgreSQL\" src=\"\/wp-content\/uploads\/2020\/04\/f7026e5809853d35c6fb7a8376b9f369.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nPelo menos, n\u00e3o piorou. Embora seja dif\u00edcil julgar, j\u00e1 que at\u00e9 mesmo esses volumes n\u00e3o conseguem elevar a carga m\u00e9dia da CPU. <b>5%<\/b>.<\/p>\n<h2>Mudan\u00e7as nas posi\u00e7\u00f5es dos elementos da soma... alteram-se!<\/h2>\n<p>\nComo todos sabem, um centavo economiza um real, e com nossos volumes de armazenamento de cerca de <b>10TB\/m\u00eas<\/b> at\u00e9 mesmo uma pequena otimiza\u00e7\u00e3o pode proporcionar um bom lucro. Portanto, nos concentramos na estrutura f\u00edsica dos nossos dados \u2014 como exatamente <b>\"dispostos\" os campos dentro de cada registro<\/b> de cada uma das tabelas.<\/p>\n<p>Porque devido ao <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/postgrespro\/blog\/444536\/\">alinhamento dos dados<\/a><\/noindex> isso, diretamente <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.gitlab.com\/ee\/development\/ordering_table_columns.html\">impacta no volume resultante<\/a><\/noindex>:<\/p>\n<blockquote><p>Muitas arquiteturas prev\u00eaem o alinhamento de dados nos limites das palavras da m\u00e1quina. Por exemplo, em um sistema de 32 bits x86, n\u00fameros inteiros (tipo integer, que ocupa 4 bytes) ser\u00e3o alinhados ao limite de palavras de 4 bytes, assim como n\u00fameros de ponto flutuante de precis\u00e3o dupla (tipo double precision, 8 bytes). E em um sistema de 64 bits, os valores double ser\u00e3o alinhados ao limite de palavras de 8 bytes. Esta \u00e9 mais uma raz\u00e3o para a incompatibilidade.<\/p>\n<p>Devido ao alinhamento, o tamanho da linha da tabela depende da ordem em que os campos est\u00e3o dispostos. Normalmente, esse efeito n\u00e3o \u00e9 muito percept\u00edvel, mas em alguns casos, pode resultar em um aumento significativo do tamanho. Por exemplo, se os campos dos tipos char(1) e integer forem misturados, geralmente haver\u00e1 um desperd\u00edcio de 3 bytes entre eles.<\/p><\/blockquote>\n<p>\nVamos come\u00e7ar com 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>\nDe onde surgiram alguns bytes extras no primeiro caso? \u00c9 simples \u2014 <b>smallint de 2 bytes \u00e9 alinhado a uma borda de 4 bytes<\/b> antes do pr\u00f3ximo campo, e quando est\u00e1 por \u00faltimo \u2014 n\u00e3o h\u00e1 nada para alinhar.<\/p>\n<p>Em teoria \u2014 tudo est\u00e1 bem e os campos podem ser rearranjados como quiser. Vamos verificar com dados reais, usando uma das tabelas, cuja se\u00e7\u00e3o di\u00e1ria ocupa entre 10 e 15GB.<\/p>\n<p>Estrutura original:<\/p>\n<pre><code class=\"sql\">CREATE TABLE public.plan_20190220\n(\n-- Herdado da tabela plan:  pack uuid NOT NULL,\n-- Herdado da tabela plan:  recno smallint NOT NULL,\n-- Herdado da tabela plan:  host uuid,\n-- Herdado da tabela plan:  ts timestamp with time zone,\n-- Herdado da tabela plan:  exectime numeric(32,3),\n-- Herdado da tabela plan:  duration numeric(32,3),\n-- Herdado da tabela plan:  bufint bigint,\n-- Herdado da tabela plan:  bufmem bigint,\n-- Herdado da tabela plan:  bufdsk bigint,\n-- Herdado da tabela plan:  apn uuid,\n-- Herdado da tabela plan:  ptr uuid,\n-- Herdado da tabela 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>\nSe\u00e7\u00e3o ap\u00f3s a troca de ordem das colunas \u2014 exatamente <b>os mesmos campos, apenas em outra ordem<\/b>:<\/p>\n<pre><code class=\"sql\">CREATE TABLE public.plan_20190221\n(\n-- Herdado da tabela plan:  dt date NOT NULL,\n-- Herdado da tabela plan:  ts timestamp with time zone,\n-- Herdado da tabela plan:  pack uuid NOT NULL,\n-- Herdado da tabela plan:  recno smallint NOT NULL,\n-- Herdado da tabela plan:  host uuid,\n-- Herdado da tabela plan:  apn uuid,\n-- Herdado da tabela plan:  ptr uuid,\n-- Herdado da tabela plan:  bufint bigint,\n-- Herdado da tabela plan:  bufmem bigint,\n-- Herdado da tabela plan:  bufdsk bigint,\n-- Herdado da tabela plan:  exectime numeric(32,3),\n-- Herdado da tabela 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>\nO volume total da se\u00e7\u00e3o \u00e9 determinado pela quantidade de \"fatos\" e depende apenas de processos externos, portanto, vamos dividir o tamanho do heap (<code>pg_relation_size<\/code>) para a quantidade de registros nela \u2014 ou seja, vamos obter <b>o tamanho m\u00e9dio do registro armazenado<\/b>:<\/p>\n<p><img decoding=\"async\" alt=\"Economizando um pouco em grandes volumes no PostgreSQL\" src=\"\/wp-content\/uploads\/2020\/04\/06be2d7d70d223e7678f9a478e4c293f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<b>Menos 6% do volume<\/b>, \u00f3timo!<\/p>\n<p>Mas nem tudo \u00e9 t\u00e3o cor-de-rosa \u2014 afinal <b>nos \u00edndices n\u00e3o podemos mudar a ordem dos campos<\/b>, e portanto, \"no geral\" (<code>pg_total_relation_size<\/code>)\u2026<\/p>\n<p><img decoding=\"async\" alt=\"Economizando um pouco em grandes volumes no PostgreSQL\" src=\"\/wp-content\/uploads\/2020\/04\/8beff38e5034fc0d40665b75cb3b3625.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n\u2026 ainda assim aqui <b>economizamos 1.5%<\/b>, sem alterar uma linha de c\u00f3digo. \u00c9 isso mesmo!<\/p>\n<p><img decoding=\"async\" alt=\"Economizando um pouco em grandes volumes no PostgreSQL\" src=\"\/wp-content\/uploads\/2020\/04\/10f4a2151465a38bf45823a5d360302b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Observamos que a disposi\u00e7\u00e3o dos campos proposta acima n\u00e3o \u00e9 necessariamente a mais otimizada. Pois alguns blocos de campos n\u00e3o queremos \"quebrar\" por raz\u00f5es est\u00e9ticas \u2014 por exemplo, um par <code>(pack, recno)<\/code>, que \u00e9 a PK dessa tabela.<\/p>\n<p>De modo geral, a determina\u00e7\u00e3o da disposi\u00e7\u00e3o \"m\u00ednima\" dos campos \u00e9 uma tarefa de \"exaust\u00e3o\" relativamente simples. Portanto, voc\u00ea pode obter resultados at\u00e9 melhores que os nossos com os seus dados \u2014 experimente!<br \/>\n<br \/>Fonte: <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.3 - 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\/pt\/blog\/administrirovanie\/ekonomim-kopeechku-na-bolshih-obemah-v-postgresql\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"pt_PT\" \/>\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\/pt\/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\udd47 Economizamos centavos em grandes volumes no PostgreSQL | ProHoster","description":"Dando continuidade ao tema de gravar grandes fluxos de dados, levantado no artigo anterior sobre particionamento, neste abordaremos os m\u00e9todos que podem ser utilizados.","canonical_url":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/ekonomim-kopeechku-na-bolshih-obemah-v-postgresql","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pt_PT","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\/pt\/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\/pt\/wp-json\/wp\/v2\/posts\/79039","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/comments?post=79039"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/79039\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media\/79040"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media?parent=79039"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/categories?post=79039"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/tags?post=79039"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}