这个函数执行了两次吗?

时间:2013-09-18 00:32:37

标签: sql postgresql

在下面的代码中:

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

3 个答案:

答案 0 :(得分:1)

好的问题。但如果相反,你使用'WHERE short&lt; 200'然后它不需要计算两次。

答案 1 :(得分:1)

当然它被执行了两次。

一旦进入你的where子句 并在列中出现别名代码。

  

那太糟糕了......所以我觉得制作我的表演会更好   自己的函数和缓存ST_Length(ST_ShortestLine(t.geom,s.geom)),呵呵?

请考虑以下事项:

创建表st_length_temp 选择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

答案 2 :(得分: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

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
   ;