Estoy usando el Postgis ST_DWithin función como esta:
SELECT *,
ST_X(geometry) as longitude,
ST_Y(geometry) as latitude,
ST_Distance_Sphere(
ST_SetSRID(
ST_MakePoint(-118.478255,34.303046999999999),
4326),
geometry) / 1609.34 as DISTANCE
FROM poi
WHERE ( category =10980400 )
AND ST_DWithin(geometry::geography,
(ST_SetSRID(
ST_MakePoint(-118.478255,34.303046999999999),
4326)::geography
),
80467.2,
false)
ORDER BY DISTANCE
LIMIT 10
La estoy usando para encontrar puntos más próximos (como los Cajeros automáticos, restaurantes) dentro de un radio.
He índices disponibles para la geometría, la geografía y un índice de árbol b para la categoría. Cuando me "explicar analizar" la consulta puedo ver que la consulta sólo utiliza la categoría de índice. No estoy seguro si es que ocurre siempre o es un tiempo de ejecución de la decisión.
El problema es que hay casos en que la consulta se realiza mejor si puedo quitar la categoría de índice y la consulta utiliza índice espacial.
Del mismo modo, hay casos cuando tengo todos los índices y la consulta es mejor mediante el uso de la categoría de índice. Pero, a continuación, los casos por encima de degradar.
¿Por qué no puede postgis decidir la manera óptima ?? He corrido VACÍO ANALIZAR en la tabla después de tener todos los índices.
SELECCIONE la versión (a) : "PostgreSQL 9.3.14"
SELECCIONE postgis_version() : "2.1 USE_GEOS=1 USE_PROJ=1 USE_STATS=1"
Aquí están los índices tengo:
CREATE INDEX world_poi_idx4
ON public.poi
USING gist
((geometry::geography));
CREATE INDEX world_poi_new_idx3
ON public.poi
USING gist
(geometry);
CREATE INDEX world_poi_idx1
ON public.poi
USING btree
(category);
Aquí están los resultados de explicar a analizar (por ejemplo de un solo caso, los resultados son diferentes en otros casos, esto es sólo para dar una idea):
Cuando la categoría de índice está presente: https://explain.depesz.com/s/iZWj
Cuando la categoría de índice no está presente: https://explain.depesz.com/s/0WH