ST_DWithin документацията посочва, че подписът на първата функция приема географски типове, а не геометрични типове:
boolean ST_DWithin(geography gg1, geography gg2, double precision distance_meters, boolean use_spheroid);
тъй като (location,ST_SetSRID(ST_MakePoint(20, -30), 4326)) всички са геометрии, би имало смисъл изпълнението на функцията да е объркано. И мисля, че втората ви функция работи правилно, защото това, което изпълнявахте, беше този подпис :
boolean ST_DWithin(geometry g1, geometry g2, double precision distance_of_srid);
И както казахте, че превключването на типовете колони към География вместо Геометрия ще реши проблема, тъй като това ще ви осигури правилното изпълнение на:
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);
Надявам се това да помогне малко.
Редактиране:
Намерих тази част в документацията което гласи, че при въвеждане на данни
това може да обясни защо Postgres прие първото ви извикване на ST_DWithin(), тъй като postgis очевидно ще го прехвърли към география, и това също обяснява защо изпълнението отнема повече време и пренебрегва индекса, тъй като всяко прехвърляне би довело до нов обект, който не е индексиран в вашата оригинална колона.