1、第六章第六章 Oracle Spatial的空间的空间索引和操作符索引和操作符基本要求:基本要求: 1、如何利用已有空间信息进行邻近分析; 2、掌握Oracle空间技术的三个基本构件: a.空间操作符; b.空间索引; c.几何处理函数(第七章介绍)。 注意注意:要运行运行本章的例子,必须导入以下数据集。 app_with_loc.dmp包含三个“应用”表(branches、customers和competitors),且每个表都有一个SDO_GEOMETRY类型的附加列location来存储相应实体的位置。 注意注意:要运行运行本章的例子,必须导入以下数据集。 map_large.dmp包含
2、表:US_STATES、US_COUNTIES、US_CITIES、US_INTERSTATES、US_PARKS、US_RIVERS、WORLD_CONTINENTS和WORLD_COUNTRIES这个文件包含了美国的州和县的边界,以及主要城市、国家公园、河流和洲际公路的位置。它也包含了世界大陆和国家的边界。除边界被存储为SDO_GEOMETRY列外,有些表还包含人口统计学信息,例如,人口密度或人口区域。 注意注意:要运行运行本章的例子,必须导入以下数据集。 map_large.dmp包含表:building_footprints、city_buildings和trip_route这个文件包
3、含了一些假想建筑的三维结构以及它们的二维脚点(footprint)。6.1 空间索引空间索引 如何得到一个分店周围0.5英里范围内的所有客户的数量?出现错误原因:在使用空间操作符之前,必须要在customers 表的location列上创建空间索引。和B-tree索引一样,空间索引也是用SQL语句创建的。如下,可以在customers 表的location列上创建空间索引。 如果没有为空间层(对应于)插入适当的元数据,则上述创建索引会执行失败。提示如下:6.1.1 建立索引之前为空间层插入元数据建立索引之前为空间层插入元数据空间层(表示为)的空间元数据是插入在USER_SDO_GEOM_MET
4、ADATA视图中的,如下,列出了该视图的所有域。上述视图的所有域应被正确赋值,如下,对应于customers表的 location列的空间层插入元数据。标识空间层的两个域table_name和column_name,分别被设为customers和location;srid域被设为8307以表示大地坐标系;diminfo域为每个维定义了边界和容差。6.1.2 创建空间索引创建空间索引完成元数据的插入后,就可以创建空间索引了。可是如果你以前创建索引时失败了,首先必须删除失败的索引。删除以前的空间索引后,就可以创建新的索引了。6.1.3 空间索引概念空间索引概念通过查询USER_SDO_INDEXE
5、_METADATA视图的SDO_INDEXE_TABLE列,可以得到所有的空间索引表。6.2 空间索引参数空间索引参数对B-tree索引,你可以指定在哪儿放置索引数据,对与空间关联的空间索引表,同样可以。如下,是创建一个空间索引的语法,包括PARAMETERS字句。这里的parameter_string是一个列表,其中的每个元素是一个parameter_name=value对。下面将介绍在实际应用中常用的几个重要参数: (1)TABLESPACE参数 (2)WORK_TABLESPACE参数 (3)LAYER_GTYPE参数 (4)SDO_INDX_DIMS参数 (5)SDO_DML_BATC
6、H_SIZE参数 (6)SDO_LVEL参数(1)TABLESPACE参数参数通过这个参数,可以指定哪个空间来存储空间索引表,例如TABLESPACE=TBS_3会将空间索引表存储在表空间TBS_3中。(2)WORK_TABLESPACE参数参数在索引的创建过程中,R_tree索引会在整个数据集上执行排序操作,因此会产生一些工作表。使用WORK_TABLESPACE参数来为这些工作表指定一个单独的表空间。如下,创建一个WORK_TABLESPACE为TAB_3的索引:(3)LAYER_GTYPE参数参数通过这个参数,可以指定customers表的location列的几何数据为特定类型几何体。有
7、助于完整性检查,有时还可加快查询操作符的执行速度。例如,通过指定LAYER_POINT来表示customers表只含有点型数据。(4) SDO_INDX_DIMS参数参数通过该参数指定spatial_index的维数,默认值为2。R-tree也可以对三维或四维的几何体建立索引。如下,创建一个指定维数的R-tree索引:(5) SDO_DML_BATCH_SIZE参数参数这个参数用于指定一个事务中批量插入、删除、更新时的批量大小。如果没有被明确的指定,该参数被内部设为1000。如下,创建一个带有SDO_DML_BATCH_SIZE参数的索引:(6) SDO_LVEL参数参数除了R_tree外,还
8、可以通过在PARAMETERS子句中指定SDO_LEVEL参数来创建一个四分树索引。如下,创建一个四分树类型的索引:6.2.1 USER_SDO_INDEX_METADA视图视图上述讨论的在CREATE INDEX语句中是用的参数都存储在USER_SDO_INDEX_METADA视图中。如下,创建一个空间索引后,就可以检查该索引的SDO_DML_BATCH_SIZE值:6.2.2 空间索引大小需求空间索引大小需求对于一张表中N行数据的一个集合,R-tree空间索引大致需要100*3*N字节作为空间索引表的存储空间。在创建索引过程中, R-tree空间索引还需要额外200*3*N到300*3*N
9、字节作为临时工作表的存储空间。如下,可以用实用函数来粗略估计一个R-tree空间索引表的大小。第一个参数指定模式名称;第二个参数指定表名称;第三个参数指定要创建的空间索引的列名称。6.3 空间操作符空间操作符Oracle Spatial支持很多不同的空间操作符来执行邻近分析。和比较操作符和=一样,空间操作符也可用于常规SQL语句的WHERE字句。6.3.1 空间操作符的语法空间操作符的语法空间操作符的通用语法如下:在上面程序清单中,如下叙述为真:(1)table_geometry是操作符作用的表的SDO_GEOMETRY列。(2)query_geometry是查询位置。(3)parameter
10、_string指定某空间操作符特有的参数。(4)tag指定了一个在某些空间操作符中专用的数字。6.3.2 空间操作符的语义空间操作符的语义如下,为第一个在WHERE子句中使用SDO_GEOMETRY_DISTANCE操作符的空间查询。第一个变量指定了在customers表中被索引的列名,第二个变量指定一个查询位置,第三个变量指定操作符特定的参数。返回在查询位置0.5英里范围内的所有客户。6.3.3 空间操作符的计算空间操作符的计算空间操作符的计算是通过一个涉及空间索引的两部过滤机制来完成的:一个空间操作符首先是通过空间索引来计算的,这被称为初级过滤初级过滤。然后使用geometry engin
11、e处理这个候选行集,从而返回符合指定操作符的正确行集,这就是二级过滤二级过滤。如下图为使用一个关联的空间索引来进行空间操作符计算。6.4 深入理解空间操作符深入理解空间操作符Oracle Spatial提供不同的操作符来执行下述的邻近分析。1、找出在查询位置指定距离内的所有数据:该操作符称为SDO_WITHIN_DISTANCE或简称为within distance操作符;2、找出距离查询位置最近的邻居:该操作符被称为SDO_NN或简称为nearestneighbor操作符;3、找出与查询位置相交或关联的所有邻居:可达到这个目标的主要操作符被称为SDO_RELATE。如果只使用索引的近似值,那
12、么可以使用一个简单的变种(操作符),称为SDO_FILTER。6.4.1 SDO_WITHIN_DISTANCE操作符操作符给定一个位置集,SDO_WITHIN_DISTANCE操作符将从中返回在一个查询位置指定距离范围内的所有位置。SDO_WITHIN_DISTANCE操作符的语法描述如下:其中下述所列为真:1、table_geom为被检索表的SDO_GEOMETRY列。2、query_geom为指定查询位置的SDO_GEOMETRY。3、parameter_string指定参数distance及可选参数unit(对应于指定的距离)。如下,为SDO_WITHIN_DISTANCE操作符的用法
13、,它找出了指定的竞争对手商店(store id=1)周围0.25英里范围内的所有客户:执行结果为:6.4.2 SDO_NN操作符操作符SDO_WITHIN_DISTANCE操作符不适合获取指定数量的邻居,不管他们离查询位置多远,而SDO_NN可以。给定一个位置集, SDO_NN操作符将按其与查询位置的距离顺序来返回数据。其语法描述如下:table_geometry指定SDO_GEOMETRY列;query_geometry为查询位置指定SDO_GEOMETRY;parameter_string是一个可选参数,它指定两个调优参数SDO_BATCH_SIZE和SDO_NUM_RES之中的一个;ta
14、g是另一个可选参数,它允许SDO_NN操作符绑定到一个辅助距离操作符。如下,获取离指定竞争对手最近的5个客户:执行结果为:计算SDO_NN操作符时必须使用空间索引;如果在同一个表上有一个非空间谓词(如customer_grade=GOLD),且在它相关的列( customer_grade )上存在一个索引,那么在执行过程中该索引不能被使用。从前面例子中可看出SDO_NN操作符可以和其他谓词一起用在同一个SQL语句中。但存在下列限制:SDO_BATCH_SIZE性能调优参数:可以设置查询的批量大小;SDO_NUM_RES性能调优参数:可以约束返回的邻近;SDO_NN_DISTANCE辅助操作符:
15、可以获取邻居的距离。SDO_NN操作符还可以使用性能调优参数和辅助操作符来加快查询速度。 6.4.3用于空间相互作用(关系)的操作符用于空间相互作用(关系)的操作符SDO_FILTER操作符:可以识别出其最小外包矩形与查询几何体的最小外包矩形有相互作用的所有几何体,主要用于空间索引,不调用Geometry Engine函数;SDO_RELATE操作符:可识别出以某种指定的方式与查询几何体相互作用的所有几何体。(指定的相互作用方式可以是相交、与边界接触、完全包含在内等);一些SDO_RELATE操作符的简单变种操作符:可以使用简单变种操作符替代使用适当参数来识别相应特定关系的SDO_RELATE
16、操作符。 SDO_FILTER操作符的语法如下: 其中: 1、 table_geometry指定SDO_GEOMETRY列; 2、 query_geometry为查询位置指定SDO_GEOMETRY; 3、 parameter_string总被设为querytype=window,这个参数是可 选的。1、 SDO_FILTER操作符操作符 如下,为一个SDO_FILTER操作符的具体用法,它找出在一个竞争对手影响区域内的所有客户: SDO_RELATE操作符的语法如下: 其中: 1、 table_geometry指定SDO_GEOMETRY列; 2、 query_geometry为查询位置指定
17、SDO_GEOMETRY; 3、 parameter_string被设为querytype=window MASK=min_resolution=max_resolution=,这个参数是可选的。2、 SDO_RELATE操作符操作符 在了解SDO_RELATE的各种相互关系之前,先了解几何体的组成:边界:几何体的外围边界;内部:任何在几何体边界之内的部分被认为是几何体的内部;外部:任何几何体之外的部分。如图,两个几何体Q、A分别对应于SDO_RELATE语法中的query_geometry和table_geometry:(1)SDO_RELATE中的相互关系中的相互关系 如下,为一个SDO_
18、RELATE操作符的具体用法,通过使用ANYINTERACT,它找出在竞争对手0.25英里缓冲区域所有的客户:多掩码之间用一个加号(+)连接起来。如下,查看多少个销售区域与查询区域(id=51)重叠:(2)SDO_RELATE中的多掩码中的多掩码在SDO_RELATE操作符的parameter_string中指定SDO_LEVEL有可能提高操作符的响应时间,(一般查询中SDO_LEVEL 的值被隐式地设为4)如下,为使用性能调优参数的例子 :(3)SDO_RELATE性能调优参数性能调优参数1/20/20221/20/20226.5 空间索引的高级特性空间索引的高级特性空间索引的高级特性,他们对大型空间数据存储非常有用。基于函数的空间索引;本地分区空间索引;并行索引;在线索引重建;三维索引。