Estou tentando executar uma operação 'dissolver' no PostGIS usando o comando ST_Union.
A camada de entrada é reconhecidamente bastante grande e complexa. Por "grande", quero dizer 57.771 recursos, com número de vértices variando de 4 a 758.018 por recurso, com média de cerca de 86 vértices por recurso. Apenas cerca de 10 dos recursos têm> 10.000 vértices. Por "complexo", quero dizer que os polígonos têm muitos buracos, sobreposições confusas, ilhas etc. e que os polígonos grandes tendem a ter uma caixa delimitadora que cobre muitos dos polígonos menores, talvez tornando os índices menos úteis.
O problema é que a consulta é extremamente lenta a ponto de ser inutilizável. Li aqui o post de Paul em 2009 que me levou a acreditar que minha consulta ainda deveria ser bastante rápida. Estou usando o seguinte comando; estou fazendo algo flagrantemente errado ou ineficiente?
SELECT ST_Union(f.geom) as geom, column1,column2,column3
FROM "inputlayer" As f
GROUP BY column1,column2,column3
Edit: Estou usando:
POSTGIS="2.1.4 r12966" GEOS="3.3.3-CAPI-1.7.4" PROJ="Rel. 4.7.1, 23 September 2009" GDAL="GDAL 2.0.0dev, released 2014/04/16" LIBXML="2.7.8" LIBJSON="UNKNOWN" TOPOLOGY RASTER PostgreSQL 9.3.5 on x86_64-unknown-linux-gnu, compiled by gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3, 64-bit
A máquina na qual estou executando o servidor db é uma máquina virtual sem muita energia. Vou tentar a idéia SET work_mem = 50000 e ver como as coisas vão!
fonte
Respostas:
Esse tipo de operação usa muita memória de trabalho, pelo que me lembro, portanto, você quer ter certeza de que não está nas configurações padrão, o que é bastante baixo;
Tente algo como
Você pode querer brincar com essa configuração do workmem
Você também deseja despejar isso em uma tabela - e não na tela. Eu suponho que você já sabe
Outras coisas que você deseja verificar - que eu coloquei nos comentários, mas que repetirei aqui:
Há duas coisas que melhoraram a velocidade da união - a coisa em cascata que você apontou e, para a contagem de polígonos, o acúmulo mais rápido da matriz (que eu acho que veio no PostGIS 1.5 (pode ser que 1.4 não consiga se lembrar), o PostgreSQL 8.4 (a migration be 9.0 can não me lembro)). Também um GEOS mais novo não funcionará bem se você estiver executando o <PostGIS 1.4
Portanto, verificar as versões postgis e postgresql é importante
fonte
ST_MemUnion
. Usa menos memória, mais processadores: postgis.net/docs/ST_MemUnion.htmlMesmo antes de você executar ST_Union
ANALISE seu banco de dados para atualizar as estatísticas da consulta.
VACUUM seu banco de dados para limpar se você ainda não estiver executando o Autovacuum. Verifique suas configurações principais para garantir que estejam definidas com valores razoáveis.
Teste a alteração do work_mem : aumente para 8 MB, 32 MB, 256 MB, 1 GB. Isso faz diferença?
* 32 MB é o padrão
fonte: https://wiki.postgresql.org/wiki/Tuning_Your_PostgreSQL_Server
fonte