PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

ST_DWithin a volte non usa index

Il ST_DWithin la documentazione afferma che la prima firma della funzione accetta i tipi di geografia non i tipi di geometria:

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

poiché (location,ST_SetSRID(ST_MakePoint(20, -30), 4326)) sono tutte geometrie, avrebbe senso che l'esecuzione della funzione sia disordinata. E penso che la tua seconda funzione funzionasse correttamente perché quello che stavi eseguendo era questa firma :

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

E come hai affermato che il passaggio dei tipi di colonna a Geografia anziché Geometria risolverebbe il problema in quanto ciò ti otterrebbe l'esecuzione corretta di:

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

Spero che questo aiuti un po'.

Modifica:

Ho trovato questa parte nella documentazione che lo afferma al momento dell'inserimento dei dati

questo potrebbe spiegare perché Postgres ha accettato la tua prima invocazione di ST_DWithin() poiché postgis apparentemente lo avrebbe lanciato in geografia, e questo spiega anche perché l'esecuzione richiede più tempo e trascura l'indice poiché ogni casting risulterebbe in un nuovo oggetto che non è indicizzato in la tua colonna originale.