当前位置: 首页 > 知识库问答 >
问题:

Oracle空间函数SDO_CS。转换(值)结果非常慢

戴化
2023-03-14

我有一个自定义视图,它从几何列中查询空间数据并提取纬度/经度值。但是,检索过程非常慢,最多需要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=清理参数重建空间索引。但这没有任何区别。

我们的版本是甲骨文11.2.0.3。

任何关于检索此类视图/数据的提示都将不胜感激。或者其他我可以用来更快实现的空间功能?

共有2个答案

邵俊才
2023-03-14

您是否尝试过将cast to table元素移到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;

另外,您确定您需要< code >“union”(强制排序过滤器)而不是< code >“union all”?(例如,您是否期望重复的结果?如果没有使用< code>union all)

问候Olafur

汪学真
2023-03-14

尝试使用 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 * 5条记录,对于该5个顶点P.G3E_GEOMETRY,T和T2的25种可能组合中的每一条都有一条。我不知道顶点顺序是否由SDO_CS维持。TRANSFORM 函数,但如果是,则可以通过将 and t1.id = t2.id 谓词添加到查询的每一半来提高性能:

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
   AND T.ID = T2.ID
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
   AND T.ID = T2.ID;
 类似资料:
  • 我需要将GPS坐标保存在一个没有安装spatial extension的Oracle数据库中。有一个软件pl/sql模拟Oracle Spatial的主要功能(显然没有使用它的数据类型),以同样的方式对Oracle 11的JSON功能进行“包装”。github:https://github.com/pljson/pljson上有这个项目

  • 问题内容: 我在这个问题上工作了几天。我有一个 oracle 数据库。必须在 一个查询中 解决该问题。没有功能,程序,…我想进行选择。当他有结果时,将其发布。否则应该有“空结果”。 问题在于Oracle希望通过else来实现Agregat函数。因此,如果结果不是“ no entry”,我只会得到一个值。我需要所有价值观。 欢迎能够帮助我的每个人,并让我感到高兴。 问题答案: 不确定您要达到什么目标

  • 本文向大家介绍Mysql 常用的时间日期及转换函数小结,包括了Mysql 常用的时间日期及转换函数小结的使用技巧和注意事项,需要的朋友参考一下 本文主要是总结一些常用的在实际运用中常用的一些mysql时间日期以及转换的函数 1.now()  :返回当前日期和时间 2.curdate()   :返回当前日期 3. dayofweek(data) : 返回日期 data 是星期几 4.weekday(

  • 我有程序: 我的问题是,如何从第一个查询中获取ID并在第二个查询中使用它们,或者我可以通过某种方式声明变量并从第一个查询中选择到这个变量ID中,然后在第二个查询中使用这个变量?我的任务找不到解决方法...请帮帮我

  • 我在代码上收到一条错误消息,以查找支付200美元佣金的员工的总工资。一旦输入了所有员工的总销售额,就应该打印出属于每个不同薪酬类别的员工销售额。下面是代码: 这是我收到的确切错误消息: 我相信这与双重转换有关,但我不确定这有什么问题?有没有人能帮我搞清楚哪里出问题了(它编译没有错误)?我也尝试过只有双精度(包括数组),但这并没有解决问题。

  • 我正在对一个小表执行一个简单的查询 系统表只有三列(Id、Name、Progress)和1300行。 我获取数据的代码是: 这段代码在JTable中显示日期大约需要15秒,而如果在phpmyadmin中执行查询,则需要不到1秒。