首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在oralce空间10g中使用sdo_relate的最佳方法是什么?

在oralce空间10g中使用sdo_relate的最佳方法是什么?
EN

Stack Overflow用户
提问于 2014-05-09 15:22:51
回答 1查看 2.2K关注 0票数 3

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

使用'/*+ order */‘提示和from子句中所需的表顺序(正如Oracle空间引用中所记录的那样),我得到了一个糟糕的性能:

代码语言:javascript
复制
 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 Sec。(仍然需要优化)无论如何,空间文档似乎是在工作!operat.htm#i78531

任何人都有这样的经验,期待你的解决方案。

EN

回答 1

Stack Overflow用户

发布于 2014-05-11 21:31:05

关键是您的查询写得不正确。在所有空间运算符中,第一列是从表中搜索的,第二列是查询窗口。因此,请像这样重写您的查询:

代码语言:javascript
复制
SELECT A.someAttr 
FROM Polygons A,lines B  
WHERE B.id=someValue 
AND sdo_relate(A.geom,B.geom,'mask=anyinteract') = 'TRUE';

或更简单:

代码语言:javascript
复制
SELECT A.someAttr 
FROM Polygons A,lines B  
WHERE B.id=someValue 
AND sdo_anyinteract(A.geom,B.geom) = 'TRUE';

这将比你指出的50秒快得多。这个暗示根本没有必要。

假设您想要执行反向操作(=搜索与给定多边形相交的所有行),那么您将编写以下内容:

代码语言:javascript
复制
SELECT A.someAttr 
FROM Polygons A,lines B  
WHERE A.id=someValue 
AND sdo_anyinteract(B.geom,A.geom) = 'TRUE';

换句话说,您需要对SDO_ANYINTERACT的参数排序,以便first是您搜索的列的名称,第二是您的搜索窗口

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

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23568348

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档