Sou iniciante no postgis e tenho um problema no desempenho da consulta.
Esta minha consulta:
SELECT DISTINCT ON (userid) userid ,ST_AsText(position), timestamp
FROM table1
WHERE ST_Intersects ( ST_GeomFromText('a multiypolygon geom goes here',4326),position)
ORDER BY userid, timestamp desc
e o problema é que meu multipolígono inclui polígonos MUITO grandes (600 páginas de comprimento no word doc!) e demorou mais de duas horas para executar!
Existe uma maneira de otimizar minha consulta ou usar outra maneira?
Por favor, sua ajuda é muito apreciada!
Depende do tipo de qualidade - precisão que você precisa. Obviamente, você pode simplificar os polígonos usando: http://postgis.net/docs/ST_Simplify.html
O que fiz muitas vezes durante o desenvolvimento do meu aplicativo GIS foi pensar sobre a melhor maneira de minimizar os dados. Por exemplo. pré-selecione os polígonos dentro da caixa de limite, por exemplo. - Dependendo do nível de zoom, você não precisa de resultados ultra precisos (st_simplify), etc.
Espero que tenha ajudado um pouco!
fonte
Dependendo do seu conhecimento em postgres e / ou sql, você tem várias opções:
analise a consulta através do comando EXPLAIN para descobrir se você está atingindo um gargalo específico. Aviso: às vezes, a saída de EXPLAIN pode ser difícil de entender
se você espera que a maior parte ou uma parte significativa das geometrias da tabela1 NÃO cruze o multipolígono, tente aplicar uma condição preliminar a um polígono mais simples (ou seja, quebrando o multigráfico em pedaços menores) e execute a interseção multipolígena mais pesada apenas em esses resultados. Veja abaixo um exemplo.
se e somente se CPU é o gargalo (ou seja, o servidor é cruzamentos de computação preso) I devidamente sugiro que você obter um maior, mais rápido CPU, mais poderoso ou alugar um one-time de alta CPU Instância off EC2 da Amazon e destruí-lo quando você estiver feito
Exemplo de consulta para o item 2:Para melhorar o desempenho, você também pode materializar temporariamente a subseleção st1 como uma tabela para poder indexá-la.@Nicklas tem razão em apontar nos comentários que o exemplo da sugestão 2 não deve ajudar. Ele está certo, mas acho que estou (parcialmente) certo também.
De fato, parece que uma pergunta muito semelhante foi feita (e respondida) apenas em novembro passado no postgis ML:
http://postgis.refractions.net/pipermail/postgis-users/2011-November/031344.html
e acontece que a sugestão é realmente quebrar o polígono para que o índice possa filtrar com mais eficiência as interseções falsas que seriam acionadas por uma simples verificação de limite.
fonte
UsandoST_SubDivide()
Para a versão 2.2 do Postgis, você pode usar
ST_SubDivide
.Você também pode
Aqui, usamos
ST_SubDivide
para dividir o polígono em subpolígonos com 10 ou menos vértices.Então
Não faça o acima, ele introduz erros de arredondamento
Afinação geral
Veja também a seção intitulada Dicas de desempenho nos documentos. Verifique se você está sintonizado adequadamente. Considere aumentar
max_parallel_workers_per_gather
para aproveitar a paralelização (atualmente o padrão é desativado).fonte