{"id":9020,"date":"2021-02-01T08:00:28","date_gmt":"2021-02-01T11:00:28","guid":{"rendered":"https:\/\/www.fernandoquadro.com.br\/html\/?p=9020"},"modified":"2021-03-24T09:28:16","modified_gmt":"2021-03-24T12:28:16","slug":"postgis-3-1-formatos-de-saida","status":"publish","type":"post","link":"https:\/\/www.fernandoquadro.com.br\/html\/2021\/02\/01\/postgis-3-1-formatos-de-saida\/","title":{"rendered":"PostGIS 3.1 &#8211; Formatos de sa\u00edda"},"content":{"rendered":"<p>Para continuar com as mudan\u00e7as no PostGIS 3.1, neste post irei falar sobre as melhorias de desempenho em muitas fun\u00e7\u00f5es que geram geometrias como bin\u00e1rias ou como texto.<\/p>\n<p><strong>1. Ponto flutuante para String<\/strong><\/p>\n<p>A base para esta mudan\u00e7a \u00e9 o <a href=\"https:\/\/github.com\/ulfjack\/ryu\" rel=\"noopener\" target=\"_blank\">Ry\u016b, um algoritmo<\/a> desenvolvido por Ulf Adams que melhorou muito a velocidade de convers\u00e3o de pontos flutuantes em string, que \u00e9 provavelmente uma das fun\u00e7\u00f5es mais usadas em sistemas. Pense em quantas vezes imprimimos n\u00fameros todos os dias: qualquer coisa, desde logs, relat\u00f3rios, exibi\u00e7\u00e3o em tela, ETLs, entre outras coisas&#8230; ou seja, melhorar uma fun\u00e7\u00e3o como essa significa uma redu\u00e7\u00e3o direta na energia que usamos em nossos dispositivos e data centers. <\/p>\n<p>Andrew Gierth trouxe as melhorias de algoritmo Ry\u016b para o PostgreSQL 12 e Ra\u00fal Mar\u00edn configurou para emul\u00e1-lo e fazer o mesmo no PostGIS.<\/p>\n<p><strong>2. O novo c\u00f3digo<\/strong><\/p>\n<p>O novo c\u00f3digo \u00e9 baseado no Ry\u016b permitiu ent\u00e3o uma sa\u00edda mais r\u00e1pida e consistente do que antes. Vamos ver um exemplo da mesma geometria em diferentes n\u00edveis de precis\u00e3o:<\/p>\n<p><center><br \/>\n<img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2021\/01\/ryu_01.png\" alt=\"\" width=\"950\" height=\"470\" class=\"aligncenter size-full wp-image-9021\" srcset=\"https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2021\/01\/ryu_01.png 950w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2021\/01\/ryu_01-300x148.png 300w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2021\/01\/ryu_01-768x380.png 768w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2021\/01\/ryu_01-600x297.png 600w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2021\/01\/ryu_01-945x468.png 945w\" sizes=\"auto, (max-width: 950px) 100vw, 950px\" \/><br \/>\n<\/center><\/p>\n<p><center><br \/>\n<img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2021\/01\/ryu_02.png\" alt=\"\" width=\"947\" height=\"474\" class=\"aligncenter size-full wp-image-9022\" srcset=\"https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2021\/01\/ryu_02.png 947w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2021\/01\/ryu_02-300x150.png 300w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2021\/01\/ryu_02-768x384.png 768w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2021\/01\/ryu_02-600x300.png 600w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2021\/01\/ryu_02-945x473.png 945w\" sizes=\"auto, (max-width: 947px) 100vw, 947px\" \/><br \/>\n<\/center><\/p>\n<p>Podemos ver as duas mudan\u00e7as mais vis\u00edveis aqui:<\/p>\n<ul>\n<li>0.29999999999999999 representa o mesmo valor bin\u00e1rio que 0.3, portanto, em 3.1 sempre preferimos 0.3 como classificador e ainda mais seguro para uma viagem de ida e volta.<\/li>\n<li>Na precis\u00e3o 15, voc\u00ea j\u00e1 tem d\u00edgitos suficientes para mostrar 22.200000000000003, mas devido a um bug, n\u00e3o seriam exibidos at\u00e9 a precis\u00e3o 17 no 3.0. Como \u00e9 o caso 0.3, esse n\u00famero j\u00e1 tem tantos d\u00edgitos quantos forem necess\u00e1rios para identificar exclusivamente um n\u00famero de ponto flutuante bin\u00e1rio, portanto, n\u00e3o h\u00e1 necessidade de adicionar mais d\u00edgitos em n\u00edveis de precis\u00e3o mais altos.<\/li>\n<\/ul>\n<p>Uma vez que voc\u00ea acelera a roda mais lenta no processo, outros aumentam em import\u00e2ncia ou at\u00e9 mesmo se tornam o novo gargalo, ent\u00e3o, al\u00e9m de apresentar Ry\u016b e alterar o formato de sa\u00edda das coordenadas, tamb\u00e9m foi necess\u00e1rio aplicar v\u00e1rias outras melhorias de desempenho:<\/p>\n<ul>\n<li>Em muitas fun\u00e7\u00f5es de sa\u00edda, tanto em texto quanto em sa\u00edda bin\u00e1ria, agora geramos o buffer exato que iremos retornar ao PostgreSQL ao inv\u00e9s de um tempor\u00e1rio que mais tarde precisa ser copiado para adicionar um cabe\u00e7alho.<\/li>\n<li>N\u00e3o usamos mais buffers intermedi\u00e1rios ao imprimir coordenadas individuais para evitar chamadas memcpye strlen.<\/li>\n<li>Em fun\u00e7\u00f5es que precisam do SRS para a sa\u00edda (como ST_AsGML ou opcionalmente ST_AsGeoJSON), foi armazenado em cache em vez de ger\u00e1-lo para cada linha. Tamb\u00e9m foi evitado SQL inlines onde o cache \u00e9 destru\u00eddo ap\u00f3s cada linha, o que o torna in\u00fatil . Isso tamb\u00e9m afeta ST_GeomfromGeoJSON e o equivalente &#8216;{}&#8217;::geometry.<\/li>\n<li>Tamb\u00e9m foram realizadas adapta\u00e7\u00f5es do custo das fun\u00e7\u00f5es SQL para ajudar o planejador do PostgreSQL a tomar melhores decis\u00f5es.<\/li>\n<\/ul>\n<p><strong>3. Compara\u00e7\u00f5es<\/strong><\/p>\n<p>Para a maioria dos benchmarks, foi utilizado o conjunto de dados Boundaries of Canada Provinces, que cont\u00e9m apenas 13 multipol\u00edgonos com uma m\u00e9dia de 260 mil pontos e mais de 2.000 an\u00e9is.<\/p>\n<p>Essas fun\u00e7\u00f5es foram as menos afetadas pelas altera\u00e7\u00f5es, pois foram afetadas apenas por algumas das pequenas melhorias para evitar c\u00f3pias desnecess\u00e1rias. No entanto, vemos uma melhora de 4-9%:<\/p>\n<p><center><br \/>\n<img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2021\/01\/ryu_03.png\" alt=\"\" width=\"857\" height=\"276\" class=\"aligncenter size-full wp-image-9023\" srcset=\"https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2021\/01\/ryu_03.png 857w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2021\/01\/ryu_03-300x97.png 300w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2021\/01\/ryu_03-768x247.png 768w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2021\/01\/ryu_03-600x193.png 600w\" sizes=\"auto, (max-width: 857px) 100vw, 857px\" \/><br \/>\n<\/center><\/p>\n<p>Nas fun\u00e7\u00f5es de sa\u00edda de texto, vemos o impacto total de todas as altera\u00e7\u00f5es com fun\u00e7\u00f5es que s\u00e3o 2 a 40 vezes mais r\u00e1pidas do que na vers\u00e3o anterior. Veja:<\/p>\n<p><center><br \/>\n<img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2021\/01\/ryu_04.png\" alt=\"\" width=\"907\" height=\"794\" class=\"aligncenter size-full wp-image-9024\" srcset=\"https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2021\/01\/ryu_04.png 907w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2021\/01\/ryu_04-300x263.png 300w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2021\/01\/ryu_04-768x672.png 768w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2021\/01\/ryu_04-600x525.png 600w\" sizes=\"auto, (max-width: 907px) 100vw, 907px\" \/><br \/>\n<\/center><\/p>\n<p>Fonte: <a href=\"https:\/\/rmr.ninja\/2020-12-06-waiting-for-postgis-3-1-output\/\" rel=\"noopener\" target=\"_blank\">Engineering rocks<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Para continuar com as mudan\u00e7as no PostGIS 3.1, neste post irei falar sobre as melhorias de desempenho em muitas fun\u00e7\u00f5es que geram geometrias como bin\u00e1rias ou como texto. 1. Ponto flutuante para String A base para esta mudan\u00e7a \u00e9 o&#8230; <a class=\"more-link\" href=\"https:\/\/www.fernandoquadro.com.br\/html\/2021\/02\/01\/postgis-3-1-formatos-de-saida\/\">Continue Reading &rarr;<\/a><\/p>\n","protected":false},"author":275,"featured_media":7851,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-9020","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-diversos"],"_links":{"self":[{"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/posts\/9020","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=9020"}],"version-history":[{"count":1,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/posts\/9020\/revisions"}],"predecessor-version":[{"id":9025,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/posts\/9020\/revisions\/9025"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/media\/7851"}],"wp:attachment":[{"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/media?parent=9020"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/categories?post=9020"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/tags?post=9020"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}