PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Заявката по координати отнема твърде много време - опции за оптимизиране?

Ще бъдете много по-добре, ако използвате пространствен индекс, който използва R-дърво (по същество двуизмерен индекс, който работи чрез разделяне на пространството на кутии) и ще се представи много по-добре от по-голямо от, по-малко от сравнения на две отделни шир. , lon стойности на този вид заявка. Първо обаче ще трябва да създадете геометричен тип, който след това да индексирате и използвате в заявката си вместо отделните двойки ширина/дължина, които използвате в момента.

Следното ще създаде геометричен тип, ще го попълни и ще добави индекс към него, като гарантира, че е точка и в широчина/дължина, известен като EPSG:4326

alter table event add column geom geometry(POINT, 4326);
update event set geom=ST_SetSrid(ST_MakePoint(lon, lat), 4326);
create index ix_spatial_event_geom on event using gist(geom);

След това можете да изпълните следната заявка, за да получите вашите събития, които ще използват пространствени пресичания, които трябва да използват вашия пространствен индекс:

Select * from events where ST_Intersects(ST_SetSRID(ST_MakeBox2D(ST_MakePoint(swLon, swLat), 
    ST_MakePoint(neLon, neLat)),4326), geom) 
order by relevancy desc limit 100;

Вие правите ограничителната кутия за вашето пресичане, като използвате ST_MakeBOX2D с два комплекта точки, които ще бъдат в диагоналните ъгли на ограничителната кутия, така че двойките SW и NE или SW и SE ще работят.

Когато стартирате обяснение за това, трябва да откриете, че пространственият индекс е включен. Това ще се представи значително по-добре от два отделни индекса на колони за дължина и ширина, тъй като удряте само едно индексирано, оптимизирано за пространствено търсене, а не две B-дървета. Разбирам, че това представлява друг начин да го направите и не отговаря на първоначалния ви въпрос, освен косвено.

РЕДАКТИРАНЕ: Mike T отбеляза много добре, че за търсения в ограничителна кутия в 4326 е по-подходящо и по-бързо да се използва геометричен тип данни и операторът &&като SRID така или иначе ще бъде игнориран, напр.

 where ST_MakeBox2D(ST_MakePoint(swLon, swLat), ST_MakePoint(neLon, neLat)) && geom



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Postgres:дефиниране на стойност по подразбиране за CAST неуспехи?

  2. Как да намерите размера на диска на Postgres / PostgreSQL таблица и нейните индекси

  3. Как мога (или мога) да ИЗБЕРЯ DISTINCT на няколко колони?

  4. Големите обекти не могат да се използват в режим на автоматично записване

  5. Как да изпратите JSON обект към вложен масив в JSONB колона