Tengo una tabla simple con la columna LatLon que contiene un punto con la ubicación del objeto en el espacio con el índice GiST creado en esta columna:
create table "Machine" ( "MachineId" integer not null, "Name" text, "Description" text default ''::text, "LatLon" point default point((0)::double precision, (0)::double precision) not null ); create index on "Machine" using gist("LatLon");Tengo una consulta sobre la selección de solo puntos a cierta distancia del punto con coordenadas fijas:
select * from "Machine" where "LatLon" <-> point(25.123456789,-60.123456789) < 100;Aunque la explicación en dicha consulta muestra que el índice no se está utilizando durante la ejecución:
Seq Scan on "Machine" (cost=0.00..244762.46 rows=1753121 width=208) Filter: (("LatLon" <-> '(25.123456789,-60.123456789)'::point) < '100'::double precision) Rows Removed by Filter: 5259364 Al mismo tiempo, ejecutar una order by consulta contra la columna LatLon muestra que el índice funciona perfectamente:
select * from "Machine" order by "LatLon" <-> point(25.123456789,-60.123456789); Index Scan using "Machine_LatLon_idx" on "Machine" (cost=0.41..1021907.70 rows=5259364 width=216) Order By: ("LatLon" <-> '(25.123456789,-60.123456789)'::point) ¿Por qué el índice GiST no se aplica en la instrucción where con el operador de distancia <-> ?
Porque alguien implementó uno, y no el otro.
Tenga en cuenta que esto no es simplemente un operador, y que ningún otro operador emparejado ( <-> y < , aquí) usa índices tampoco. Por lo tanto, tendría que introducir la infraestructura para admitir dichos índices, así como esta implementación específica.
Si solo desea la cosa cercana con un índice, debe llevar la distancia al punto para obtener un círculo. Entonces tienes un buen operador binario para que el índice se agarre:
select * from "Machine" where "LatLon" <@ circle(point(25.123456789,-60.123456789),100);