ST_DWithin dokumentacja stwierdza, że pierwsza sygnatura funkcji akceptuje typy geograficzne, a nie typy geometryczne:
boolean ST_DWithin(geography gg1, geography gg2, double precision distance_meters, boolean use_spheroid);
ponieważ (lokalizacja,ST_SetSRID(ST_MakePoint(20, -30), 4326)) to wszystkie geometrie, sensowne byłoby, aby wykonanie funkcji było nieuporządkowane. I myślę, że twoja druga funkcja działała poprawnie, ponieważ wykonywałeś ten podpis :
boolean ST_DWithin(geometry g1, geometry g2, double precision distance_of_srid);
Jak już wspomniałeś, przełączenie typów kolumn na geografię zamiast na geometrię rozwiązałoby problem, ponieważ zapewniłoby to prawidłowe wykonanie :
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);
Mam nadzieję, że to trochę pomoże.
Edytuj:
Znalazłem tę część w dokumentacji który stwierdza, że po wprowadzeniu danych
może to wyjaśniać, dlaczego Postgres zaakceptował twoje pierwsze wywołanie ST_DWithin(), ponieważ postgis najwyraźniej rzuciłby je na geografię, a także wyjaśnia, dlaczego wykonanie trwa dłużej i pomija indeks, ponieważ każde rzutowanie skutkowałoby nowym obiektem, który nie jest indeksowany w oryginalna kolumna.