空间操作符的通用语法如下:
该空间操作说明如下:
(1)table_geometry是操作符作用表的sdo_geometry(或ST_GEOMETRY)列,该列上必须建立空间索引。如果table_geometry是ST_GEOMETRY类型或其子类型,oracle spatial会将容差设置为0.005;如果table_geometry是SDO_GEOMETRY类型,oracle将通过USER_SDO_GEOM_METADATA视图从指定的table_geometry列获取容差值。
(2)query_geometry是查询位置,可以是另一个表的SDO_GEOMETRY(或ST_GEOMETRY)列,也可以是一个绑定的变量或一个动态构造的对象。
(3)parameter_string是指定某空间操作符特有的参数。开放的方括号表示该参数在某些操作符中是可选的。
(4)tag是指定了一个在某些空间操作符中专用的数字。同样,开放的方括号表示该参数是可选的。该参数必须和parameter_string一起被指定。
空间操作符的语义为,当在一个SQ1语句中指定一个空间操作符时,oracle只选择操作符计算为“TRUE”的行。也就是说,操作符只选择相关表中table_geometry(SDO_GEOMETRY)值与query_geometry(查询位置)满足指定的操作符关系的行。(www.xing528.com)
下面简单讨论一下如何对空间操作符进行计算,理解这个过程将有助于保证空间操作符有最好的执行策略。由于空间操作符依赖于空间索引,因此在大多数情况下,空间操作符的计算是通过一个涉及空间索引的两步过滤机制来完成的。如图6-1所示,一个空间操作符首先是通过空间索引来计算的,这被称为初级过滤。这里索引中的近似值(存储在空间索引表中的最小限定矩形)被用于识别出一个与指定查询位置具有操作符关系的候选行集。然后使用Geometry Engine处理这个候选行集,从而返回符合指定操作符的正确行集,这就是二级过滤。需要注意的是,所有的这些操作对用户都是透明的。用户只需在SQL语句的WHERE子句中指定一个空间操作符,Oracle将会内部调用合适的索引(初级过滤)和Geometry Engine功能(二级过滤)来选出正确的行集。
图6-1 使用一个关联的空间索引来进行空间操作符计算
某些情况下,数据库优化器也许会决定不使用空间索引,而在合适的行上直接使用二级过滤(即Geometry Engine)。这种情况的发生有很多原因,包括对空间操作符的成本估计不足。无论是否使用空间索引,Oracle Spatial都会粗略估计空间操作符的计算成本。不使用空间索引时,需注意以下两点:
(1)当SQL语句涉及多个表或同一个表上的空间和非空间谓词时,它有可能导致低效的执行策略。这种情况需通过显式的Hint进行性能优调。
(2)Oracle Spatial要求SDO_NN操作符的计算必须使用一个空间索引。有时需要通过显式的Hint来保证使用空间索引。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。