Oracle Spatial函数SDO_CS.Transform(value)结果非常慢

时间:2015-09-03 22:04:05

标签: oracle geometry spatial-query spatial-index

我有一个自定义视图,用于查询几何列中的空间数据并提取纬度/经度值。但是,检索过程非常缓慢,最多需要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,
          T2.X * 1000 AS x_coord,
          T2.Y * 1000 AS y_coord,
          T.Y AS latitude,
          T.X AS longitude
     FROM PoleDetailPoint 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;

G3E_GEOMETRY列属于SDO_GEOMETRY类型。 PolePoint表有1,310,629行,而PoleDetailPoint有100个。此表中的数据每天更新,而视图用于报告目的。

我尝试使用status=cleanup参数重建空间索引。但这没有任何区别。

我们的版本是Oracle 11.2.0.3。

有关检索此类视图/数据的任何提示均已受到赞赏。或者我可以用来更快地实现这一目标的任何其他空间函数?

2 个答案:

答案 0 :(得分:1)

尝试使用UNION ALL代替UNION

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 ALL
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 PoleDetailPoint 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;

另一个可能导致性能下降的原因是,您在SDO_UTIL.GET_VERTICES上直接使用了P.G3E_GEOMETRY两个调用,另一个在P.G3E_GEOMETRY的转换中使用了{两个顶点列表的交叉乘积,例如,如果特定P.G3E_GEOMETRY包含5个顶点,那么对于该5个顶点的T和T2的25种可能组合中的每一种,最终将得到5 * 5条记录{ {1}}。我不知道顶点顺序是否由P.G3E_GEOMETRY函数维护,但如果是,则可以通过在查询的每一半中添加SDO_CS.TRANSFORM谓词来提高性能:

and t1.id = t2.id

答案 1 :(得分:-1)

您是否尝试将转换为表格元素移动到with子句?

通常它们非常慢,特别是如果优化器决定为连接表中的每一行运行它们(以检查结果集是否已更改)

试试这个:

with t as (select * from table (sdo_util.getvertices (sdo_cs.transform (p.g3e_geometry, 8265)))),
     t2 as (select * from table (sdo_util.getvertices (p.g3e_geometry)))
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, t, t2
 where p.ltt_id = 0
union 
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 poledetailpoint p, t, t2
 where p.ltt_id = 0;

此外,您确定需要"union"(强制排序过滤器)而不是"union all"吗? (即您是否期望重复结果?如果不使用union all

此致 奥拉维尔埃