利用ST_Geometry 进行周边查询很慢的解决方法

时间:2016-8-5    作者:悬浮的青春    分类: dbbase


利用st_geometry查询包含在某个多边形内部的点。即所谓的缓冲区查询或者多边形查询,周边查询等。


利用st_geometry一般会写出以下两种方式查询


1、select * from RAINSTATION t where st_contains(
 sde.st_geometry('POLYGON ((110.131461 20.444913,110.628593 34.453972,117.743949 20.940567,110.131461 20.444913))',
                                         t.shape.srid),shape) = 1


面包含点。st_contains方法是一种全表扫描的查询方式超级慢。



2、select * from RAINSTATION t where sde.st_intersects(shape,
 sde.st_geometry('POLYGON ((130.131461 45.444913,130.628593 34.453972,117.743949 45.940567,130.131461 45.444913))',
                                         t.shape.srid)) = 1


点在面中。st_intersects是一种空间查询方式,会比上面的方法快很多,利用空间索引查询。



但是当点很多的时候。比如成千上万的时候,第2种的效率也感觉特别差。


下面是解决办法


select * from RAINSTATION t where sde.st_intersects(shape,
 (select sde.st_geometry('POLYGON ((130.131461 45.444913,130.628593 34.453972,117.743949 45.940567,130.131461 45.444913))',
                                         t.shape.srid) from dual)) = 1

原来构建几何对象(st_geometry)也会消耗性能和时间,如果把st_geometry放在一个select里,查询速度就正常了,比原来快很多。

WRITTEN BY

avatar