{"id":7622,"date":"2018-10-29T07:30:24","date_gmt":"2018-10-29T10:30:24","guid":{"rendered":"http:\/\/www.fernandoquadro.com.br\/html\/?p=7622"},"modified":"2018-10-26T14:42:52","modified_gmt":"2018-10-26T17:42:52","slug":"a-evolucao-do-particionamento-do-postgresql-9-6-ao-11","status":"publish","type":"post","link":"https:\/\/www.fernandoquadro.com.br\/html\/2018\/10\/29\/a-evolucao-do-particionamento-do-postgresql-9-6-ao-11\/","title":{"rendered":"A Evolu\u00e7\u00e3o do Particionamento do PostgreSQL 9.6 ao 11"},"content":{"rendered":"<p>Durante o ciclo de desenvolvimento do <a href=\"https:\/\/www.2ndquadrant.com\/en\/postgresql\/2ndquadrants-passion-postgresql\/contributions-postgresql-11\/\" rel=\"noopener\" target=\"_blank\">PostgreSQL 11<\/a>, uma quantidade impressionante de trabalho foi feito para melhorar o particionamento de tabelas.  O particionamento de tabelas \u00e9 um recurso que existe no PostgreSQL h\u00e1 bastante tempo, mas s\u00f3 a partir da vers\u00e3o 10 que ele come\u00e7ou a se tornar um recurso altamente \u00fatil. Anteriormente, era afirmado que a heran\u00e7a de tabelas era a implementa\u00e7\u00e3o de particionamento, o que era verdade. Apenas deixava voc\u00ea fazer o trabalho (e muito) manualmente. Por exemplo, durante INSERTs, se voc\u00ea quisesse que as tuplas cheguem \u00e0s suas parti\u00e7\u00f5es, voc\u00ea precisava configurar triggers para fazer isso por voc\u00ea. O particionamento de heran\u00e7a tamb\u00e9m era lento e dif\u00edcil de desenvolver recursos adicionais.<\/p>\n<p>No PostgreSQL 10, vimos o nascimento do \u201cParticionamento Declarativo\u201d, um recurso projetado para resolver muitos dos problemas que n\u00e3o eram solucionados com o m\u00e9todo de heran\u00e7a antigo de particionamento. Isso resultou em uma ferramenta muito mais poderosa para permitir que voc\u00ea divida horizontalmente seus dados!<\/p>\n<p><strong>1. Compara\u00e7\u00e3o de recursos<\/strong><\/p>\n<p>O PostgreSQL 11 vem completo com um conjunto impressionante de novos recursos para ajudar a melhorar o desempenho e tamb\u00e9m para ajudar a tornar as tabelas particionadas mais transparentes para os aplicativos.<\/p>\n<p><center><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2018\/10\/postgresql_partition.png\" alt=\"\" width=\"648\" height=\"791\" class=\"aligncenter size-full wp-image-7623\" srcset=\"https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2018\/10\/postgresql_partition.png 648w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2018\/10\/postgresql_partition-246x300.png 246w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2018\/10\/postgresql_partition-600x732.png 600w\" sizes=\"auto, (max-width: 648px) 100vw, 648px\" \/><\/center><\/p>\n<p><strong>2. Performance<\/strong><\/p>\n<p>Um novo m\u00e9todo para realizar o particionamento foi adicionado. Esse novo algoritmo \u00e9 capaz de determinar parti\u00e7\u00f5es correspondentes observando a cl\u00e1usula WHERE da consulta. O algoritmo anterior verificava cada parti\u00e7\u00e3o, por sua vez, para ver se ela poderia corresponder \u00e0 cl\u00e1usula WHERE da consulta. Isso resultava em um aumento adicional no tempo de planejamento \u00e0 medida que o n\u00famero de parti\u00e7\u00f5es aumentava.<\/p>\n<p>Na vers\u00e3o 9.6, com particionamento de heran\u00e7a, as tuplas de roteamento para uma parti\u00e7\u00e3o eram geralmente feitas escrevendo uma fun\u00e7\u00e3o de trigger que continha uma s\u00e9rie de instru\u00e7\u00f5es IF para INSERT condicionalmente a tupla na parti\u00e7\u00e3o correta. Essas fun\u00e7\u00f5es podiam ser lentas para serem executadas. Com a parti\u00e7\u00e3o declarativa adicionada na vers\u00e3o 10, isso ficou significativamente mais r\u00e1pido.<\/p>\n<p>Usando uma tabela particionada com 100 parti\u00e7\u00f5es, podemos ver o desempenho de carregar 10 milh\u00f5es de linhas em uma tabela de 1 colunas BIGINT e INT.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2018\/10\/partition_prune_bench_chart2.png\" alt=\"\" width=\"1057\" height=\"653\" class=\"aligncenter size-full wp-image-7625\" srcset=\"https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2018\/10\/partition_prune_bench_chart2.png 1057w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2018\/10\/partition_prune_bench_chart2-300x185.png 300w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2018\/10\/partition_prune_bench_chart2-768x474.png 768w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2018\/10\/partition_prune_bench_chart2-1024x633.png 1024w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2018\/10\/partition_prune_bench_chart2-945x584.png 945w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2018\/10\/partition_prune_bench_chart2-600x371.png 600w\" sizes=\"auto, (max-width: 1057px) 100vw, 1057px\" \/><\/p>\n<p>Consultando essa tabela para executar uma pesquisa de um \u00fanico registro indexado e executar o DML para manipular um \u00fanico registro (usando apenas 1 CPU):<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2018\/10\/non_prepared_comparison2.png\" alt=\"\" width=\"1056\" height=\"652\" class=\"aligncenter size-full wp-image-7626\" srcset=\"https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2018\/10\/non_prepared_comparison2.png 1056w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2018\/10\/non_prepared_comparison2-300x185.png 300w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2018\/10\/non_prepared_comparison2-768x474.png 768w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2018\/10\/non_prepared_comparison2-1024x632.png 1024w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2018\/10\/non_prepared_comparison2-945x583.png 945w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2018\/10\/non_prepared_comparison2-600x370.png 600w\" sizes=\"auto, (max-width: 1056px) 100vw, 1056px\" \/><\/p>\n<p>Aqui podemos ver que o desempenho de cada opera\u00e7\u00e3o melhorou bastante desde o PG 9.6. As consultas SELECT est\u00e3o parecendo muito melhores, especialmente aquelas que s\u00e3o capazes de eliminar muitas das parti\u00e7\u00f5es durante o planejamento de consultas. Isso significa que n\u00e3o \u00e9 mais necess\u00e1rio fazer muito do trabalho que precisava ser feito anteriormente. Por exemplo, n\u00e3o criamos mais caminhos para parti\u00e7\u00f5es desnecess\u00e1rias.<\/p>\n<p><strong>3. Resumo<\/strong><\/p>\n<p>O particionamento de tabelas est\u00e1 come\u00e7ando a se tornar um recurso muito poderoso no PostgreSQL. <strong>O particionamento permite que os dados sejam rapidamente colocados on-line e colocados off-line sem a necessidade de esperar pela conclus\u00e3o de opera\u00e7\u00f5es DML em massa (lentas)<\/strong>. Tamb\u00e9m significa que os dados relacionados podem ser armazenados juntos, o que significa que os dados necess\u00e1rios podem ser acessados \u200b\u200bcom muito mais efici\u00eancia. As melhorias feitas nesta vers\u00e3o n\u00e3o teriam sido poss\u00edveis sem os desenvolvedores, os revisores e os committers que trabalharam incansavelmente em todos esses recursos.<\/p>\n<p>Obrigado a todos eles! <strong>O PostgreSQL 11 \u00e9 um lan\u00e7amento fant\u00e1stico!<\/strong><\/p>\n<p>Fonte: <a href=\"https:\/\/blog.2ndquadrant.com\/partitioning-evolution-postgresql-11\/\" rel=\"noopener\" target=\"_blank\">Blog 2ndQuadrant<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Durante o ciclo de desenvolvimento do PostgreSQL 11, uma quantidade impressionante de trabalho foi feito para melhorar o particionamento de tabelas. O particionamento de tabelas \u00e9 um recurso que existe no PostgreSQL h\u00e1 bastante tempo, mas s\u00f3 a partir da&#8230; <a class=\"more-link\" href=\"https:\/\/www.fernandoquadro.com.br\/html\/2018\/10\/29\/a-evolucao-do-particionamento-do-postgresql-9-6-ao-11\/\">Continue Reading &rarr;<\/a><\/p>\n","protected":false},"author":275,"featured_media":7628,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6],"tags":[230],"class_list":["post-7622","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tecnologia","tag-postgresql"],"_links":{"self":[{"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/posts\/7622","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/users\/275"}],"replies":[{"embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/comments?post=7622"}],"version-history":[{"count":5,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/posts\/7622\/revisions"}],"predecessor-version":[{"id":7631,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/posts\/7622\/revisions\/7631"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/media\/7628"}],"wp:attachment":[{"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/media?parent=7622"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/categories?post=7622"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/tags?post=7622"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}