ST_DWithin делает запрос медленным (> 1000 мс) - PullRequest
1 голос
/ 26 января 2012

У меня есть таблица (natomr) с 200 записями, которая определяет разные области. Я хочу выяснить, в какой области (ях) содержится произвольная точка. Это мой SQL:

SELECT *
FROM natomr
WHERE ST_DWithin(the_geom4326, 
  ST_geomfromtext('POINT(13.614807 59.684035)', 4326)::geography, 1)

Этот запрос занимает около 1200 мс, что, я полагаю, слишком долго для такой маленькой таблицы.

Я создал индекс для the_geom4326, например:

CREATE INDEX natomr_the_geom4326_gist
  ON natomr
  USING gist
  (the_geom4326 );

Я также выполнил команду VACUUM FULL , но это не имело никакого эффекта.

Что я должен сделать, чтобы ускорить запрос?

1 Ответ

1 голос
/ 30 января 2012

Трудно сказать, если это неожиданно или нет из того, что у вас здесь ... 1200 мс можно ожидать.

  • Автоматический вакуум предотвращает перенос данных ... не должен влиять на скорость на таком маленьком столе
  • Таблица почти слишком мала, чтобы индекс был действительно эффективным.

Некоторые потенциалы:

У st_dwithin есть определенное количество служебных данных, связанных с ним ... он состоит из 3 вызовов двух других функций, которые полностью являются файлами библиотеки contrib (в C). Таким образом, ваше время выполнения будет выглядеть примерно как накладные расходы + х секунд на обработанную запись. Попробуйте немного увеличить ваши данные ... попробуйте 10 пунктов в одном запросе. Это даст вам лучшее представление о накладных расходах, связанных с st_dwithin.

Насколько велики полигоны в файлах форм? В качестве интересного теста попробуйте определить 5-точечный многоугольник и попытайтесь выполнить запрос, чтобы найти точку в этом многоугольнике. Теперь определите 2000-точечный многоугольник и попробуйте тот же тест. Если ваши 200 полигонов имеют 2000 точек и более, 1200MS не звучит слишком необоснованно в зависимости от мощности вашей машины.

...