ola,
alguem ja otimizou as consultas espaciais do postgis, eu estou usando a função distance() mas esta demorando muito(quase 1.2min) cada consulta, as outras funções como intersection e contains estão OK com um tempo normal, ja me falaram sobre um ajuste fino do banco, mas não consegui melhora nenhuma, ou então a criação de indices nas tabelas, mesmo assim não melhorou.
alguem tem uma idéia?
muito obrigado
Autor: jefferson bernardino
44 comentários
Você já usou o modo Analyze do Pgadmin3? Abraço, Felipe 2008/7/22 :
> Forum: Geral - usuários e desenvolvedores
> Thread: otimização do banco postgis!
> Author: jefferson bernardino
> Posted: 2008-07-22 15:11:33.234181-03
>
> ola,
>
> alguem ja otimizou as consultas espaciais do postgis, eu estou usando a
> função distance() mas esta demorando muito(quase 1.2min) cada consulta, as
> outras funções como intersection e contains estão OK com um tempo normal,
> ja me falaram sobre um ajuste fino do banco, mas não consegui melhora
> nenhuma, ou então a criação de indices nas tabelas, mesmo assim não
> melhorou.
>
> alguem tem uma idéia?
>
>
>
> muito obrigado
>
> Recebendo correspondência demais? Gerencie suas notificações em:
> www.softwarepublico.gov.br/notifications/manage --
Bendirei o senhor em todo o tempo,
Na minha boca sempre o seu louvor
Sl 34 (33),116
from rios_ms as rios, temp as temp
where distance(rios.the_geom,centroid(transform(setsrid(temp.the_geom,$proj),4291))) <= 0.015
and distance(rios.the_geom,centroid(transform(setsrid(temp.the_geom,$proj),4291))) != 0");
Para diminuir o número de feições que serão comparadas você precisa
usar o operador &&.
Não sei te explicar direito mas abaixo tem um material que certamente
te ajudará.
Quanto ao Analyze do Pgadmin você vai na opção de criação de querys,
no menu Query > Explain Options > Analyze. Na hora de executar ao
invés de F5 para executar use o F7 para Explain a consulta. Saudações, Felipe Costa
Anexo:
How do I construct a spatial query? The same way you construct any other database query, as an SQL
combination of return values, functions, and boolean tests. For spatial queries, there are two issues that are important to keep
in mind while constructing your query: is there a spatial index you
can make use of; and, are you doing expensive calculations on a large
number of geometries. In general, you will want to use the "intersects operator" (&&) which
tests whether the bounding boxes of features intersect. The reason the
&& operator is useful is because if a spatial index is available to
speed up the test, the && operator will make use of this. This can
make queries much much faster. You will also make use of spatial functions, such as Distance(),
ST_Intersects(), ST_Contains() and ST_Within(), among others, to
narrow down the results of your search. Most spatial queries include
both an indexed test and a spatial function test. The index test
serves to limit the number of return tuples to only tuples that might
meet the condition of interest. The spatial functions are then use to
test the condition exactly. SELECT id, the_geom
FROM thetable
WHERE
the_geom && 'POLYGON((0 0, 0 10, 10 10, 10 0, 0 0))'
AND
_ST_Contains(the_geom,'POLYGON((0 0, 0 10, 10 10, 10 0, 0 0))'); 2008/7/23 :
> Forum: Geral - usuários e desenvolvedores
> Thread: otimização do banco postgis!
> Author: jefferson bernardino
> Posted: 2008-07-23 13:47:33.603728-03
>
> Ola Felipe como vai?
>
> a consulta é esta estou selecionando o nome do rio e a distancia que ele
> esta em razão das unidades de conservação, ela busca apenas os rios que
> estão a determinada distancia da unidade de consevação em questão, estou
> usando a função transform para aceitar qualquer projeção(que é pega na
> interface) esta é apenas uma consulta, tenho mais algumas(esta é a que mais
> demora).
>
> esta consulta estava demorando cerca de 1.4min, mas estava dando uma olhada
> no manual do postgis e vi que se eu efetuasse a consulta através de apenas
> um ponto(centroid) ela iria mais rapido, agora com a função centroid demora
> cerca de 14s para os piores casos.
>
> agora sobre o analyze, oq seria?algo como o vacuum?
>
> muito obrigado e até mais!
>
> select distinct rios.noriocomp ,
> distance(rios.the_geom,centroid(transform(setsrid(temp.the_geom,$proj),4291)))*100000
> as distancia
> from rios_ms as rios, temp as temp
> where
> distance(rios.the_geom,centroid(transform(setsrid(temp.the_geom,$proj),4291)))
> and
> distance(rios.the_geom,centroid(transform(setsrid(temp.the_geom,$proj),4291)))
> != 0");
>
> Recebendo correspondência demais? Gerencie suas notificações em:
> www.softwarepublico.gov.br/notifications/manage --
Bendirei o senhor em todo o tempo,
Na minha boca sempre o seu louvor
Sl 34 (33),116