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)) 是否执行了两次?

4

3 回答 3

1

当然它会执行两次。

一次在您的 where 子句中,一次在您的列别名代码中。

这太糟糕了..所以我想制作我自己的函数并缓存 ST_Length(ST_ShortestLine(t.geom,s.geom)) 会更好的性能,是吧?

考虑以下:

创建表 st_length_temp 作为 select ST_Length(ST_ShortestLine(t.geom,s.geom)) 作为
对偶的长度;——或者任何你相当于甲骨文的对偶。

现在您的查询变为:

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
于 2013-09-18T00:39:30.600 回答
1

好问题。但如果您使用 'WHERE short < 200' 则不需要计算两次。

于 2013-09-18T00:35:37.210 回答
0

您可以尝试将其打包到子查询中,但我担心优化器会在应用连接条件之前首先创建笛卡尔积 {teta * 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

顺便说一句: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
   ;
于 2013-09-18T12:19:01.477 回答