SQL Server 2008 空间数据库 --- 空间索引概念及创建(取自帮助) (一)

2014-11-24 14:48:16 · 作者: · 浏览: 1

SQL Server 2008 引入了对空间数据和空间索引的支持。“空间索引”是一种扩展索引,允许您对空间列编制索引。空间列是包含空间数据类型(如 geometrygeography)数据的表列。本节中的主题介绍了空间索引。

SQL Server 2008 及更高版本支持空间数据。这包括对平面空间数据类型 geometry 的支持,该数据类型支持欧几里得坐标系统中的几何数据(点、线和多边形)。geography 数据类型表示地球表面某区域上的地理对象,如一片陆地。geography 列的空间索引会将地理数据映射到二维非欧几里得空间。

空间索引是对包含空间数据的表列(“空间列”)定义的。每个空间索引指向一个有限空间。例如,geometry 列的索引指向平面上用户指定的矩形区域。

在 SQL Server 2008 中,空间索引使用 B 树构建而成,也就是说,这些索引必须按 B 树的线性顺序表示二维空间数据。因此,将数据读入空间索引之前,SQL Server 2008 先实现对空间的分层均匀分解。索引创建过程会将空间分解成一个四级“网格层次结构”。这些级别指的是“第 1 级”(顶级)、“第 2 级”、“第 3 级”和“第 4 级”。

每个后续级别都会进一步分解其上一级,因此上一级别的每个单元都包含下一级别的整个网格。在给定级别上,所有网格沿两个轴都有相同数目的单元(例如 4x4 或 8x8),并且单元的大小都相同。

下图显示了网格层次结构每个级别的右上角单元被分解成 4x4 网格的情况。事实上,所有单元都是以这种方式分解的。因此,以此为例,将一个空间分解成四个级别的 4x4 网格实际上会总共产生 65,536 个第四级单元。

untitled

针对空间索引进行的空间分解与应用程序数据使用的度量单位无关。

网格层次结构的单元是利用多种 Hilbert 空间填充曲线以线性方式编号的。然而,出于演示目的,这里使用的是简单的按行编号,而不是由 Hilbert 曲线实际产生的编号。在下图中,几个表示建筑物的多边形和表示街道的线已经放进了一个 4x4 的 1 级网格中。第 1 级单元的编号为 1 到 16,编号从左上角的单元开始。

untitle22d

沿网格轴的单元数目确定了网格的“密度”:单元数目越大,网格的密度越大。例如,8x8 网格(产生 64 个单元)的密度就大于 4x4 网格(产生 16 个单元)的密度。网格密度是以每个级别为基础定义的。

网格配置 单元数目

低 4X4 16

中 8X8 64

高 16X16 256

默认设置所有级别都为

您可以通过指定非默认的网格密度控制分解过程。例如,在不同级别指定不同网格密度对于基于索引空间的大小和空间列中的对象来优化索引可能非常有用。

空间索引的网格密度显示在 sys.spatial_index_tessellations 目录视图的 level_1_grid、level_2_grid、level_3_grid 和 level_4_grid 列中。

将索引空间分解成网格层次结构后,空间索引将逐行读取空间列中的数据。读取空间对象(或实例)的数据后,空间索引将为该对象执行“分割过程”。分割过程通过将对象与其接触的网格单元集(“接触单元”)相关联使该对象适合网格层次结构。从网格层次结构的第 1 级开始,分割过程以“广度优先”方式对整个级别进行处理。在可能的情况下,此过程可以连续处理所有四个级别,一次处理一个级别。

分隔规则

分割过程的输出为对象的空间索引中所记录的接触单元集。通过引用这些已记录单元,空间索引可以确定该对象在空间中相对于空间列中也存储在索引中的其他对象的位置。

为了限制为对象记录的接触单元数,分割过程采用了几个分割规则。这些规则确定分割过程的深度以及在索引中记录哪些接触单元。

这些规则如下:

  • 覆盖规则
    如果一个对象完全盖住了某个单元,则称该单元由该对象所“覆盖”。被覆盖的单元会参与计数,但不进行分割。此规则应用于网格层次结构的所有级别。覆盖规则简化了分割过程,并减少了空间索引记录的数据量。
  • 每对象单元数规则
    此规则强制执行“每对象单元数限制”,这将确定可以为每个对象计数的最大单元数(第 1 级除外)。在较低级别,每对象单元数规则会控制可以记录的有关对象的信息量。
  • 最深单元规则
    最深单元规则通过只记录已为对象分割的最底部单元来生成该对象的最近似对象。父单元不计入每对象单元数,这些单元不记录在索引中。

这些分割规则依次逐步应用于每个网格级别。此部分的其余内容更详细地介绍了这些分割规则

覆盖规则

如果一个对象完全盖住了某个单元,则称该单元由该对象所“覆盖”。例如,在下图中,一个第 2 级单元 15.11 完全由八边形的中间部分所覆盖。

clip_image001

被覆盖的单元会参与计数并记录在索引中,但不再进行分割。

每对象单元数规则

每个对象的分割程度主要取决于空间索引的“每对象单元数限制”。此限制确定了对于每个对象分割可以计数的最大单元数。然而,请注意,每对象单元数规则不对第 1 级强制执行,因此可能超出此限制。如果第 1 级计数达到(或超出)每对象单元数限制,则在较低级别不再进行分割。

只要计数低于每对象单元数限制,分割过程就将继续。从编号最低的接触单元(例如上图中的单元 15.6)开始,此过程将测试每个单元以评估是对其进行计数还是进行分割。如果分割某单元将超出每对象单元数限制,将对该单元进行计数而不进行分割。否则,将对该单元进行分割,而对由对象接触的较低级别的单元进行计数。分割过程将以这种方式在整个级别的广度范围内继续进行。此过程对低级别网格的分割单元依次逐步进行重复,直至达到限制或不再有要计数的单元为止。

例如,上图显示了一个完全适合第 1 级网格的单元 15 的八边形。在此图中,单元 15 已进行分割,将八边形分成了九个二级单元。此图假定每对象单元数限制为 9 或更大。然而,如果每对象单元数限制为 8 或更小,则单元 15 将不进行分割,而只为该对象对单元 15 进行计数。

默认情况下,每对象单元数限制为每个对象 16 个单元,这将在大多数空间索引的空间和精度之间提供一个令人满意的折中方案。然而,CREATE SPATIAL INDEX Transact-SQL 语句支持 CELLS_PER_OBJECT=n 子句,使用该子句可以指定介于 1 和 8192(包含这两者)之间的每对象单元数限制。

clip_image002注意:

空间索引的 cells_per_object 设置显示在 sys.spatial_index_tessellations 目录视图中。

最深单元规则

最深单元规则利用每个较低级别单元属于其上级单元这一事实:第 4 级单元属于第 3 级单元,第 3 级单元属于第 2 级单元,第 2 级单元属于第 1 级单元。例如,属于单元 1.1.1.1 的对象也属于单元 1.1.1、单元 1.1 以及单元 1。这种单元层次结构关系知识已内置于查询处理器中。因此,只有最深级别的单元需要记录在索引中,从而最大限度地减少了索引需要存储的信息。

在下图中,相对较小的菱形多边形被分割。索引使用默认的每对象单元数限制 16,此对象较小,未达到该限制。因此,分割一直下至第 4 级。此多边形驻留在以下的第 1 级到第 3 级的单元中:4、4.4 以及 4.4.10 和 4.4.14。然而,使用最深单元规则,分割将仅对十二个位于第 4 级的单元进行计数:4.4.10.13-15 以及 4.4.14.1-3、4.4.14.5-7 和 4.4.