Tengo una tabla espacial en una base de datos PostgreSQL / PostGIS. Cada fila en ella representa un polígono. Es de la siguiente forma:
+----+--------+
|gid | way |
+----+--------+
|241 | 01030..|
La columna geométrica es "camino" que contiene la geometría de un polígono. En WKT es: POLYGON (('....')). Estoy haciendo muchas consultas ST_Contains en esta tabla, para probar si dos polígonos están contenidos entre sí, por ejemplo:
Select ST_Contains(a.way, b.way) From table AS a, table AS b Where a.gid = 15 And b.gid = 16
Me preguntaba cómo acelerar esta consulta y agregué un índice espacial en la tabla:
CREATE INDEX table_way_gist ON table USING gist(way);
Pero en realidad no veo una aceleración. Creo el índice DESPUÉS de llenar la tabla con todos los polígonos ANTES de hacer las consultas ST_Contains. ¿Se debe agregar el índice antes de llenar una tabla? ¿Hay requisitos especiales en la tabla para trabajar con el índice? La proyección (cuadrícula) de la forma de columna geométrica se establece en 900913.
Estoy usando: psql (PostgreSQL) 9.1.4 / POSTGIS = "1.5.3"
fuente
Como dijo unicoletti , el índice esencial en la columna de geometría solo funcionaría si usa ST_Contains () en la expresión WHERE.
Por ejemplo, si desea conocer todos los polígonos que se contienen entre sí, puede usar algo como esto:
En este caso, dependiendo del tamaño de su tabla y la complejidad de sus geometrías, el índice esencial debería proporcionar una aceleración significativa, ya que ST_Contains comenzará filtrando los polígonos comparando sus cuadros de límite antes de verificar realmente sus geometrías completas. Puede ver una pequeña explicación en el Tutorial de OpenGeo .
fuente