我在客户机-服务器环境中使用Oracle的sdo_relate操作符来查询两个表,每个表都有数千个几何对象。我在where中应用了一个条件,只将一个对象传递给所谓的查询窗口。
使用'/*+ order */‘提示和from子句中所需的表顺序(正如Oracle空间引用中所记录的那样),我得到了一个糟糕的性能:
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。
任何人都有这样的经验,期待你的解决方案。
发布于 2014-05-11 21:31:05
关键是您的查询写得不正确。在所有空间运算符中,第一列是从表中搜索的,第二列是查询窗口。因此,请像这样重写您的查询:
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秒快得多。这个暗示根本没有必要。
假设您想要执行反向操作(=搜索与给定多边形相交的所有行),那么您将编写以下内容:
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使优化器按照列出的表的顺序执行连接。但这在这里是不必要的(甚至可能产生负面影响)。
简单的规则是:不要使用任何提示--除非您知道您有问题,而且您知道使用一些特定的提示可以解决这个问题。不要仅仅因为你认为有必要就用暗示。优化器足够聪明,可以生成正确的计划,而提示只在很少的情况下才会使用。
https://stackoverflow.com/questions/23568348
复制相似问题