sql >> Databasteknik >  >> RDS >> PostgreSQL

ST_DWithin använder ibland inte index

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.




  1. Varför ökar MySQL autoinkrement vid misslyckade insättningar?

  2. Hur skapar man en funktion som returnerar högsta id?

  3. Hur man hanterar denna mysql-fråga med case och limit Statement

  4. Apache NiFi