{"id":9011,"date":"2021-01-27T08:00:20","date_gmt":"2021-01-27T11:00:20","guid":{"rendered":"https:\/\/www.fernandoquadro.com.br\/html\/?p=9011"},"modified":"2021-01-15T17:38:27","modified_gmt":"2021-01-15T20:38:27","slug":"postgis-3-1-melhorias-no-vector-tiles","status":"publish","type":"post","link":"https:\/\/www.fernandoquadro.com.br\/html\/2021\/01\/27\/postgis-3-1-melhorias-no-vector-tiles\/","title":{"rendered":"PostGIS 3.1 &#8211; Melhorias no Vector Tiles"},"content":{"rendered":"<p>Cada dias mais v\u00e1rias empresas e pessoas est\u00e3o usando as fun\u00e7\u00f5es Vector Tile do PostGIS como backend para mapas vetoriais din\u00e2micos, dessa forma qualquer melhoria ter\u00e1 um grande impacto. \u00c9 por isso que, desde o aparecimento das fun\u00e7\u00f5es MVT no PostGIS 2.4, elas foram aprimoradas em cada vers\u00e3o principal, e 3.1 n\u00e3o seria diferente.<\/p>\n<p>Como o ST_AsMVT torna realmente f\u00e1cil extrair informa\u00e7\u00f5es do banco de dados para o navegador, uma armadilha comum \u00e9 usar <strong>SELECT *<\/strong> para extrair todas as colunas dispon\u00edveis que podem mover muitos dados desnecessariamente e gerar blocos extremamente grandes. A solu\u00e7\u00e3o f\u00e1cil para esse problema \u00e9 selecionar apenas as propriedades necess\u00e1rias para a visualiza\u00e7\u00e3o, mas pode ser dif\u00edcil aplic\u00e1-la retroativamente uma vez que o aplicativo\/aplica\u00e7\u00e3o j\u00e1 esteja em ambiente de produ\u00e7\u00e3o e j\u00e1 dependa do design ineficiente.<\/p>\n<p>Ao investigarem o por que o <a href=\"https:\/\/www.kernel.org\/doc\/gorman\/html\/understand\/understand016.html\" rel=\"noopener\" target=\"_blank\">OOM<\/a> estava interrompendo o bancos de dados, descobriram consultas que estavam usando uma quantidade enorme de recursos para gerar blocos de 50 a 100 vezes maiores do que deveriam (a recomenda\u00e7\u00e3o \u00e9 menor que 500 KB). <\/p>\n<p>Neste caso, o mau design de extrair todas as colunas do conjunto de dados foi agravado pelo fato de estar sendo aplicado a um grande conjunto de dados; esse paralelismo do PostgreSQL disparou, exigindo recursos extras para gerar blocos em paralelo e posteriormente mescl\u00e1-los. <\/p>\n<p>No PostGIS 3.1 foi ent\u00e3o introduzidas v\u00e1rias mudan\u00e7as para melhorar o desempenho dessas 2 etapas: o processamento paralelo e a fus\u00e3o de resultados intermedi\u00e1rios.<\/p>\n<p><strong>1. As mudan\u00e7as<\/strong><\/p>\n<p>Sem entrar em muitos detalhes, o principal benef\u00edcio veio de alterar o bloco de vetor da forma .proto, para que um recurso possa conter apenas um valor de cada vez. Isso \u00e9 o que a especifica\u00e7\u00e3o diz, mas n\u00e3o o que .proto obriga, portanto, a biblioteca interna estava alocando mem\u00f3ria que nunca usou.<\/p>\n<p>Existem outras mudan\u00e7as adicionais, como melhorar a forma como os valores s\u00e3o mesclados entre os workers paralelos, portanto, fique \u00e0 vontade para dar uma olhada no <a href=\"https:\/\/github.com\/postgis\/postgis\/commit\/99c50d4602a6e1d94f65932cbcbee933af998ea1\" rel=\"noopener\" target=\"_blank\">pr\u00f3prio commit final<\/a> se quiser mais detalhes.<\/p>\n<p><strong>2. Compara\u00e7\u00e3o de desempenho<\/strong><\/p>\n<p>A melhor maneira de ver o impacto dessas mudan\u00e7as \u00e9 por meio de alguns exemplos. Em ambos os casos foi gerado o mesmo bloco, no mesmo servidor e com as mesmas depend\u00eancias; a \u00fanica mudan\u00e7a foi substituir a biblioteca PostGIS, que de 3.0 para 3.1.<\/p>\n<p>No primeiro exemplo, o bloco cont\u00e9m todas as colunas dos 287 mil pontos nele. Como mencionado antes, n\u00e3o \u00e9 recomend\u00e1vel fazer isso, mas \u00e9 a consulta mais simples de gerar.<\/p>\n<p><center><br \/>\n<img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2021\/01\/mvt_01.png\" alt=\"\" width=\"931\" height=\"803\" class=\"aligncenter size-full wp-image-9012\" srcset=\"https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2021\/01\/mvt_01.png 931w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2021\/01\/mvt_01-300x259.png 300w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2021\/01\/mvt_01-768x662.png 768w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2021\/01\/mvt_01-600x518.png 600w\" sizes=\"auto, (max-width: 931px) 100vw, 931px\" \/><br \/>\n<\/center><\/p>\n<p>E para o segundo exemplo foi gerado o mesmo bloco, mas agora incluindo apenas as colunas m\u00ednimas para a visualiza\u00e7\u00e3o:<\/p>\n<p><center><br \/>\n<img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2021\/01\/mvt_02.png\" alt=\"\" width=\"902\" height=\"792\" class=\"aligncenter size-full wp-image-9013\" srcset=\"https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2021\/01\/mvt_02.png 902w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2021\/01\/mvt_02-300x263.png 300w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2021\/01\/mvt_02-768x674.png 768w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2021\/01\/mvt_02-600x527.png 600w\" sizes=\"auto, (max-width: 902px) 100vw, 902px\" \/><br \/>\n<\/center><\/p>\n<p>Podemos ver, tanto no PostGIS 3.0 quanto no 3.1, que adicionar apenas as propriedades necess\u00e1rias torna as coisas 10 vezes mais r\u00e1pidas do que com os dados completos, e tamb\u00e9m que o Postgis 3.1 \u00e9 30-40% mais r\u00e1pido em ambas as situa\u00e7\u00f5es.<\/p>\n<p><strong>3. Uso de mem\u00f3ria<\/strong><\/p>\n<p>Al\u00e9m da velocidade, essa mudan\u00e7a tamb\u00e9m reduz muito a quantidade de mem\u00f3ria usada para gerar um bloco.<\/p>\n<p>Para v\u00ea-lo em a\u00e7\u00e3o, foi monitorado o processo PostgreSQL enquanto ele est\u00e1 gerando o bloco com todas as propriedades. No 3.0, observamos na linha azul que o uso de mem\u00f3ria aumenta com o tempo at\u00e9 atingir cerca de 2,7 GB no final da transa\u00e7\u00e3o.<\/p>\n<p><center><br \/>\n<img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2021\/01\/mvt_03.png\" alt=\"\" width=\"835\" height=\"554\" class=\"aligncenter size-full wp-image-9014\" srcset=\"https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2021\/01\/mvt_03.png 835w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2021\/01\/mvt_03-300x199.png 300w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2021\/01\/mvt_03-768x510.png 768w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2021\/01\/mvt_03-600x398.png 600w\" sizes=\"auto, (max-width: 835px) 100vw, 835px\" \/><br \/>\n<\/center><\/p>\n<p>Agora foi monitorada a mesma solicita\u00e7\u00e3o em um servidor usando Postgis 3.1. Neste caso, o servidor usa cerca de um ter\u00e7o da mem\u00f3ria como no 3.0 (1GB vs 2.7GB) e, em vez de ter um aumento linear, a mem\u00f3ria \u00e9 devolvida ao sistema o mais r\u00e1pido poss\u00edvel.<\/p>\n<p><center><br \/>\n<img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2021\/01\/mvt_04.png\" alt=\"\" width=\"810\" height=\"547\" class=\"aligncenter size-full wp-image-9015\" srcset=\"https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2021\/01\/mvt_04.png 810w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2021\/01\/mvt_04-300x203.png 300w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2021\/01\/mvt_04-768x519.png 768w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2021\/01\/mvt_04-600x405.png 600w\" sizes=\"auto, (max-width: 810px) 100vw, 810px\" \/><br \/>\n<\/center><\/p>\n<p>Para resumir tudo: PostGIS 3.1 \u00e9 mais r\u00e1pido e usa menos mem\u00f3ria ao gerar grandes blocos vetoriais.<\/p>\n<p><em>Este post foi escrito originalmente escrito por <a href=\"https:\/\/rmr.ninja\/\" rel=\"noopener\" target=\"_blank\">Ra\u00fal Mar\u00edn<\/a>, e traduzido e adaptado livremente por este blog.<\/em><\/p>\n<p>Fonte: <a href=\"http:\/\/blog.cleverelephant.ca\/2020\/11\/waiting-for-postgis-3-1-mvt.html\" rel=\"noopener\" target=\"_blank\">Clever Elephant Blog<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Cada dias mais v\u00e1rias empresas e pessoas est\u00e3o usando as fun\u00e7\u00f5es Vector Tile do PostGIS como backend para mapas vetoriais din\u00e2micos, dessa forma qualquer melhoria ter\u00e1 um grande impacto. \u00c9 por isso que, desde o aparecimento das fun\u00e7\u00f5es MVT no&#8230; <a class=\"more-link\" href=\"https:\/\/www.fernandoquadro.com.br\/html\/2021\/01\/27\/postgis-3-1-melhorias-no-vector-tiles\/\">Continue Reading &rarr;<\/a><\/p>\n","protected":false},"author":275,"featured_media":8738,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[24],"tags":[212],"class_list":["post-9011","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-gis","tag-postgis"],"_links":{"self":[{"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/posts\/9011","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=9011"}],"version-history":[{"count":4,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/posts\/9011\/revisions"}],"predecessor-version":[{"id":9019,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/posts\/9011\/revisions\/9019"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/media\/8738"}],"wp:attachment":[{"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/media?parent=9011"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/categories?post=9011"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/tags?post=9011"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}