O subtítulo deste artigo devia ser “O bom, o mau e o péssimo”…
Depois de ter respondido a um comentário que me perguntava sobre a nossa experiência em curso de migrar para PostgreSQL, pensei em melhorar a resposta e fazer um artigo – a maior parte da escrita já estava feita de qualquer forma 😉
Responder ao comentário levou-me a pensar mais um pouco sobre a questão… e uma parte que me parecia pouco clara é o porquê de fazermos a migração para PostgreSQL (pgsql prós amigos) e porquê insistir em usar geometrias PostGIS (geometrias pg)? Só para recordar: a ESRI permite 2 formatos de armazenamento das geometrias nas bases de dados que suporta – ou no formato ESRI (que chamou de ST_Geometry) ou no formato “nativo” da bd.
Mas porque insistem!!??
Esta é uma questão velha. Já há muitos anos que a Oracle suporta geometrias, e a ESRI também já há anos que suporta em bd’s Oracle este esquema de 2 possibilidades. A vantagem maior em usar geometrias em formatos “nativos” das bases de dados é o acesso a um portefólio de software compatível com esses formatos, dentro e para além da esfera SIG. Por exemplo, podemos desenvolver aplicações Oracle que são 99% formulários, mas que mostram de vez em quando uns mapas, sem software adicional. Há software de BI que também faz a representação em mapas dos dados que analisa. E por aí fora. Claro que na esfera SIG é onde está a verdadeira acção. E usar o formato ESRI limita-nos a usar ArcGIS, no desktop e no servidor. Mesmo com a enorme evolução que a ESRI conseguiu no acesso e interoperabilidade via SQL, a verdade é que, para ver, editar e analisar os dados geográficos, se estes estão no formato ESRI então esqueçam outras opções…
Por tudo isto, genericamente, optar pelo formato geográfico nativo da nossa bd é uma opção lógica.
O problema está nos detalhes… por exemplo, quando em 2004 pensei em usar o formato Oracle Spatial, vi com alguma surpresa uma perda de desempenho em cerca de 30% no ArcMap. Depois havia uma série de operações manuais a fazer para manter a compatibilidade entre ESRI-Oracle. E, assim, lá abandonei a ideia.
Anos mais tarde, voltamos ao mesmo. Há a necessidade de mudar de bd. O que escolher?
Por um lado, a ESRI tem um formato próprio com um excelente suporte SQL que segue de perto os standards OGC e ISO. Por outro, o PostgreSQL e PostGIS são uma aposta mais que validada por todo o mundo, e têm o maior portefólio de software SIG compatível. Ponto parágrafo. A escolha fica óbvia. Se vamos mudar, mudamos para o melhor que há! (e ainda por cima é grátis!)
Migrando, round 1
No último ano temos feito um esforço continuado em passar tudo o que temos em Oracle para PostgreSQL e PostGIS. Isto implica dados (geográficos e outros), mas também views, funções PL/SQL (dialecto Oracle), projectos e lyr’s ArcMap, e finalmente, aplicações web. A coisa não é fácil. Migrar de bd é uma maratona…
Pelo lado do pgsql tudo tem corrido bem. Os técnicos que têm experimentado o lado desktop com qgis têm mostrado entusiasmo e estão muito satisfeitos em aprender uma tecnologia nova que funciona… os programadores estão impressionados com a facilidade com que tudo é migrado de Oracle, desde views e funções sql, a aplicações .net, à consola de gestão, e à gestão do próprio servidor.
Pelo lado do ArcGIS, quando tentamos usar geometrias nativas do postgis e não a geometria da esri, os problemas têm vindo a amontoar-se…
Começou com surpresas como o facto de não ser possível apagar renomear feature classes. No help do arcgis dizia que a razão era o facto de a bd não fornecer uma função para apagar renomear tabelas espaciais…??? Ora vejam lá esta pérola:
… então isto quer dizer que programar o ArcCatalog para importar, converter, reprojectar, não teve dificuldade. Agora, renomear tabelas e executar um comando adicional SQL para remover um registo da tabela geometry_columns, isso já é demasiado complexo… enfim, é uma “feature” e não um bug. Vamos lá tomar chá calmante e continuar.
…round 2
Depois existe a questão do desempenho. Era espectável alguma perda de desempenho, tudo certo. Mas usar o tipo de geometria postgis é “apenas” 4,75x mais lento no arcmap do que usar a geometria da esri… pelo menos em algumas das nossas fc’s. Imaginem: ligamos um layer no mapa e em vez de 8 segundos, esperamos 38 segundos. Por 1 layer.
Levámos a experiência mais longe. Montámos um mapa típico do nosso dia-a-dia, usando feature classes nos 2 formatos. E medimos o desempenho…
Geometria ESRI – 4,93 seg | Geometria pg – 10 seg |
… “portanto, 3 mil milhões de contos, 3 vezes 18, portanto…”
… mas isto é 2x mais lento!!
Bom, fomos experimentar com o QGIS, não fosse a razão estar num problema da bd. E verificámos que o QGIS é muito mais rápido do que o arcmap nesta situação (já vamos ver). Mas o arcmap é ainda mais rápido se usarmos geometria esri. Bizarro… (Há aqui alguma coisa que a esri está a fazer bem com a sua arquitectura e que valia a pena analisar. Talvez compressão das geometrias?)
Como o problema era então do arcmap contactámos o suporte. A 1ª reacção da esri foi informar-nos que era uma limitação do postgis… mais um chazinho para os nervos.
Até que lhes enviei o log do pgsql. O problema está na query que o arcmap emite – o qgis usa um sql mais eficiente. Toda a diferença nos tempos medidos encontra-se na query. O “rendering” na aplicação desktop nem entra na equação. Lá fomos informados que era esperada uma quebra de desempenho, mas que dadas as diferenças entre os 2 formatos iriam registar um “enhancement request”. Óptimo. Para o futuro.
Só para terminar este round, montámos um projecto igual em QGIS – os mesmos layers, as mesmas queries, as mesmas labels, os mesmos símbolos, etc. Usámos uma área de mapa igual, e a mesma escala. Usámos um pequeno comando na consola de Python para medir exactamente o tempo de desenho que estávamos a ver. Deixo aqui apenas a imagem… conseguem descobrir quantos segundos levou o QGIS a gerar o mesmo mapa? Com estes números, nem arrisco contas de cabeça 😉
Pois é… a vida não está fácil…
… round 3
Os bugs…
Aguardámos com alguma esperança a versão 10.1 SP1 do ArcGIS. Além das novas funções, poderiam existir optimizações que nos fossem úteis.
Mas o que apareceu foi um novo bug: quando apagamos uma feature class com geometria pg, a conexão à geodatabase nunca mais pode ser aberta – dá erro…
Temos de resolver a questão limpando manualmente as tabelas de sistema do sde… Como este bug passou o cq da esri ultrapassa-me. Mas já marcaram como bug e há um “workaround”. A solução é voltar a usar conexões de serviço (3 tier) em vez de conexões directas, para gerir geodatabases que tenham fc’s com geometria postgis. Para apenas leitura das mesmas parece ser seguro usar conexões directas…
E finalmente, a cereja no topo do bolo, o último bug que encontrámos, e que está em análise na esri há 3 semanas, é um polígono que simplesmente é impossível de importar para a geodatabase em formato postgis… a conexão à geodatabase simplesmente desiste, emitindo um último suspiro enigmático de “I/O Network error”.
Este polígono que é importado perfeitamente se usarmos a geometria da esri… e claro, importada também sem problemas para o PostGIS com outras ferramentas…
Aqui, continuamos sem solução. Editámos o polígono manualmente, e fomos tentando importar até o erro desaparecer. Mas, por agora, não sabemos se outras geometrias “tóxicas” irão surgir, já que ainda não existe uma explicação para o fenómeno.
Conclusão (por agora)
Portanto, qual é o saldo? Continuamos a pensar que vale a pena insistir na migração para o formato pg pelo valor que o postgis representa. Abre os nossos dados a um universo de opções, dentro e fora da esfera SIG.
Neste momento decidimos manter 2 cópias dos dados: uma com geometria esri para melhor desempenho no arcgis, e outra cópia com geometria pg para usar com software não-esri.
Isto obriga-nos a um esforço adicional para manter as cópias sincronizadas, que dispensaríamos de bom grado. Para já, usamos scripts python de ArcGIS para o efeito. Afinal, a melhor ferramenta para converter dados em formato esri ainda é o arcgis.
Mas queremos simplificar e ficar com apenas 1 cópia, mesmo sacrificando algum desempenho no arcmap… teremos de esperar até que esta diferença seja aceitável para nós.
Nota final
Há algumas diferenças relativas ao sql que são importantes na recriação de projectos ArcMap e de ficheiros lyr. Mas é tudo muito parecido com Oracle. Temos um script python baseado nos exemplos da esri, que altera as definition queries e as queries sql das classes de labels, e ainda as próprias expressões das labels. Retiramos todas as aspas dos nomes dos campos, e os [], que existam. Como a nossa geodatabase Oracle ainda usava geometria armazenada em binário, tinha ainda campos SHAPE.AREA e SHAPE.LENGTH. Estes campos já não existem e têm de ser substituídos em todas as queries. De resto, não notamos grandes diferenças no sql.
E é isto… as coisas só podem melhorar, certo? 😉
Vivas,
Estava à espera de ver a FileGDB API (via OGR>= 1.9 ou não) por aí metida ao barulho. Porque, para converter formatos da esri, não há nada melhor do que software da esri, 🙂
Olá Luís.
Pois, é uma opção. Cheguei a pensar nisso, mas desisti da ideia porque era mais um estágio por onde a informação tinha de passar. Assim, fazemos Oracle->PostgreSQL directamente, e depois ainda PostgreSQL(formato ESRI)->PostGIS. Sem ficheiros no meio. E claro, usar a API FileGDB, pelo que tenho lido, parece que também não é pêra-doce…