4.6.1. Tirer avantage des indexes.


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

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.