gpt4 book ai didi

sql - 在 oracle spatial 10g 中使用 sdo_relate 的最佳方法是什么?

转载 作者:行者123 更新时间:2023-12-04 13:44:02 24 4
gpt4 key购买 nike

我在客户端-服务器环境中使用 Oracle spatial 的 sdo_relate Operator 来查询两个表,每个表都有数千个几何对象。我在 where 子句中应用了一个条件,只将一个对象传递给所谓的查询窗口。

在 from 子句中使用 '/*+ ordered */' 提示和所需的表顺序(如 Oracle Spatial 引用中所述)我的性能很差:

 SELECT /*+ ORDERED */  A.someAttr FROM  Polygons A,lines B  WHERE
B.id=someValue AND sdo_relate(B.geom,A.geom,
'mask=anyinteract') = 'TRUE'; --6 Min!

我认为这是解决方法,因为没有有序的提示,它需要 50 秒。 (还有待优化)无论如何,空间文档似乎很糟糕! http://docs.oracle.com/cd/B19306_01/appdev.102/b14255/sdo_operat.htm#i78531

谁有过这样的经历,期待你的解决方案。

最佳答案

关键是你的查询写错了。在所有空间运算符中,第一 列是您搜索的表中的列,第二 列是您的查询窗口。所以像这样重写你的查询:

SELECT A.someAttr 
FROM Polygons A,lines B
WHERE B.id=someValue
AND sdo_relate(A.geom,B.geom,'mask=anyinteract') = 'TRUE';

或更简单:

SELECT A.someAttr 
FROM Polygons A,lines B
WHERE B.id=someValue
AND sdo_anyinteract(A.geom,B.geom) = 'TRUE';

这将比您指定的 50 秒快得多。并且提示根本没有必要。

假设您想进行反向操作(= 搜索与给定 POLYGON 相交的所有 LINES),那么您可以这样写:

SELECT A.someAttr 
FROM Polygons A,lines B
WHERE A.id=someValue
AND sdo_anyinteract(B.geom,A.geom) = 'TRUE';

换句话说,您需要对 SDO_ANYINTERACT 的参数进行排序,使第一个 是您搜索 的列的名称,而第二个 是您的搜索窗口

from 子句中表的顺序并不重要,where 子句中谓词的顺序也不重要:数据库优化器将生成相同的查询计划。

where 子句中对表进行排序的唯一原因是,如果您使用/*+ order */提示让优化器按照表列出的顺序执行连接。但这在这里是不必要的(甚至可能产生负面影响)。

简单的规则是:不要使用任何提示 - 除非你知道你有问题并且你知道使用一些特定的提示可以解决问题。永远不要仅仅因为您认为有必要就使用提示。优化器足够聪明,可以生成正确的计划,并且仅在极少数情况下才会使用提示。

关于sql - 在 oracle spatial 10g 中使用 sdo_relate 的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23568348/

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