首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么我基于postgis ST_Intersects和ST_Azimuth的查询速度很慢?

为什么我基于postgis ST_Intersects和ST_Azimuth的查询速度很慢?
EN

Stack Overflow用户
提问于 2019-07-29 22:57:36
回答 1查看 107关注 0票数 1

我有一个表,其中包含大约300k条路线,起点、终点、路线为折线类型和多边形类型。

我做了一个自连接来找出彼此之间的路由的交叉点,但查询非常慢。即使我运行explain analyze,这个分析也不会返回任何结果。

代码语言:javascript
运行
复制
CREATE INDEX gist_index_geo_poly_gon ON geo_akin USING gist (geo_polygon)
CREATE INDEX gist_index_geo_poly_line ON geo_akin USING gist (geo_polyline)
CREATE INDEX idx_id ON geo_akin USING btree (id)

我有如上的索引,查询如下:

代码语言:javascript
运行
复制
 select 
 ST_Intersection(second.geo_polyline, first.geo_polygon)  as intersection,
from geo_akin first
   , geo_akin second
where second.id != first.id
  and abs(sin(ST_Azimuth(second.actual_start_point, second.actual_end_point))- sin(ST_Azimuth(first.actual_start_point, first.actual_end_point)))<1
  and abs(cos(ST_Azimuth(second.actual_start_point, second.actual_end_point))-cos(ST_Azimuth(first.actual_start_point, first.actual_end_point)))<1
  and st_intersects(second.geo_polyline , first.geo_polygon);

下面是我的EXPLAIN结果:

代码语言:javascript
运行
复制
   Nested Loop  (cost=0.15..45452.35 rows=128519 width=64)
  ->  Seq Scan on geo_akin found  (cost=0.00..2584.67 rows=3167 width=17077)
  ->  Index Scan using gist_index_geo_poly_line on geo_akin first  (cost=0.15..2.97 rows=1 width=4244)
        Index Cond: (geo_polyline && second.geo_polygon)
        Filter: ((id <> second.id) AND (abs((sin(st_azimuth(actual_start_point, actual_end_point)) - sin(st_azimuth(second.actual_start_point, second.actual_end_point)))) < '1'::double precision) AND (abs((cos(st_azimuth(actual_start_point, actual_end_point)) - cos(st_azimuth(second.actual_start_point, second.actual_end_point)))) < '1'::double precision) AND _st_intersects(geo_polyline, second.geo_polygon))
EN

回答 1

Stack Overflow用户

发布于 2019-07-30 23:45:11

我能看到的是你自己连接了一个300k的表,给了你90000万个交叉点。我的建议是尝试将连接过滤到仅重叠的多边形,然后查找它们是否相交。

如果为边界面添加X1、Y1、X2、Y2并使用(ID,X1,Y1,X2,Y2)创建索引,则可以非常快速地找到重叠面

代码语言:javascript
运行
复制
SELECT ST_Intersection(b.geo_polyline, a.geo_polygon) AS intersection
FROM geo_akin a
JOIN geo_akin b
  ON a.X1 <= b.X2
 AND a.X2 >= b.X1
 AND a.Y1 <= b.Y2
 AND a.Y2 >= b.Y1
 AND a.id < b.id
WHERE abs(sin(ST_Azimuth(b.actual_start_point, b.actual_end_point))
        - sin(ST_Azimuth(a.actual_start_point, a.actual_end_point))) < 1
  AND abs(cos(ST_Azimuth(b.actual_start_point, b.actual_end_point))
        - cos(ST_Azimuth(a.actual_start_point, a.actual_end_point))) < 1
  AND st_intersects(b.geo_polyline, a.geo_polygon);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57256421

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档