【发布时间】:2015-09-03 22:04:04
【问题描述】:
我有一个自定义视图,它从几何列查询空间数据并提取纬度/经度值。但是,检索过程确实很慢,需要 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。
有关检索此类视图/数据的任何提示表示赞赏。或者我可以使用任何其他空间函数来更快地实现这一点?
【问题讨论】:
-
为什么这个问题被否决了?投反对票的用户可以评论原因吗?
-
如果 PolePoint 和 PoleDetailPoint 没有重叠,您可以使用
UNION ALL而不是UNION,那么 DB 就不必区分结果了。 -
你真的需要
Union吗?为什么不使用union all? -
手头没有时间和数据来摆弄它,但我会尝试提示第一个语句在主表和支持用于空间的嵌套表的隐藏表之间使用散列柱子。我怀疑 NL 使用嵌套表上的索引。能否请您发布执行计划?
-
您究竟是如何查询此视图的?就像弗洛林建议的那样,一个解释计划会很有用。生成一个这样的:
explain plan for select * from PoleData;,然后是select * from table(dbms_xplan.display);。性能可能与 SDO 无关,可能只是一个糟糕的执行计划。
标签: oracle geometry spatial-query spatial-index