PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

ST_DWithin n'utilise parfois pas l'index

Le ST_DWithin la documentation indique que la première signature de fonction accepte les types géographiques et non les types géométriques :

boolean ST_DWithin(geography gg1, geography gg2, double precision distance_meters, boolean use_spheroid);

puisque (location,ST_SetSRID(ST_MakePoint(20, -30), 4326)) sont toutes des géométries, il serait logique que l'exécution de la fonction soit désordonnée. Et je pense que votre deuxième fonction fonctionnait correctement car ce que vous exécutiez était cette signature :

boolean ST_DWithin(geometry g1, geometry g2, double precision distance_of_srid);

Et comme vous l'avez dit, changer les types de colonnes en géographie au lieu de géométrie résoudrait le problème car cela vous permettrait d'exécuter correctement :

boolean ST_DWithin(geography gg1, geography gg2, double precision distance_meters);

boolean ST_DWithin(geography gg1, geography gg2, double precision distance_meters, boolean use_spheroid);

J'espère que cela aide un peu.

Modifier :

Trouvé cette partie dans la documentation qui stipule que lors de la saisie des données

cela pourrait expliquer pourquoi Postgres a accepté votre première invocation de ST_DWithin() car postgis le jetterait apparemment en géographie, et cela explique également pourquoi l'exécution prend plus de temps et néglige l'index car chaque coulée se traduirait par un nouvel objet qui n'est pas indexé dans votre colonne d'origine.