ST_DWithin dokumentace uvádí, že první podpis funkce přijímá geografické typy, nikoli typy geometrie:
boolean ST_DWithin(geography gg1, geography gg2, double precision distance_meters, boolean use_spheroid);
protože (location,ST_SetSRID(ST_MakePoint(20, -30), 4326)) jsou všechny geometrie, dávalo by smysl, že provádění funkce je chaotické. A myslím, že vaše druhá funkce fungovala správně, protože to, co jste spouštěli, byl tento podpis :
boolean ST_DWithin(geometry g1, geometry g2, double precision distance_of_srid);
A jak jste uvedl, přepnutím typů sloupců na Geografii místo Geometrie by se problém vyřešil, protože byste získali správné provedení:
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);
Doufám, že to trochu pomůže.
Upravit:
Tuto část jsem nalezl v dokumentaci který uvádí, že při zadávání dat
to by mohlo vysvětlovat, proč Postgres přijal vaše první vyvolání ST_DWithin(), protože postgis by to zjevně přenesl do geografie, a to také vysvětluje, proč provádění trvá déle a zanedbává index, protože každé přetypování by vedlo k novému objektu, který není indexován v váš původní sloupec.