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

时间:2014-05-09 15:22:51

标签: sql performance oracle10g spatial

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

使用' / * + ordered * /'提示和from子句中所需的表顺序(如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

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

1 个答案:

答案 0 :(得分:1)

关键是你的查询写得不正确。在所有空间运算符中, first 列是您搜索的表中的一行, second 一列是您的查询窗口。所以重写你的查询:

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的顺序排序参数,以便第一个是您搜索的列名称和 second < / strong>是您的搜索窗口

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

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

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