J'ai une table spatiale dans une base de données PostgreSQL / PostGIS. Chaque ligne représente un polygone. Il se présente sous la forme suivante:
+----+--------+
|gid | way |
+----+--------+
|241 | 01030..|
La colonne géométrique est "way" qui contient la géométrie d'un polygone. En WKT c'est: POLYGON (('....')). Je fais beaucoup de requêtes ST_Contains sur cette table, pour tester si deux polygones sont contenus l'un dans l'autre, par exemple:
Select ST_Contains(a.way, b.way) From table AS a, table AS b Where a.gid = 15 And b.gid = 16
Je me demandais comment accélérer cette requête et ajouté un index spatial sur la table:
CREATE INDEX table_way_gist ON table USING gist(way);
Mais en fait, je ne vois pas d'accélération. Je crée l'index APRÈS avoir rempli la table avec tous les polygones AVANT de faire les requêtes ST_Contains. Faut-il ajouter l'index avant de remplir un tableau? Y a-t-il des exigences spéciales sur la table pour travailler avec l'index? La projection (srid) de la voie de la colonne géométrique est définie sur 900913.
J'utilise: psql (PostgreSQL) 9.1.4 / POSTGIS = "1.5.3"
la source
Comme l'a dit unicoletti , l'index gist dans la colonne de géométrie ne fonctionnerait que si vous utilisez ST_Contains () dans l'expression WHERE.
Par exemple, si vous souhaitez connaître tous les polygones qui se contiennent, vous pouvez utiliser quelque chose comme ceci:
Dans ce cas, en fonction de la taille de votre table et de la complexité de vos géométries, l'index gist devrait fournir une accélération significative, car ST_Contains commencera par filtrer les polygones en comparant leurs zones de limites avant de vérifier réellement leurs géométries complètes. Vous pouvez voir une petite explication dans le tutoriel OpenGeo .
la source