2014-11-10 3 views
0

У меня есть запрос, который создает вход для pgRoutingpgr_drivingDistance функции:PostgreSQL - PostGIS оптимизации запросов

CREATE TEMP TABLE tmp_edge AS     
SELECT 
    e."Id" as id, 
    e."Source" as source, 
    e."Target" as target, 
    e."Length"/(1000*LEAST("Speed", "SpeedMin")/60) as cost 
FROM "Edge" e, 
     "SpeedLimit" sl 
WHERE sl."VehicleKindId" = 1 
     AND e.the_geom && 
      ST_MakeEnvelope(
       x1-(1000*GREATEST("Speed", "SpeedMax")/60)*13, 
       y1-(1000*GREATEST("Speed", "SpeedMax")/60)*13, 
       x1+(1000*GREATEST("Speed", "SpeedMax")/60)*13, 
       y1+(1000*GREATEST("Speed", "SpeedMax")/60)*13, 3857) 
     AND sl."RoadCategoryId" = e."CategoryId"; 

В статье WHERE я вычислить то же самое, в несколько раз, чтобы получить ограничивающего координаты окно.

Я попытался выполнить вычисления в части FROM и использовать псевдоним для вычисленного столбца, но затем все время выполнения увеличивается в два раза.

Edge стол довольно большой (1 milion) и SpeedLimit - несколько дюжина запись.

Есть ли способ улучшить этот запрос?

+1

Где находятся x1, y1, входящие в этот запрос. Что объясняет шоу? –

ответ

0

Рекомендуется использовать таблицы, используя JOIN синтаксис. А потом ограничьте данный набор wit WHERE. Что такое ST_MakeEnvelope? Вы можете использовать Index on expression в PostgreSQL;)
Expression indexes in PostgreSQL

Поскольку вы используете выражения, которые могут вам пригодиться.
И вы можете использовать Explain analyize, чтобы заметить ваши узкие места в запросе

+0

Я читал, что при подключении с помощью 'JOIN' нет выигрыша от производительности. ST_MarkeEnvelope - это функция PostGIS, позволяющая создать прямоугольник определенной степени. Столбцы, используемые для объединения, индексируются. – Marcin

+0

Я говорил об индексах выражений, так как у вас есть несколько выражений в вашем запросе. 'JOIN' добавляет ясности запроса. :) –

Смежные вопросы