PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

ST_DWithin czasami nie używa indeksu

ST_DWithin dokumentacja stwierdza, że ​​pierwsza sygnatura funkcji akceptuje typy geograficzne, a nie typy geometryczne:

boolean ST_DWithin(geography gg1, geography gg2, double precision distance_meters, boolean use_spheroid);

ponieważ (lokalizacja,ST_SetSRID(ST_MakePoint(20, -30), 4326)) to wszystkie geometrie, sensowne byłoby, aby wykonanie funkcji było nieuporządkowane. I myślę, że twoja druga funkcja działała poprawnie, ponieważ wykonywałeś ten podpis :

boolean ST_DWithin(geometry g1, geometry g2, double precision distance_of_srid);

Jak już wspomniałeś, przełączenie typów kolumn na geografię zamiast na geometrię rozwiązałoby problem, ponieważ zapewniłoby to prawidłowe wykonanie :

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);

Mam nadzieję, że to trochę pomoże.

Edytuj:

Znalazłem tę część w dokumentacji który stwierdza, że ​​po wprowadzeniu danych

może to wyjaśniać, dlaczego Postgres zaakceptował twoje pierwsze wywołanie ST_DWithin(), ponieważ postgis najwyraźniej rzuciłby je na geografię, a także wyjaśnia, dlaczego wykonanie trwa dłużej i pomija indeks, ponieważ każde rzutowanie skutkowałoby nowym obiektem, który nie jest indeksowany w oryginalna kolumna.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zarządzanie i monitorowanie bazy danych dla PostgreSQL 12

  2. Postgresql throw null wartość w kolumnie narusza ograniczenie not-null podczas korzystania z relacji oneToMany w JPA

  3. Zwróć wartości kolumn sprzed UPDATE, używając tylko SQL

  4. Jak używać ST_Intersects w klauzuli WHERE?

  5. Jak usunąć indeks varchar_pattern_ops w migracji django (1.8)?