Acabo de comenzar el aprendizaje de PostGIS, y ahora estoy tratando de contar el número de rayos en mi país (Brasil, en este caso).
Tengo las siguientes tablas:
earth_feed --> Esto es el geometry(Point, 4326)
, lon
, lat
y alguna otra información acerca de un determinado rayo ocurrencia.
brasil_shape --> Esta tabla tiene una única fila geometry(MultiPolygon, 4326)
que es el conjunto de Brasil.
Mi consulta es para el 14 de enero (la tabla completa, es por Jan/2014, es una tabla de prueba)
SELECT COUNT(earth_feed.geom) FROM
earth_feed as earth,
brasil_shape as brasil
WHERE
EXTRACT('day' FROM date_occur) = 14 AND
ST_WITHIN(earth.geom, brasil.geom)
Esta consulta tarda unos 5 minutos para terminar, y para este día teníamos unos 200k rayo ocurrencias. También, los índices de la tabla parece estar bien:
CREATE INDEX idx_light_geom
ON earth_feed
USING gist
(geom);
Así que tengo 2 preguntas:
1 - Se trata de un 'normal' tiempo de ejecución? Brasil tiene dimensiones continentales y una gran cantidad de los rayos incidentes.
2 - parece que el shapefile para el país de esquema es 'tirado' en cada comparación. He aquí parte de la EXPLIQUE de salida:
-> Nested Loop (cost=0.00..9.58 rows=1 width=32)"
...
-> Seq Scan on brasil_shape brasil (cost=0.00..1.01 rows=1 width=32)
Esta afirmación es correcta?
3 - El país de esquema es un MultiPolygon
, entonces, ¿qué sucede si cambio de este shapefile de tener un menor tamaño de la cuadrícula (más polígonos)? Será el índice más eficaz? (No he probado aún).
Realmente agradezco si alguien me puede enseñar cómo optimizar este (si es posible claro). Gracias!
EDIT: Aquí está el completo EXPLICAR de salida (he cambiado los nombres para hacer el post easiear para leer)
"Aggregate (cost=9.59..9.60 rows=1 width=32)"
" -> Nested Loop (cost=0.00..9.58 rows=1 width=32)"
" -> Seq Scan on shape_brasil brasil (cost=0.00..1.01 rows=1 width=32)"
" -> Index Scan using idx_raios_diario_jan_2014_geom on raios_diario_jan_2014 earth (cost=0.00..8.56 rows=1 width=32)"
" Index Cond: (earthnetworks_geometry_raios && brasil.geom)"
" Filter: ((date_part('day'::text, earthnetworks_dt_horario) = 14::double precision) AND _st_contains(brasil.geom, earthnetworks_geometry_raios))"