[Gfoss] query postgis

>SELECT *
>FROM A, B
>WHERE ST_INTERSECTS (A.THE_GEOM, B.THE_GEOM)
>
>che secondo me dovrebbe corrispondere a fare un intersezione con il plugin
>di Geoprocessing (Qgis).
>
>Se la mia ipotesi è giusta, la cosa che trovo strana è che la query impiega

>circa 20 minuti per restituirmi il risultato (le due tabelle sono piuttosto
>voluminose) mentre l'intersezione fatta da qgis ci mette un paio di minuti.

La query che esegui dice a postgis di restituire tutti e sottolineo tutti gli elementi che tra loro si intersecano.

Se per sfortuna i tuoi due archivi sono molto sovrapponibili questo implica che i dati verranno restituiti quasi tutti (se non tutti),
causando una ridondanza enorme di valori.

ovvero la medesima geometria ti viene rispedita tutte le volte che si interseca con una qualunque delle altre.

inoltre chiedendo

select *

te chiedi tutti gli attributi sia di tabella A che di tabella B.

infine:

hai creato gli indici spaziali sui campi geometrici di entrambe le tabelle ?

Andrea Peri
. . . . . . . . .
qwerty àèìòù

se fai:

SELECT *
FROM A, B
WHERE A.THE_GEOM && B.THE_GEOM

sfrutti gli indici spaziali (sempre siano correttamente creati)

francesco

Citando Andrea Peri <aperi2007@gmail.com>:

SELECT *
FROM A, B
WHERE ST_INTERSECTS (A.THE_GEOM, B.THE_GEOM)

che secondo me dovrebbe corrispondere a fare un intersezione con il plugin
di Geoprocessing (Qgis).

Se la mia ipotesi è giusta, la cosa che trovo strana è che la query impiega
circa 20 minuti per restituirmi il risultato (le due tabelle sono piuttosto
voluminose) mentre l'intersezione fatta da qgis ci mette un paio di minuti.

La query che esegui dice a postgis di restituire tutti e sottolineo tutti
gli elementi che tra loro si intersecano.

Se per sfortuna i tuoi due archivi sono molto sovrapponibili questo implica
che i dati verranno restituiti quasi tutti (se non tutti),
causando una ridondanza enorme di valori.

ovvero la medesima geometria ti viene rispedita tutte le volte che si
interseca con una qualunque delle altre.

inoltre chiedendo

select *

te chiedi tutti gli attributi sia di tabella A che di tabella B.

infine:

hai creato gli indici spaziali sui campi geometrici di entrambe le tabelle ?

--
-----------------
Andrea Peri
. . . . . . . . .
qwerty àèìòù
-----------------

On Tue, Jan 26, 2010 at 09:56:31AM +0100, francesco marucci wrote:

SELECT *
FROM A, B
WHERE A.THE_GEOM && B.THE_GEOM

La funzione && sfrutta gli indici spaziali sulle geometrie (se
li hai creati), quindi è veloce. Ma non è l'intersezione
"esatta", è solo l'intersezione delle bounding box delle
geometrie:

http://postgis.refractions.net/docs/ST_Geometry_Overlap.html

Invece la ST_Intersects() fa l'intersezione esatta. Io mi
ricordavo che questa non sfruttava gli indici, quindi usavo una
specie di trucco combinando le due funzioni con una AND per
ottenere risultati veloci. Però ora leggo sul manuale che la
ST_Intersects() sfrutta gli indici:

http://postgis.refractions.net/docs/ST_Intersects.html

Qualcuno mi sa dire se è vero e se à sempre stato così?

--
Niccolo Rigacci
Firenze - Italy

La funzione && sfrutta gli indici spaziali sulle geometrie (se
li hai creati), quindi è veloce. Ma non è l’intersezione
“esatta”, è solo l’intersezione delle bounding box delle
geometrie:

http://postgis.refractions.net/docs/ST_Geometry_Overlap.html

Invece la ST_Intersects() fa l’intersezione esatta. Io mi
ricordavo che questa non sfruttava gli indici, quindi usavo una
specie di trucco combinando le due funzioni con una AND per
ottenere risultati veloci. Però ora leggo sul manuale che la
ST_Intersects() sfrutta gli indici:

http://postgis.refractions.net/docs/ST_Intersects.html

Qualcuno mi sa dire se è vero e se à sempre stato così?

Non mi ricordo in che punto del manuale sta scritto ma sono sicuro di aver letto da qualche parte che nelle ultime versioni di PostGIS la funzione ST_Intersects prima confronta i BBOX e solo se questi si intersecano passa al confronto esatto, in sostanza hanno incorporato il trucchetto del AND. Se ritrovo il riferimento giro il link.

Ciao,

Stefano

Stefano Salvador ha scritto:

Non mi ricordo in che punto del manuale sta scritto ma sono sicuro di
aver letto da qualche parte che nelle ultime versioni di PostGIS la
funzione ST_Intersects prima confronta i BBOX e solo se questi si
intersecano passa al confronto esatto, in sostanza hanno incorporato il
trucchetto del AND. Se ritrovo il riferimento giro il link.

esatto: la nuova ST_Intersect e' un wrapper per _ST_Intersect, piu' gli indici.
Saluti.
--
Paolo Cavallini: http://www.faunalia.it/pc

funzione ST_Intersects prima confronta i BBOX e solo se questi si
intersecano passa al confronto esatto, in sostanza hanno incorporato il
trucchetto del AND. Se ritrovo il riferimento giro il link.

esatto: la nuova ST_Intersect e’ un wrapper per _ST_Intersect, piu’ gli indici.
Saluti.

e qui è dove lo dicono (nella nota):

http://postgis.refractions.net/documentation/manual-1.4/ch04.html#id2717971

Ciao,

Stefano

Gli indici sono praticamente obbligatori se vuoi fare analisi spaziale,
un esempio per esemplificare:

Prendo una tabella con 288 records e un altra con 5.992 records.

facendo l’operazione che citi te st_intersects in presenza di indici mi ritorna
7.531 elementi in 5 secondi.

rimuovendo gli indici spaziali da entrambe,
i tempi passano a 3 minuti e 28 secondi

Prova a creare gli indici spaziali su entrambe le tabelle, sui campi con geometria e poi riprova.

Ciao,

Il giorno 26 gennaio 2010 09.59, ACQUATI CLAUDIO <c.acquati@edumail.iuav.it> ha scritto:

Ho semplificato mettendo l’asterisco in realtà chiedevo solo alcuni campi, però quando faccio l’intersezione con il geoprocessing mi restituisce comunque tutti i campi; la cosa che mi sembra strana è la notevole differenza di tempi tra le due operazioni; riguardo agli indici non li ho creati.
Ciao

Il giorno 26 gennaio 2010 09.49, Andrea Peri <aperi2007@gmail.com> ha scritto:

>SELECT *
>FROM A, B
>WHERE ST_INTERSECTS (A.THE_GEOM, B.THE_GEOM)
>
>che secondo me dovrebbe corrispondere a fare un intersezione con il plugin
>di Geoprocessing (Qgis).

>
>Se la mia ipotesi è giusta, la cosa che trovo strana è che la query impiega

>circa 20 minuti per restituirmi il risultato (le due tabelle sono piuttosto
>voluminose) mentre l'intersezione fatta da qgis ci mette un paio di minuti.

La query che esegui dice a postgis di restituire tutti e sottolineo tutti gli elementi che tra loro si intersecano.

Se per sfortuna i tuoi due archivi sono molto sovrapponibili questo implica che i dati verranno restituiti quasi tutti (se non tutti),
causando una ridondanza enorme di valori.

ovvero la medesima geometria ti viene rispedita tutte le volte che si interseca con una qualunque delle altre.

inoltre chiedendo

select *

te chiedi tutti gli attributi sia di tabella A che di tabella B.

infine:

hai creato gli indici spaziali sui campi geometrici di entrambe le tabelle ?

Andrea Peri
. . . . . . . . .
qwerty àèìòù


Iscriviti all’associazione GFOSS.it: http://www.gfoss.it/drupal/iscrizione
Gfoss@faunalia.it
http://lists.faunalia.it/cgi-bin/mailman/listinfo/gfoss
Questa e’ una lista di discussione pubblica aperta a tutti.
I messaggi di questa lista non rispecchiano necessariamente
le posizioni dell’Associazione GFOSS.it.

Andrea Peri
. . . . . . . . .
qwerty àèìòù