Dado que se ha añadido soporte para datos espaciales, también se ha dotado de un tipo extendido de índices para mejorar las consultas contra columnas que albergan información de este tipo.

Los índices espaciales cubren tanto datos en espacio plano (geometry), como datos en un espacio euclídeo (geography). En el caso de que el índice se realice sobre una columna de tipo geography, el índice va a realizar una conversión del espacio euclídeo a un espacio de 2D de la forma en la que se explica más adelante.

Solo se podrán generar índices en el caso de que la tabla que alberga la columna a indexar posea una clave primaria. Además, se pueden realizar cuantos índices se quiera sobre una misma columna espacial (mas adelante veremos el por qué podemos necesitar hacer esto).

Descomposición del espacio indexado en una jerarquía de rejilla

En SQL Server 2008, los índices de tipos de datos espaciales se implementan como árboles B, lo cual quiere decir que se han de descomponer los datos de 2D siguiendo este esquema.

Cuando creamos un índice sobre una columna espacial, SQL Server 2008 se encarga de realizar esa descomposición, siguiendo una jerarquía de 4 niveles en rejilla. Cada rejilla del nivel superior, contiene otra rejilla del mismo nº de celdas que él mismo (hasta la última, donde se encuentran los datos). La siguiente imagen ilustra la estructura mencionada.

NOTA: Es totalmente independiente de la unidad de medida con la que se trabaje ( m,km,…)

Primero, las celdas de cada nivel se numeran siguiendo el algoritmo «Hilvert space-filling curve» (http://en.wikipedia.org/wiki/Hilbert_curve), que funciona de la siguiente manera:

 

La densidad de las rejillas de cada nivel, puede especificarse a la hora de definir el índice utilizando la sentencia CREATE SPATIAL INDEX. La siguiente tabla, nos muestra las posibilidades de densidad que se ofrecen:

Keyword

Grid configuration

Number of cells

LOW

4X4

16

MEDIUM

8X8

64

HIGH

16X16

256

NOTA: Por defecto se utiliza la densidad 8×8

Tessellation

Es el proceso que se aplica a cada uno de los elementos almacenados en una columna geometry o geography. Después de la descomposición de un espacio indexado, en la rejilla jerárquica que hemos visto , se toma fila a fila la columna espacial y se asocia cada parte del objeto a una rejilla dentro del espacio indexado, comenzando por el nivel 1 y afinando en cada nivel hasta el último. Este proceso sigue las reglas: Regla de cubrimiento, regla de celdas por objeto y regla de la celda más profunda

Regla de cubrimiento

Si el objeto cubre completamente una celda ( como podemos ver en la figura en su nivel 2 ), se marca dicha celda como «cubierta» y no se baja al siguiente nivel.

 

Regla de celdas por objeto

Podemos marcar un límite de recursividad, de forma que podamos indicar que se siga el proceso de clasificación en celdas , mientras el objeto no supere el nº de celdas marcado. Esa limitación se puede hacer también mediante CREATE SPATIAL INDEX

Regla de la celda más profunda

Cada celda, pertenece a una celda de nivel superior. Como podemos ver en la figura, la celda 4.4.14.2 (nivel 4), pertenece a la 4.4.14 (nivel 3), que pertenece a la 4.4 (nivel 2) , que pertenece a la 4 (nivel 1)

NOTA: En el índice, solo se almacena información, del último nivel.

Beneficios de los índices espaciales

Al margen de los evidentes beneficios de la indexación en materia de búsqueda y actualización, los índices espaciales también soportan bajo algunas circunstancias, métodos geométricos y geográficos (siempre que los datos utilicen el mismo SRID)

Los índices geométricos, soportan los siguientes métodos: STContains(), STDistance(), STEquals(), STIntersects(), STOverlaps(), STTouches() y STWithin()

Su funcionamiento es el siguiente:

geometry1.STMethod(geometry2) operador_comparacion valor

Los índices geography , soportan los siguientes métodos: STIntersects(), STEquals(), and STDistance() y su funcionamiento es idéntico al de geometry.

 

Tipos de indexación espacial

Existen dos formas de realizar la indexación espacial. Según un esquema geometry y según un esquema geography, que se corresponden con los esquemas a aplicar en sus tipos de datos geometry y geography respectivos.

Pese a que se soporta que explícitamente se asigne un esquema a utilizar en la sintaxis CREATE SPATIAL INDEX, si no es el adecuado el esquema que le asignamos, se lanza una excepción.

Definición del índice geométrico

Pese a que los datos espaciales pueden ocupar un espacio infinito, los índices han de indexar espacios finitos.

En la siguiente ilustración, se ve como uno de los elementos no está totalmente cubierto por el índice. Esto es porque el índice se ha definido sobre un espacio que no pertenece en su totalidad con la figura A. Las coordenadas (x-min,y-min) y (x-max,y-max) se especifican durante la creación del índice espacial.

El espacio exterior al definido por el índice, se trata como una celda única numerada como 0. De esta forma, la figura A, pertenecerá a las celdas 0, 9 y 5 (siguiendo la numeración simple de ilustraciones anteriores) , de las cuales solo las 9 y 5 sufrirán el proceso de subdivisión en niveles.

Solo aquellos objetos que están totalmente cubiertos por el índice se beneficiaran de los índices espaciales, por lo que es de vital importancia que el índice cubra cuantos más objetos mejor.

 

Tessellation en rejillas geography

Este esquema se aplica en forma predeterminada a las columnas de tipo geography y consiste en la transformación del espacio geodésico a un espacio plano, para que pueda ser descompuesto en rejillas como hemos visto anteriormente.

Las siguientes figuras ilustran el proceso sufrido.

 

 

Enrique Catalá