De ST_DWithin documentatie stelt dat de eerste functiehandtekening aardrijkskundetypen accepteert en geen geometrietypen:
boolean ST_DWithin(geography gg1, geography gg2, double precision distance_meters, boolean use_spheroid);
aangezien (location,ST_SetSRID(ST_MakePoint(20, -30), 4326)) allemaal geometrieën zijn, zou het logisch zijn dat de uitvoering van de functie rommelig is. En ik denk dat je tweede functie goed werkte omdat wat je aan het uitvoeren was deze handtekening was :
boolean ST_DWithin(geometry g1, geometry g2, double precision distance_of_srid);
En zoals u al zei, zou het probleem oplossen door de kolomtypen te wijzigen in Geografie in plaats van Geometrie, omdat u dan de juiste uitvoering krijgt van:
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);
Ik hoop dat dit een beetje helpt.
Bewerken:
Vond dit onderdeel in de documentatie waarin staat dat bij gegevensinvoer
dit zou kunnen verklaren waarom Postgres je eerste aanroep van de ST_DWithin() accepteerde omdat postgi het blijkbaar naar geografie zou casten, en dat verklaart ook waarom de uitvoering langer duurt en de index verwaarloost, aangezien elke casting zou resulteren in een nieuw object dat niet is geïndexeerd in je originele column.