我在客户端 - 服务器环境中使用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
任何人都有这样的经历,期待你的解决方案。
答案 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来使优化器按照列出的顺序执行连接。但这里没有必要(甚至可能产生负面影响)。
简单的规则是这样的:不要使用任何提示 - 除非你知道你有问题并且你知道使用某些特定提示将解决这个问题。永远不要仅仅因为您认为必要而使用提示。优化器足够聪明,可以生成正确的计划,只有在极少数情况下才会使用提示。