Lorsque vous construisez une requête il est important de se souvenir que seuls les opérateurs du cadre-limite comme &&
tirent avantage des indexes spatiaux GIST. Les fonctions comme distance()
ne peuvent pas utiliser les indexes pour optimiser leur opérations. Par exemple, la requête suivante pourrait être légèrement lente sur une grosse table :
SELECT the_geom FROM geom_table WHERE distance( the_geom, GeomFromText( 'POINT(100000 200000)', -1 ) ) < 100
Cette requête sélectionne toutes les géométries de
geom_table
qui sont dans un rayon de 100 unités du point (100000, 200000). Elle est lente parce qu'elle calcule la distance entre chaque point de la table et le point que nous avons spécifié, par exemple un calcul de distance()
pour chaque enregistrement de la table. Nous pouvons éviter cela en utilisant l'opérateur &&
pour réduire le nombre de distance requit :
SELECT the_geom FROM geom_table
WHERE the_geom && 'BOX3D(90900 190900, 100100 200100)'::box3d
AND distance( the_geom, GeomFromText( 'POINT(100000 200000)', -1 ) ) < 100
WHERE the_geom && 'BOX3D(90900 190900, 100100 200100)'::box3d
AND distance( the_geom, GeomFromText( 'POINT(100000 200000)', -1 ) ) < 100
Cette requête sélectionne les même géométries, mais il le fait de manière plus efficace. Supposons qu'il existe un indexe GiST sur
the_geom
, le planificateur de requêtes constatera qu'il peut utiliser l'indexe pour réduire le nombre de ligne avant de calculer le résultat de la fonction distance()
. Notez que la géométrie BOX3D
qui est utilisé dans l'opération &&
est un cadre carré de 200 unités centré sur le point original - c'est notre "cadre de requête". L'opérateur &&
utilise l'indexe pour réduire rapidement l'ensemble résultant aux géométries qui ont un cadre limite qui recouvre le "cadre de requête". En supposant que notre "cadre de requête" est plus petit que l'extension de la totalité de la table, cela réduira considérablement le nombre de calculs de distance qui devra être effectué.
Note : depuis PostGIS 1.3.0, la plupart des fonctions relationnelles, à l'exception de
ST_Disjoint
and ST_Relate
, utilisent implicitement l'opérateur de superposition du cadre limite.
Posted in version imprimable | Vous devez vous connecter ou vous enregistrer pour écrire des commentaires | 6037 lectures
Posté par rédacteurs le 6 Avril, 2006 - 20:31.