sql >> Base de Datos >  >> RDS >> PostgreSQL

ST_DWithin a veces no usa el índice

El ST_DWithin la documentación establece que la firma de la primera función acepta tipos de geografía, no tipos de geometría:

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

dado que (ubicación, ST_SetSRID (ST_MakePoint (20, -30), 4326)) son todas geometrías, tendría sentido que la ejecución de la función sea desordenada. Y creo que su segunda función funcionó correctamente porque lo que estaba ejecutando era esta firma :

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

Y como dijo que cambiar los tipos de columna a Geografía en lugar de Geometría resolvería el problema, ya que eso le daría la ejecución correcta de:

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);

Espero que esto ayude un poco.

Editar:

Encontré esta parte en la documentación que establece que al ingresar los datos

esto podría explicar por qué Postgres aceptó su primera invocación de ST_DWithin() ya que postgis aparentemente lo enviaría a la geografía, y eso también explica por qué la ejecución lleva más tiempo y descuida el índice, ya que cada conversión daría como resultado un nuevo objeto que no está indexado en su columna original.