作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个自定义 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
重建空间索引范围。但这没有任何区别。
最佳答案
尝试使用 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/
我有一个自定义 View ,它从几何列中查询空间数据并提取纬度/经度值。但是,检索过程非常缓慢,最多需要 5 到 10 分钟才能检索到 View 数据。 这是我的观点: CREATE OR REPLA
我是一名优秀的程序员,十分优秀!