在下面的代码中:
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)) 是否执行了两次?
在下面的代码中:
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)) 是否执行了两次?
当然它会执行两次。
一次在您的 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
好问题。但如果您使用 'WHERE short < 200' 则不需要计算两次。
您可以尝试将其打包到子查询中,但我担心优化器会在应用连接条件之前首先创建笛卡尔积 {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
;