ST_DWithin dokumentationen anger att den första funktionssignaturen accepterar geografityper inte geometrityper :
boolean ST_DWithin(geography gg1, geography gg2, double precision distance_meters, boolean use_spheroid);
eftersom (plats,ST_SetSRID(ST_MakePoint(20, -30), 4326)) alla är geometrier skulle det vara logiskt att exekveringen av funktionen är rörig. Och jag tror att din andra funktion fungerade korrekt eftersom det du körde var den här signaturen :
boolean ST_DWithin(geometry g1, geometry g2, double precision distance_of_srid);
Och som du sa att byte av kolumntyper till Geografi istället för Geometri skulle lösa problemet eftersom det skulle ge dig rätt exekvering av :
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);
Hoppas detta hjälper lite.
Redigera:
Hittade den här delen i dokumentationen som anger att vid datainmatning
detta kan förklara varför Postgres accepterade din första anrop av ST_DWithin() eftersom postgis uppenbarligen skulle casta den till geografi, och det förklarar också varför exekveringen tar längre tid och försummar indexet eftersom varje casting skulle resultera i ett nytt objekt som inte är indexerat i din ursprungliga kolumn.