gpt4 book ai didi

Oracle Spatial 函数 SDO_CS.Transform(value) 结果真的很慢

转载 作者:行者123 更新时间:2023-12-04 06:56:59 26 4
gpt4 key购买 nike

我有一个自定义 View ,它从几何列中查询空间数据并提取纬度/经度值。但是,检索过程非常缓慢,最多需要 5 到 10 分钟才能检索到 View 数据。

这是我的观点:

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 行。该表中的数据每天更新,而 View 用于报告目的。

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

我们的版本是 Oracle 11.2.0.3。

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

最佳答案

尝试使用 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 个顶点的 T 和 T2 的 25 种可能组合中的每一种 P.G3E_GEOMETRY .不知道顶点顺序是不是由 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;

关于Oracle Spatial 函数 SDO_CS.Transform(value) 结果真的很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32386169/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com