Il ST_DWithin la documentazione afferma che la prima firma della funzione accetta i tipi di geografia non i tipi di geometria:
boolean ST_DWithin(geography gg1, geography gg2, double precision distance_meters, boolean use_spheroid);
poiché (location,ST_SetSRID(ST_MakePoint(20, -30), 4326)) sono tutte geometrie, avrebbe senso che l'esecuzione della funzione sia disordinata. E penso che la tua seconda funzione funzionasse correttamente perché quello che stavi eseguendo era questa firma :
boolean ST_DWithin(geometry g1, geometry g2, double precision distance_of_srid);
E come hai affermato che il passaggio dei tipi di colonna a Geografia anziché Geometria risolverebbe il problema in quanto ciò ti otterrebbe l'esecuzione corretta di:
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);
Spero che questo aiuti un po'.
Modifica:
Ho trovato questa parte nella documentazione che lo afferma al momento dell'inserimento dei dati
questo potrebbe spiegare perché Postgres ha accettato la tua prima invocazione di ST_DWithin() poiché postgis apparentemente lo avrebbe lanciato in geografia, e questo spiega anche perché l'esecuzione richiede più tempo e trascura l'indice poiché ogni casting risulterebbe in un nuovo oggetto che non è indicizzato in la tua colonna originale.