由 DB2 Spatial Extender 生成的空间索引
IBM DB2 Spatial Extender 提供了三层的格网空间索引,使应用程序能够查询包含在空间列中的二维地理数据,并可快速识别给定范围内的所有几何。
二维空间索引不同于 DB2 提供的传统等级 B 树索引。由于空间列的二维特征需要空间索引结构,因此 B 树索引可能不能应用于空间列。同样,空间索引可能不能应用于非空间列和任何种类的复合列。
因此,空间索引的 CREATE INDEX 语法包括其他 USING 子句,该子句将指示 DB2 使用 Spatial Extender 的空间索引而非 B 树索引。完整的语法如下:
CREATE INDEX <index_name>
ON <table> (<spatial column>)
USING db2gse.spatial_index (<grid level 1>, [grid level 2], [grid level 3])
所添加的 USING 子句可区分空间索引和 B 树索引。由于该语句并不遵循当前的函数路径,因此 db2gse 方案的名称必须限定 spatial_index 的扩展名。
由于 B 树用于为其建立索引的数据的简单特性,数据库设计者仅指示 DB2 为一个或多个表列建立索引。但是,由于空间数据很复杂,所以要求设计者了解 DB2 的相对大小分布。设计者必须决定该空间索引格网等级的最佳大小和数量。
格网等级([格网等级 1]、[格网等级 2] 和 [格网等级 3])按不断增加的像元大小进行输入。因此,等级二的像元大小必须大于等级一,等级三的像元大小则必须大于等级二。格网等级一是必需的,但可通过设置零值 (0) 来禁用等级二和等级三。
Spatial Extender 如何生成空间索引
DB2 Spatial Extender 按以下方式构建空间索引:
- Spatial Extender 从等级一开始将每个几何的包络矩形与格网相交。
- 如果几何的包络矩形与格网等级一之间的交点少于四个,则 Spatial Extender 将在空间索引中输入该几何 ID 和相交格网像元 ID,并继续处理下一几何。
- 如果 Spatial Extender 检测到四个以上交点,则会将该几何与格网等级二相交。如果尚未启用格网等级二,则 Spatial Extender 将在空间索引中输入该几何 ID 和格网像元 ID,并继续处理下一几何。
- 如果几何的包络矩形与格网等级二之间的交点少于四个,则 Spatial Extender 将在空间索引中输入该几何 ID 和相交格网像元 ID,并继续处理下一几何。
- 如果 Spatial Extender 检测到四个以上交点,则会将该几何与格网等级三相交。如果尚未启用格网等级三,则 Spatial Extender 将在空间索引中输入该几何 ID 和格网像元 ID,并继续处理下一几何。
- Spatial Extender 将在空间索引中输入几何 ID 和相交格网像元 ID,并继续处理下一几何。
实际上,Spatial Extender 不会创建任何种类的面格网结构。通过将原点定义为列的空间参考系统(此空间参考系统延伸到正坐标空间)的 x,y 偏移,Spatial Extender 可通过参数显示每个格网等级。通过参数格网,Spatial Extender 可从数学上生成交点。
Spatial Extender 如何使用空间索引
Spatial Extender 使用空间索引来提升空间查询的性能。方框查询 - 最基本、可能也是最受欢迎的空间查询 - 返回与用户定义框相交的空间列的几何。如果不存在空间索引,Spatial Extender 必须使用方框来比较空间列的所有几何。
通过空间索引,Spatial Extender 可识别与方框相交的索引格网输入。由于空间索引在格网上是按顺序排列的,因此 Spatial Extender 可快速获得备选几何的列表。此过程称为第一次传递。
第二次传递仔细检查备选几何列表,并排除包络矩形不与方框相交的所有几何。
第三次传递将备选几何的实际坐标与方框的实际坐标相比较,以确定该几何是否与方框相交。前两次传递大大简化了对表行子集进行比较操作这一最后的复杂过程。
除了 EnvelopesIntersect 函数只执行前两次传递外,所有空间查询都要执行三次传递。EnvelopesIntersect 函数专用于使用显示驱动程序裁剪例程且不需要第三次传递的间隔长度的显示操作。
最佳格网像元大小
由于形状不规则的几何的包络矩形不完全适合格网像元,因此格网像元大小的选择非常复杂。由于这种不规则性,有些几何包络矩形与几个格网相交,而其他的则适合单一的格网像元。相反,格网像元可能会与几个几何包络矩形相交,这取决于数据的空间分布。
当启用正确的等级数并且格网像元大小适合数据时,空间索引可很好地执行。要简化这一讨论过程,首先要考虑包含具有统一大小的几何的空间列。在这种情况下,由于单个格网等级将会足够,则不必创建多个等级的空间索引。使用单一格网等级创建格网像元大小为平均几何包络矩形大小 1.5 倍的空间索引。
由于点数据的包络矩形非常小,所以格网大小也会很小。
通常,格网大小应为典型查询窗口大小的十分之一左右。对于点数据,仅需要单一格网等级。
在测试应用程序时,您可能发现所使用的格网像元大小越大执行起来便会越好,这是因为每个格网像元引用的几何越多,启用等级一传递来放弃无限制几何的速度便越快。但是,如果继续增加格网像元大小,则由第二次传递筛选的几何数量便会增加,从而使执行效果变差。
DB2 Spatial Extender 提供了 Index Advisor,该工具可用于创建模拟格网索引,并调整该索引使之放入真正索引的模型中。它也可用于确定是保留还是替代现有的格网索引。
以下是有关如何使用 Index Advisor 返回现有格网索引的相关详细信息的示例。在本例中,格网索引的完全限定名称为 mydb.myindex:
gseidx connect to mydb user test using test get geometry statistics for index mydb.myindex detail
当可选 –g 选项不存在时,shp2sde 和 cov2sde 使用类似的算法来计算格网大小等级 1 的默认空间索引。格网大小等级 2 和等级 3 的默认值始终设置为“零”,其中 shp2sde 基于 shapefile 的范围,而 cov2sde 则基于 coverage 的范围。有关使用 shp2sde 或 cov2sde 命令的详细信息,请参阅随 ArcSDE 提供的《ArcSDE 管理命令参考》。
选择等级数
几乎没有空间列包含具有相同的相对大小的几何。但是,大多数空间列的几何都可被分成若干个大小间隔。例如,考虑国家宗地的一个空间列,其中包含大量聚集在城市区域的小宗地,而这些城市区域又由一些大的乡村宗地围绕。这些情况非常常见,且需要使用多个等级的空间索引。要选择各等级的格网像元大小,请确定几何包络矩形大小的间隔。使用略大于每个间隔的格网等级的像元大小创建空间索引。通过执行对使用应用程序的空间列的查询来测试索引。尝试略微调大或调小格网大小,以确定性能是否可获得显著提升。
有关本主题的详细信息,请参阅 IBM《DB2 Spatial Extender 用户指南和参考》中的第 11 章“使用索引和视图访问空间数据”。