这是我的观点:
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 = 0UNION ALLSELECT 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.IDUNION ALLSELECT P.g3e_fID,table (SDO_UTIL.GETVERTICES (P.G3E_GEOMETRY)) T2 WHERE P.ltt_ID = 0 AND T.ID = T2.ID;总结
以上是内存溢出为你收集整理的Oracle Spatial函数SDO_CS.Transform(value)结果非常慢全部内容,希望文章能够帮你解决Oracle Spatial函数SDO_CS.Transform(value)结果非常慢所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)