{"id":9004,"date":"2021-01-25T08:00:43","date_gmt":"2021-01-25T11:00:43","guid":{"rendered":"https:\/\/www.fernandoquadro.com.br\/html\/?p=9004"},"modified":"2021-01-15T17:00:35","modified_gmt":"2021-01-15T20:00:35","slug":"postgis-3-1-performance","status":"publish","type":"post","link":"https:\/\/www.fernandoquadro.com.br\/html\/2021\/01\/25\/postgis-3-1-performance\/","title":{"rendered":"PostGIS 3.1 &#8211; Performance"},"content":{"rendered":"<p>Os desenvolvedores de c\u00f3digo aberto \u00e0s vezes t\u00eam dificuldade em descobrir em qual recurso se concentrar, a fim de gerar o valor m\u00e1ximo para os usu\u00e1rios finais. Como resultado, muitas vezes eles ter\u00e3o desempenho padr\u00e3o .<\/p>\n<p>Desempenho \u00e9 o \u00fanico recurso que todo usu\u00e1rio aprova. O software continuar\u00e1 fazendo as mesmas coisas legais, s\u00f3 que mais r\u00e1pido.<\/p>\n<p>Para o PostGIS 3.1, houve uma s\u00e9rie de melhorias de desempenho que, juntas, podem resultar em um ganho de desempenho substancial para suas cargas de trabalho.<\/p>\n<p><strong>1. Cache de grandes geometrias<\/strong><\/p>\n<p>As jun\u00e7\u00f5es espaciais foram eram lentas pela sobrecarga do acesso a grandes geometrias por um longo tempo.<\/p>\n<pre>\r\nSELECT A.*, B.*\r\nFROM A\r\nJOIN B\r\nON ST_Intersects(A.geom, B.geom)\r\n<\/pre>\n<p>Para o SQL acima, o PostgreSQL planejar\u00e1 e executar\u00e1 jun\u00e7\u00f5es espaciais como essa usando uma \u201cjun\u00e7\u00e3o de loop aninhada\u201d, o que significa iterar por um lado da jun\u00e7\u00e3o e testar a condi\u00e7\u00e3o de jun\u00e7\u00e3o. Isso resulta em execu\u00e7\u00f5es que se parecem com:<\/p>\n<ul>\n<li>ST_Intersects (A.geom (1), B.geom (1))<\/li>\n<li>ST_Intersects (A.geom (1), B.geom (2))<\/li>\n<li>ST_Intersects (A.geom (1), B.geom (3))<\/li>\n<\/ul>\n<p>Portanto, um lado do teste se repete indefinidamente.<\/p>\n<p><center><br \/>\n<img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2021\/01\/diagram.png\" alt=\"\" width=\"819\" height=\"441\" class=\"aligncenter size-full wp-image-9005\" srcset=\"https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2021\/01\/diagram.png 819w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2021\/01\/diagram-300x162.png 300w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2021\/01\/diagram-768x414.png 768w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2021\/01\/diagram-600x323.png 600w\" sizes=\"auto, (max-width: 819px) 100vw, 819px\" \/><br \/>\n<\/center><\/p>\n<p>Armazenar esse lado em cache e evitar reler o objeto grande a cada itera\u00e7\u00e3o do loop faz uma grande diferen\u00e7a no desempenho. Vimos acelera\u00e7\u00f5es 20 vezes maiores em cargas de trabalho de jun\u00e7\u00e3o espacial comum .<\/p>\n<p>As corre\u00e7\u00f5es s\u00e3o bastante t\u00e9cnicas, mas se voc\u00ea estiver interessado, tem um <a href=\"http:\/\/blog.cleverelephant.ca\/2020\/04\/developer-life.html\" rel=\"noopener\" target=\"_blank\">artigo do Paul Ramsey<\/a> detalhado dispon\u00edvel em ingl\u00eas.<\/p>\n<p><strong>2. Leituras apenas do cabe\u00e7alho da geometria<\/strong><\/p>\n<p>O formato em disco para geometria inclui um cabe\u00e7alho curto que possui informa\u00e7\u00f5es sobre os limites da geometria, o sistema de refer\u00eancia espacial e dimensionalidade. Isso significa que \u00e9 poss\u00edvel para algumas fun\u00e7\u00f5es retornar uma resposta depois de ler apenas alguns bytes do cabe\u00e7alho, em vez de todo o objeto.<\/p>\n<p>No entanto, nem todas as fun\u00e7\u00f5es que poderiam fazer uma leitura r\u00e1pida, era poss\u00edvel fazer uma leitura r\u00e1pida. Isso agora est\u00e1 resolvido.<\/p>\n<p><strong>3. Gera\u00e7\u00e3o mais r\u00e1pida de texto<\/strong><\/p>\n<p>\u00c9 muito comum que aplicativos da web e outros gerem formatos de texto dentro do banco de dados, e o c\u00f3digo para fazer isso n\u00e3o foi otimizado. A gera\u00e7\u00e3o de \u201ctexto conhecido\u201d (WKT), GeoJSON e sa\u00edda KML agora usa um caminho mais r\u00e1pido e evita c\u00f3pias desnecess\u00e1rias.<\/p>\n<p>PostGIS agora tamb\u00e9m usa o mesmo c\u00f3digo de n\u00famero para texto que o PostgreSQL, que se mostrou mais r\u00e1pido, e tamb\u00e9m nos permite expor um pouco mais de controle sobre a precis\u00e3o aos usu\u00e1rios finais.<\/p>\n<p><strong>4. Qu\u00e3o mais r\u00e1pido?<\/strong><\/p>\n<p>Para o caso de uso espec\u00edfico de uni\u00e3o espacial, aqui est\u00e1 um caso de teste:<\/p>\n<p><a href=\"https:\/\/www.naturalearthdata.com\/http\/\/www.naturalearthdata.com\/download\/10m\/cultural\/ne_10m_admin_0_countries.zip\" rel=\"noopener\" target=\"_blank\">1:10 milh\u00f5es &#8211; Limites de pa\u00eds<\/a><br \/>\n<a href=\"https:\/\/www.naturalearthdata.com\/http\/\/www.naturalearthdata.com\/download\/10m\/cultural\/ne_10m_populated_places.zip\" rel=\"noopener\" target=\"_blank\">1:10 milh\u00f5es &#8211; Lugares povoados<\/a><\/p>\n<p><center><br \/>\n<img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2021\/01\/admin0-places.png\" alt=\"\" width=\"1071\" height=\"541\" class=\"aligncenter size-full wp-image-9006\" srcset=\"https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2021\/01\/admin0-places.png 1071w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2021\/01\/admin0-places-300x152.png 300w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2021\/01\/admin0-places-1024x517.png 1024w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2021\/01\/admin0-places-768x388.png 768w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2021\/01\/admin0-places-600x303.png 600w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2021\/01\/admin0-places-945x477.png 945w\" sizes=\"auto, (max-width: 1071px) 100vw, 1071px\" \/><br \/>\n<\/center><\/p>\n<p>Carregue os dados em ambas as vers\u00f5es:<\/p>\n<pre>\r\nshp2pgsql -D -s 4326 -I ne_10m_admin_0_countries admin | psql postgis30\r\nshp2pgsql -D -s 4326 -I ne_10m_populated_places places | psql postgis30\r\n<\/pre>\n<p>Execute uma jun\u00e7\u00e3o espacial que encontre a soma dos locais povoados em cada pa\u00eds.<\/p>\n<pre>\r\nEXPLAIN ANALYZE\r\nSELECT Sum(p.pop_max) as pop_max, a.name\r\nFROM admin a\r\nJOIN places p\r\nON ST_Intersects(a.geom, p.geom)\r\nGROUP BY a.name\r\n<\/pre>\n<p>Tempo m\u00e9dio em 5 execu\u00e7\u00f5es:<\/p>\n<ul>\n<li>PostGIS 3.0 = 23.4s<\/li>\n<li>PostGIS 3.1 = 0.9s<\/li>\n<\/ul>\n<p>Este teste \u00e9 uma esp\u00e9cie de &#8220;pior caso&#8221;, em que existem muitos pa\u00edses muito grandes, mas d\u00e1 uma ideia dos tipos de acelera\u00e7\u00f5es que est\u00e3o dispon\u00edveis para jun\u00e7\u00f5es espaciais contra cole\u00e7\u00f5es que incluem maiores (+250 pares de coordenadas) geometrias.<\/p>\n<p><em>Este post foi escrito originalmente por Paul Ramsey e traduzido e adaptado livremente por este blog.<\/em><\/p>\n<p>Fonte: <a href=\"http:\/\/blog.cleverelephant.ca\/2020\/12\/waiting-postgis-31-1.html\" rel=\"noopener\" target=\"_blank\">Clever Elephant Blog<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Os desenvolvedores de c\u00f3digo aberto \u00e0s vezes t\u00eam dificuldade em descobrir em qual recurso se concentrar, a fim de gerar o valor m\u00e1ximo para os usu\u00e1rios finais. Como resultado, muitas vezes eles ter\u00e3o desempenho padr\u00e3o . Desempenho \u00e9 o \u00fanico&#8230; <a class=\"more-link\" href=\"https:\/\/www.fernandoquadro.com.br\/html\/2021\/01\/25\/postgis-3-1-performance\/\">Continue Reading &rarr;<\/a><\/p>\n","protected":false},"author":275,"featured_media":8412,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[24],"tags":[212],"class_list":["post-9004","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\/9004","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=9004"}],"version-history":[{"count":4,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/posts\/9004\/revisions"}],"predecessor-version":[{"id":9010,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/posts\/9004\/revisions\/9010"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/media\/8412"}],"wp:attachment":[{"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/media?parent=9004"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/categories?post=9004"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/tags?post=9004"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}