2013-09-18 3 views
0

В приведенном ниже коде:Выполняется ли эта функция дважды?

select t.id, ST_AsText(t.geom) AS tgeom, s.name, ST_Length(ST_ShortestLine(t.geom,s.geom)) AS short,t.par 
from teta t, str_lines s 
Where ST_Length(ST_ShortestLine(t.geom,s.geom))<200 

ли ST_Length (ST_ShortestLine (t.geom, s.geom)) выполняется в два раза?

ответ

1

хорошо вопрос. но если вместо этого вы используете «WHERE short < 200», тогда его не нужно будет вычислять дважды.

+0

В соответствии с этим супер старых interenets, вы не можете сделать это: http://www.postgresql.org/ message_id/[email protected] > Оценка предложения WHERE логически предшествует оценке списка SELECT, поэтому совершенно бессмысленно ожидать, что выходы SELECT > будут доступны в ГДЕ. , но это звучит очень сумасшедшим, что вы не можете использовать столбцы с псевдонимом в выборе в предложении where –

1

Конечно, это выполняется дважды.

Однажды в вашем месте: и один раз в вашем коду с псевдонимом.

Это sucks..so я думаю, было бы лучше производительность мудрым, чтобы сделать мою собственную функцию и кэш ST_Length (ST_ShortestLine (t.geom, s.geom)), да?

Рассмотрим следующий пример:

создания таблицы st_length_temp , как выберите ST_Length (ST_ShortestLine (t.geom, s.geom)) как длина
от двойного; - или независимо от вашего эквивалента двойника Oracle.

Теперь ваш запрос становится:

select t.id, ST_AsText(t.geom) AS tgeom, s.name,l.length AS short,t.par 
from teta t, str_lines s, st_length_temp l 
Where l.length < 200 
+0

Это отстой. Поэтому я думаю, что было бы лучше работать с моей собственной функцией и кешем ST_Length (ST_ShortestLine (t .geom, s.geom)), да? – osh

+0

@osh Обновлен мой ответ для вас – Woot4Moo

0

Вы можете попробовать упаковки его в подзапрос, но я боюсь, что Оптимизатор будет сначала создать декартово произведение {Тета * str_lines} перед нанесением условия соединения.

SELECT id, tgeom, name, short, par 
FROM(select t.id 
    , ST_AsText(t.geom) AS tgeom 
    , s.name 
    , ST_Length(ST_ShortestLine(t.geom,s.geom)) AS short 
    , t.par 
    from teta t, str_lines s 
    ) pair 
Where pair.short < 200 

BTW: что версия JOIN синтаксис сделать:

select t.id 
    , ST_AsText(t.geom) AS tgeom 
    , s.name 
    , ST_Length(ST_ShortestLine(t.geom,s.geom)) AS short 
    ,t.par 
from teta t 
JOIN str_lines s ON ST_Length(ST_ShortestLine(t.geom,s.geom))<200 
    ; 
Смежные вопросы