Der ST_DWithin Die Dokumentation besagt, dass die erste Funktionssignatur Geografietypen akzeptiert, keine Geometrietypen:
boolean ST_DWithin(geography gg1, geography gg2, double precision distance_meters, boolean use_spheroid);
da (location,ST_SetSRID(ST_MakePoint(20, -30), 4326)) alle Geometrien sind, würde es Sinn machen, dass die Ausführung der Funktion chaotisch ist. Und ich denke, Ihre zweite Funktion hat richtig funktioniert, weil Sie diese Signatur ausgeführt haben :
boolean ST_DWithin(geometry g1, geometry g2, double precision distance_of_srid);
Und wie Sie sagten, würde das Umschalten der Spaltentypen auf Geographie anstelle von Geometrie das Problem lösen, da Sie dadurch die korrekte Ausführung von :
erhalten würdenboolean ST_DWithin(geography gg1, geography gg2, double precision distance_meters);
boolean ST_DWithin(geography gg1, geography gg2, double precision distance_meters, boolean use_spheroid);
Hoffe das hilft ein wenig.
Bearbeiten:
Habe diesen Teil in der Dokumentation gefunden das besagt, dass bei der Dateneingabe
Dies könnte erklären, warum Postgres Ihren ersten Aufruf von ST_DWithin() akzeptiert hat, da Postgis es anscheinend in Geographie umwandeln würde, und das erklärt auch, warum die Ausführung länger dauert und den Index vernachlässigt, da jedes Casting zu einem neuen Objekt führen würde, das nicht indiziert ist Ihre ursprüngliche Spalte.