问题描述:在使用增量数据更新基态数据的时候,比如使用residential_newarea的数据更新residential_area的基态数据,需要根据每一条增量数据与基态数据之间的空间关系来筛选出哪些基态数据需要被匹配更新,这里使用的方法是只要增量和基态之间的面数据相交了,那么就把这条基态数据筛选出来。这里使用的空间索引是shape栏,储存的是sdo_geometry类型的字段,数据使用WKID为4326,名称为WGS1984的地理坐标。以前写的sql语句查询速度非常慢,一条符合条件的基态数据的筛选需要2.5秒左右,而且增量只有111条,基态6000多条,最终发现sql语句进行了全表查询。
SELECT objectid,nationcode,nationelename,osmid,fc,dsg,sdo_geometry.get_wkt(shape)
geometry_wkt,sdo_geom.sdo_area(shape, 0.005)
area,sdo_geom.sdo_area(SDO_GEOM.SDO_INTERSECTION(shape,sdo_geometry
('{1}',4326),0.05),0.05) overlayArea,
sdo_geometry.get_wkt(sdo_geom.sdo_centroid(shape,0.005)) centerPoint
FROM {0} WHERE SDO_GEOM.SDO_DISTANCE(shape,sdo_geometry ('{1}',4326),0.5)=0", tableName, geometry_wkt);
这里主要的查询速度的影响依靠where后面的SDO_GEOM.SDO_DISTANCE求距离函数,但是虽然里面包含了shape字段,但是其实还是全表查询,并没有使用到索引。where前面的函数并没有影响到查询速度,sdo_geom.sdo_area是求面积函数,SDO_GEOM.SDO_INTERSECTION是求两个面之间相交的函数,sdo_geom.sdo_centroid是求中心点的函数。
在查询了索引相关概念以及请教大神之后,重新写出了一个sql语句。
SELECT
t1.objectid,t1.nationcode,t1.nationelename,t1.versionid,t1.osmid,t1.fc,t1.dsg,
sdo_geometry.get_wkt(SDO_GEOM.SDO_INTERSECTION(t1.shape,t2.shape,0.5))
geometry_wkt,sdo_geom.sdo_area(t1.shape, 0.005) area,
sdo_geom.sdo_area(SDO_GEOM.SDO_INTERSECTION(t1.shape,t2.shape,0.05),0.05)
overlayArea,sdo_geometry.get_wkt(sdo_geom.sdo_centroid(t1.shape,0.005)) centerPoint
from residential_area t1,residential_newarea t2
where t2.objectid=58
and SDO_ANYINTERACT(t1.shape,t2.shape)='TRUE';
最终实现了索引的使用,大大加快了查询速度。