PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

ST_DWithin às vezes não usa índice


O ST_DWithin a documentação afirma que a primeira assinatura de função aceita tipos de geografia e não tipos de geometria:
boolean ST_DWithin(geography gg1, geography gg2, double precision distance_meters, boolean use_spheroid);

já que (location,ST_SetSRID(ST_MakePoint(20, -30), 4326)) são todas as geometrias, faria sentido que a execução da função seja confusa. E acho que sua segunda função estava funcionando corretamente porque o que você estava executando era essa assinatura :
boolean ST_DWithin(geometry g1, geometry g2, double precision distance_of_srid);

E como você afirmou que mudar os tipos de coluna para Geografia em vez de Geometria resolveria o problema, pois isso lhe daria a execução correta de:
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);

Espero que isso ajude um pouco.

Editar:

Encontrei esta parte na documentação que afirma que após a entrada de dados

isso poderia explicar por que o Postgres aceitou sua primeira invocação do ST_DWithin() já que o postgis aparentemente o lançaria para geografia, e isso também explica por que a execução demora mais e negligencia o índice, pois cada conversão resultaria em um novo objeto que não é indexado em sua coluna original.