Oracle Spatial函数SDO_CS.Transform(value)结果非常慢
我有一个自定义视图,用于查询几何列中的空间数据并提取纬度/经度值.但是,检索过程非常慢,并且需要最多5到10分钟才能检索到视图数据. 这是我的观点: CREATE OR REPLACE FORCE VIEW PoleData ( G3E_FID,X_COORD,Y_COORD,LATITUDE,LONGITUDE ) AS SELECT P.g3e_fid,T2.X * 1000 AS x_coord,T2.Y * 1000 AS y_coord,T.Y AS latitude,T.X AS longitude FROM PolePoint P,TABLE ( SDO_UTIL.GETVERTICES (SDO_CS.TRANSFORM (P.G3E_GEOMETRY,8265))) T,TABLE (SDO_UTIL.GETVERTICES (P.G3E_GEOMETRY)) T2 WHERE P.ltt_id = 0 UNION SELECT P.g3e_fid,T.X AS longitude FROM PoleDetailPoint P,TABLE (SDO_UTIL.GETVERTICES (P.G3E_GEOMETRY)) T2 WHERE P.ltt_id = 0; G3E_GEOMETRY列是SDO_GEOMETRY类型. PolePoint表有1,310,629行,而PoleDetailPoint有100行.此表中的数据每天更新,而视图用于报告目的. 我尝试使用status = cleanup参数重建空间索引.但这没有任何区别. 我们的版本是Oracle 11.2.0.3. 有关检索此类视图/数据的任何提示均表示赞赏.或者我可以使用任何其他空间函数来更快地实现这一目标? 解决方法尝试使用UNION ALL而不是UNION:SELECT P.g3e_fid,T.X AS longitude FROM PolePoint P,TABLE ( SDO_UTIL.GETVERTICES (SDO_CS.TRANSFORM (P.G3E_GEOMETRY,TABLE (SDO_UTIL.GETVERTICES (P.G3E_GEOMETRY)) T2 WHERE P.ltt_id = 0 UNION ALL SELECT P.g3e_fid,T.X AS longitude FROM PoleDetailPoint P,TABLE (SDO_UTIL.GETVERTICES (P.G3E_GEOMETRY)) T2 WHERE P.ltt_id = 0; 性能下降的另一个潜在来源是你直接在P.G3E_GEOMETRY上使用两个SDO_UTIL.GET_VERTICES调用而另一个在P.G3E_GEOMETRY的变换上你将基本上有两个顶点列表的叉积的事实,所以例如,如果特定的P.G3E_GEOMETRY包含5个顶点,那么对于该5个顶点P.G3E_GEOMETRY,对于T和T2的25种可能组合中的每一种,最终将得到5 * 5条记录.我不知道顶点顺序是否由SDO_CS.TRANSFORM函数维护,但如果是,则可以通过在查询的每一半中添加和t1.id = t2.id谓词来提高性能: SELECT P.g3e_fid,TABLE (SDO_UTIL.GETVERTICES (P.G3E_GEOMETRY)) T2 WHERE P.ltt_id = 0 AND T.ID = T2.ID UNION ALL SELECT P.g3e_fid,TABLE (SDO_UTIL.GETVERTICES (P.G3E_GEOMETRY)) T2 WHERE P.ltt_id = 0 AND T.ID = T2.ID; (编辑:温州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |