CREATE SPATIAL INDEX (Transact-SQL)

Crea un índice espacial en la tabla y la columna especificadas. Se puede crear un índice antes de que la tabla posea datos. Los índices se pueden crear en tablas o vistas de otra base de datos especificando un nombre completo de base de datos.

[!NOTA]

Para obtener información acerca de los índices espaciales, vea Información general sobre los índices espaciales.

Icono de vínculo a temasConvenciones de sintaxis de Transact-SQL

Sintaxis

Create Spatial Index 
CREATE SPATIAL INDEX index_name 
  ON <object> ( spatial_column_name )
    {
       [ USING <geometry_grid_tessellation> ]
          WITH ( <bounding_box> 
                [ [,] <tesselation_parameters> [ ,...n ] ] 
                [ [,] <spatial_index_option> [ ,...n ] ] ) 
     | [ USING <geography_grid_tessellation> ] 
          [ WITH ( [ <tesselation_parameters> [ ,...n ] ]
                   [ [,] <spatial_index_option> [ ,...n ] ] ) ]
    } 
  [ ON { filegroup_name | "default" } ]
; 

<object> ::=
    [ database_name. [ schema_name ] . | schema_name. ] 
                table_name

<geometry_grid_tessellation> ::=
{ GEOMETRY_GRID }
  
<bounding_box> ::=
BOUNDING_BOX = ( {
        xmin, ymin, xmax, ymax 
   | <named_bb_coordinate>, <named_bb_coordinate>, <named_bb_coordinate>, <named_bb_coordinate> 
  } )

<named_bb_coordinate> ::= { XMIN = xmin | YMIN = ymin | XMAX = xmax | YMAX=ymax }

<tesselation_parameters> ::=
{ 
    GRIDS = ( { <grid_density> [ ,...n ] | <density>, <density>, <density>, <density>  } ) 
  | CELLS_PER_OBJECT = n 
}

<grid_density> ::=
{
     LEVEL_1 = <density> 
  |  LEVEL_2 = <density> 
  |  LEVEL_3 = <density> 
  |  LEVEL_4 = <density> 
}

<density> ::= { LOW | MEDIUM | HIGH }

<geography_grid_tessellation> ::= 
{ GEOGRAPHY_GRID }
  
<spatial_index_option> ::=
{
    PAD_INDEX = { ON | OFF }
  | FILLFACTOR = fillfactor
  | SORT_IN_TEMPDB = { ON | OFF }
  | IGNORE_DUP_KEY = OFF
  | STATISTICS_NORECOMPUTE = { ON | OFF }
  | DROP_EXISTING = { ON | OFF }
  | ONLINE = OFF
  | ALLOW_ROW_LOCKS = { ON | OFF }
  | ALLOW_PAGE_LOCKS = { ON | OFF }
  | MAXDOP = max_degree_of_parallelism
}

Argumentos

  • index_name
    Es el nombre del índice. Los nombres de índice deben ser únicos en una tabla, pero no es necesario que sean únicos en una base de datos. Los nombres de índice deben seguir las reglas de los identificadores.

  • ON <object> ( spatial_column_name )
    Especifica el objeto (base de datos, esquema o tabla) en el que va a crearse el índice y el nombre de columna espacial.

    spatial_column_name especifica la columna espacial en la que se basa el índice. Solamente puede especificarse una columna espacial en una definición de índice espacial único; sin embargo, pueden crearse varios índices espaciales en una columna de tipo geometry o geography.

  • USING
    Indica el esquema de teselación del índice espacial. Este parámetro toma como valor predeterminado el valor específico del tipo, tal y como se indica a continuación:

    Tipo de datos de la columna

    Esquema de teselación

    geometry

    GEOMETRY_GRID

    geography

    GEOGRAPHY_GRID

    Un índice espacial solamente puede crearse en una columna de tipo geometry o geography. En caso contrario, se produce un error. También se produce un error si se pasa un parámetro no válido para un tipo determinado.

    [!NOTA]

    Para obtener información acerca del modo en que SQL Server implementa la teselación, vea Información general sobre los índices espaciales.

  • ON filegroup_name
    Crea el índice especificado en el grupo de archivos especificado. Si no se especifica ninguna ubicación y la tabla no tiene particiones, el índice utiliza el mismo grupo de archivos que la tabla subyacente. El grupo de archivos debe existir previamente.

  • ON "default**"**
    Crea el índice especificado en el grupo de archivos predeterminado.

    El término predeterminado (default), en este contexto, no es una palabra clave. Es un identificador para el grupo de archivos predeterminado y debe delimitarse, como en ON"default" o en ON [default]. Si se especifica "default", la opción QUOTED_IDENTIFIER debe establecerse en ON en la sesión actual. Se trata de la configuración predeterminada. Para obtener más información, vea SET QUOTED_IDENTIFIER (Transact-SQL).

<object>::=

Es el objeto completo o no completo que va a indizarse.

  • database_name
    Es el nombre de la base de datos.

  • schema_name
    Es el nombre del esquema al que pertenece la tabla.

  • table_name
    Es el nombre de la tabla que va a indizarse.

Opciones de WITH

  • GEOMETRY_GRID
    Especifica el esquema de teselación de cuadrícula de geometría que se está utilizando. GEOMETRY_GRID solamente puede especificarse en una columna del tipo de datos geometry. Se trata del valor predeterminado para este tipo de datos y no es necesario especificarlo.

  • GEOGRAPHY_GRID
    Especifica el esquema de teselación de cuadrícula de geografía. GEOGRAPHY_GRID solamente puede especificarse en una columna del tipo de datos geography. Se trata del valor predeterminado para este tipo de datos y no es necesario especificarlo.

  • BOUNDING_BOX
    Especifica una tupla numérica de cuatro elementos que define las cuatro coordenadas del cuadro de límite: las coordenadas X mínima e Y mínima de la esquina inferior izquierda y las coordenadas X máxima e Y máxima de la esquina superior derecha.

    • xmin
      Especifica la coordenada X de la esquina inferior izquierda del cuadro de límite.

    • ymin
      Especifica la coordenada Y de la esquina inferior izquierda del cuadro de límite.

    • xmax
      Especifica la coordenada X de la esquina superior derecha del cuadro de límite.

    • ymax
      Especifica la coordenada Y de la esquina superior derecha del cuadro de límite.

    • XMIN = xmin
      Especifica el nombre y el valor de la propiedad para la coordenada X de la esquina inferior izquierda del cuadro de límite.

    • YMIN = ymin
      Especifica el nombre y el valor de la propiedad para la coordenada Y de la esquina inferior izquierda del cuadro de límite.

    • XMAX = xmax
      Especifica el nombre y el valor de la propiedad para la coordenada X de la esquina superior derecha del cuadro de límite.

    • YMAX = ymax
      Especifica el nombre y el valor de la propiedad para la coordenada Y de la esquina superior derecha del cuadro de límite.

    Las coordenadas del cuadro de límite solamente se aplican dentro de una cláusula USING GEOMETRY_GRID.

    xmax debe ser mayor que xmin e ymax debe ser mayor que ymin. Puede especificar cualquier representación de valor flotante válida suponiendo que xmax > xmin y que ymax > ymin. De lo contrario, se producen los errores correspondientes.

    No hay valores predeterminados.

    En los nombres de las propiedades del cuadro de límite no se distinguen mayúsculas de minúsculas, independientemente de la intercalación de la base de datos.

    Cada nombre de propiedad debe especificarse una sola vez. Pueden especificarse en cualquier orden. Por ejemplo, las cláusulas siguientes son equivalentes:

    • BOUNDING_BOX = ( XMIN = xmin, YMIN = ymin, XMAX = xmax, YMAX = ymax )

    • BOUNDING_BOX = ( XMIN = xmin, XMAX = xmax, YMIN = ymin, YMAX = ymax )

  • GRIDS
    Define la densidad de la cuadrícula en cada nivel del esquema de teselación.

    [!NOTA]

    Para obtener información acerca de la teselación, vea Información general sobre los índices espaciales.

    GRIDS admite los parámetros siguientes:

    • LEVEL_1
      Especifica la cuadrícula del primer nivel (superior).

    • LEVEL_2
      Especifica la cuadrícula del segundo nivel.

    • LEVEL_3
      Especifica la cuadrícula del tercer nivel.

    • LEVEL_4
      Especifica la cuadrícula del cuarto nivel.

    • LOW
      Especifica la mínima densidad posible de la cuadrícula en un nivel determinado. LOW equivale a 16 celdas (una cuadrícula de 4x4).

    • MEDIUM
      Especifica la densidad media de la cuadrícula en un nivel determinado. MEDIUM equivale a 64 celdas (una cuadrícula de 8x8).

    • HIGH
      Especifica la máxima densidad posible de la cuadrícula en un nivel determinado. HIGH equivale a 256 celdas (una cuadrícula de 16x16).

    El uso de nombres para los niveles permite especificar los niveles en cualquier orden y omitirlos. Si utiliza el nombre para un nivel, debe utilizar el nombre para cualquier otro nivel que especifique. Si omite un nivel, su densidad adopta el valor predeterminado, MEDIUM.

    Si se especifica una densidad no válida, se produce un error.

  • CELLS_PER_OBJECT = n
    Especifica el número de celdas de teselación por objeto que puede utilizar el proceso de teselación para un objeto espacial único en el índice. n puede ser cualquier número entero comprendido entre 1 y 8192, ambos inclusive. El número predeterminado de celdas por objeto es 16. Si se pasa un número que no es válido o si el número supera el máximo de celdas para la teselación especificada, se produce un error.

    En el nivel superior, si un objeto abarca más celdas de las especificadas mediante n, la indización usa tantas celdas como sean necesarias para proporcionar una teselación de nivel superior completa. En estos casos, un objeto podría recibir más celdas de las especificadas. En este caso, el número máximo es la cantidad de celdas generadas por la cuadrícula de nivel superior, que depende de la densidad.

    La regla de teselación de celdas por objeto utiliza el valor CELLS_PER_OBJECT. Para obtener información acerca de las reglas de teselación, vea Información general sobre los índices espaciales.

  • PAD_INDEX = { ON | OFF }
    Especifica el relleno del índice. El valor predeterminado es OFF.

    • ON
      El porcentaje de espacio disponible especificado por fillfactor se aplica a las páginas de nivel intermedio del índice.

    • No se especifica OFF ni fillfactor.
      Las páginas de nivel intermedio se rellenan casi al máximo de su capacidad y dejan espacio suficiente para al menos una fila del tamaño máximo que puede tener el índice, considerando el conjunto de claves incluidas en las páginas de nivel intermedio.

    La opción PAD_INDEX solamente resulta útil si también se especifica FILLFACTOR, porque PAD_INDEX utiliza el mismo porcentaje especificado por FILLFACTOR. Si el porcentaje especificado para FILLFACTOR no es lo suficientemente grande como para admitir una fila, Database Engine (Motor de base de datos) invalida internamente el porcentaje para permitir el valor mínimo. El número de filas de una página de nivel intermedio del índice nunca es inferior a dos, independientemente de lo bajo que sea el valor de fillfactor.

  • FILLFACTOR = fillfactor
    Especifica un porcentaje que indica cuánto debe rellenar Database Engine (Motor de base de datos) el nivel hoja de cada página de índice cuando se crea o se vuelve a generar un índice. fillfactor debe ser un valor entero comprendido entre 1 y 100. El valor predeterminado es 0. Si fillfactor es 100 ó 0, Database Engine (Motor de base de datos) crea índices con las páginas hoja rellenas al máximo de su capacidad.

    [!NOTA]

    Los valores de factor de relleno (fillfactor) 0 y 100 son idénticos.

    La configuración de FILLFACTOR solamente se aplica cuando se crea o se vuelve a generar el índice. Database Engine (Motor de base de datos) no mantiene dinámicamente el porcentaje especificado de espacio disponible de las páginas. Para ver la configuración del factor de relleno (fillfactor), utilice la vista de catálogo sys.indexes.

    Nota importanteImportante

    La creación de un índice clúster con un valor de FILLFACTOR menor que 100 afecta a la cantidad de espacio de almacenamiento que ocupan los datos, porque Database Engine (Motor de base de datos) vuelve a distribuir los datos cuando crea el índice clúster.

    Para obtener más información, vea Factor de relleno.

  • SORT_IN_TEMPDB = { ON | OFF }
    Indica si los resultados de ordenación temporales deben almacenarse en tempdb. El valor predeterminado es OFF.

    • ON
      Los resultados de ordenación intermedios utilizados para generar el índice se almacenan en tempdb. Esto puede reducir el tiempo necesario para crear un índice si tempdb y la base de datos de usuarios están en conjuntos de discos distintos. Sin embargo, esto aumenta la cantidad de espacio en disco utilizado durante la creación del índice.

    • OFF
      Los resultados de ordenación intermedios se almacenan en la misma base de datos que el índice.

    Además del espacio necesario en la base de datos del usuario para crear el índice, tempdb debe tener la misma cantidad de espacio adicional para almacenar los resultados de orden intermedio. Para obtener más información, vea tempdb y la creación de índices.

  • IGNORE_DUP_KEY = OFF
    No tiene ningún efecto sobre los índices espaciales porque el tipo de índice nunca es único. No establezca esta opción en ON porque, de lo contrario, se producirá un error.

  • STATISTICS_NORECOMPUTE = { ON | OFF}
    Especifica si deben volver a calcularse las estadísticas de distribución. El valor predeterminado es OFF.

    • ON
      Las estadísticas obsoletas no vuelven a calcularse automáticamente.

    • OFF
      Se habilita la actualización automática de las estadísticas.

    Para restaurar la actualización automática de estadísticas, establezca STATISTICS_NORECOMPUTE en OFF o ejecute UPDATE STATISTICS sin la cláusula NORECOMPUTE.

    Nota importanteImportante

    Deshabilitar el cálculo automático de estadísticas de distribución puede impedir que el optimizador de consultas elija los planes de ejecución óptimos para las consultas relativas a la tabla.

  • DROP_EXISTING = { ON | OFF }
    Especifica que se quite y se vuelva a generar el índice espacial con nombre preexistente. El valor predeterminado es OFF.

    • ON
      El índice existente se quita y se vuelve a generar. El nombre de índice especificado debe ser el mismo que el de un índice actualmente existente; sin embargo, es posible modificar la definición de índice. Por ejemplo, puede especificar columnas, criterios de ordenación, esquemas de partición u opciones de índice diferentes.

    • OFF
      Se muestra un error si ya existe el nombre de índice especificado.

    El tipo de índice no puede cambiarse utilizando DROP_EXISTING.

  • ONLINE = OFF
    Especifica que las tablas subyacentes y los índices asociados no están disponibles para la realización de consultas y modificaciones de datos durante la operación del índice. En esta versión de SQL Server, no se admiten generaciones de índices en línea para los índices espaciales. Si esta opción se establece en ON para un índice espacial, se produce un error. Omita la opción ONLINE o establezca ONLINE en OFF.

    Una operación de índice sin conexión para crear, volver a crear o quitar un índice espacial adquiere un bloqueo de modificación del esquema (Sch-M) de la tabla. Esto impide el acceso de cualquier usuario a la tabla subyacente durante toda la operación.

    [!NOTA]

    Las operaciones de índices en línea únicamente están disponibles en las ediciones Enterprise, Developer y Evaluation de SQL Server.

  • ALLOW_ROW_LOCKS = { ON | OFF }
    Especifica si se admiten los bloqueos de fila. El valor predeterminado es ON.

    • ON
      Se admiten bloqueos de fila al obtener acceso al índice. Database Engine (Motor de base de datos) determina cuándo se utilizan los bloqueos de fila.

    • OFF
      No se utilizan bloqueos de fila.

  • ALLOW_PAGE_LOCKS = { ON | OFF }
    Especifica si se admiten los bloqueos de página. El valor predeterminado es ON.

    • ON
      Se admiten bloqueos de página al obtener acceso al índice. Database Engine (Motor de base de datos) determina el momento en que se utilizan bloqueos de página.

    • OFF
      No se utilizan bloqueos de página.

  • MAXDOP = max_degree_of_parallelism
    Invalida la opción de configuración max degree of parallelism (grado máximo de paralelismo) durante la operación de índice. Utilice MAXDOP para limitar el número de procesadores que se utilizan en la ejecución de planes paralelos. El máximo es 64 procesadores.

    Nota importanteImportante

    Aunque la opción MAXDOP se admite desde el punto de vista sintáctico, actualmente CREATE SPATIAL INDEX siempre utiliza un solo procesador.

    max_degree_of_parallelism puede ser:

    • 1
      Suprime la generación de planes paralelos.

    • >1
      Restringe el número máximo de procesadores utilizados en una operación de índice en paralelo al número especificado o a un número inferior, en función de la carga de trabajo actual del sistema.

    • 0 (predeterminado)
      Utiliza el número real de procesadores, o un número inferior, en función de la carga de trabajo actual del sistema.

    Para obtener más información, vea Configurar operaciones de índice en paralelo.

    [!NOTA]

    Las operaciones de índices en paralelo únicamente están disponibles en las ediciones Enterprise, Developer y Evaluation de SQL Server.

Notas

Para obtener una introducción a los índices espaciales de SQL Server, vea Información general sobre los índices espaciales.

Cada opción solamente puede especificarse una vez para cada instrucción CREATE SPATIAL INDEX. Si se especifica dos veces cualquier opción, se produce un error.

Puede crear un máximo de 249 índices espaciales en cada columna espacial de una tabla. Crear más de un índice espacial en una columna espacial concreta puede resultar útil, por ejemplo, para indizar parámetros de teselación diferentes en una única columna.

Nota importanteImportante

Existen otras restricciones para la creación de índices espaciales. Para obtener más información, vea Restricciones en los índices espaciales.

Una generación de índices no puede usar el paralelismo de procesos disponible.

Métodos que se admiten en los índices espaciales

Bajo ciertas condiciones, los índices espaciales admiten determinados métodos de geometría orientados a conjuntos. Para obtener más información, vea Métodos de Geometry que los índices espaciales admiten.

Los índices espaciales y la creación de particiones

De forma predeterminada, si se crea un índice espacial en una tabla con particiones, el índice se particiona según el esquema de partición de la tabla. Esto garantiza que los datos del índice y la fila relacionada se almacenen en la misma partición.

En este caso, para modificar el esquema de partición de la tabla base, habría que quitar el índice espacial antes de volver a particionar la tabla base. Para evitar esta restricción, puede especificar la opción "ON filegroup" durante la creación de un índice espacial. Para obtener más información, vea "Los índices espaciales y los grupos de archivos", más adelante en este tema.

Los índices espaciales y los grupos de archivos

De forma predeterminada los índices espaciales se particionan en los mismos grupos de archivos que la tabla en la que se especifica el índice. Esto puede invalidarse utilizando la especificación del grupo de archivos:

[ ON { filegroup_name | "default" } ]

Si especifica un grupo de archivos para un índice espacial, el índice se sitúa en ese grupo de archivos, independientemente del esquema de partición de la tabla.

Vistas de catálogo para los índices espaciales

Las vistas de catálogo siguientes son específicas de los índices espaciales:

Para obtener información acerca de la estructura de los metadatos de los índices espaciales, vea Tablas internas.

Notas adicionales sobre la creación de índices

Para obtener más información sobre la creación de índices, vea la sección "Notas" de CREATE INDEX (Transact-SQL).

Permisos

Requiere el permiso ALTER en la tabla o la vista. El usuario debe ser miembro de la función fija del servidor sysadmin o de las funciones de base de datos fijas db_ddladmin y db_owner.

Ejemplos

A. Crear un índice espacial en una columna de geometría

El ejemplo siguiente crea una tabla denominada SpatialTable que contiene una columna de tipo geometry denominada geometry_col. A continuación, crea un índice espacial, SIndx_SpatialTable_geometry_col1, en la columna geometry_col. El ejemplo utiliza el esquema de teselación predeterminado y especifica el cuadro de límite.

CREATE TABLE SpatialTable(id int primary key, geometry_col geometry);
CREATE SPATIAL INDEX SIndx_SpatialTable_geometry_col1 
   ON SpatialTable(geometry_col)
   WITH ( BOUNDING_BOX = ( 0, 0, 500, 200 ) );

B. Crear un índice espacial en una columna de geometría

El ejemplo siguiente crea un segundo índice espacial, SIndx_SpatialTable_geometry_col2, en la columna geometry_col de la tabla SpatialTable. El ejemplo especifica GEOMETRY_GRID como esquema de teselación. También especifica el cuadro de límite, densidades diferentes para los distintos niveles de la cuadrícula y 64 celdas por objeto. También establece el relleno del índice en ON.

CREATE SPATIAL INDEX SIndx_SpatialTable_geometry_col2
   ON SpatialTable(geometry_col)
   USING GEOMETRY_GRID
   WITH (
    BOUNDING_BOX = ( xmin=0, ymin=0, xmax=500, ymax=200 ),
    GRIDS = (LOW, LOW, MEDIUM, HIGH),
    CELLS_PER_OBJECT = 64,
    PAD_INDEX  = ON );

C. Crear un índice espacial en una columna de geometría

El ejemplo siguiente crea un tercer índice espacial, SIndx_SpatialTable_geometry_col3, en la columna geometry_col de la tabla SpatialTable. El ejemplo utiliza el esquema de teselación predeterminado. También especifica el cuadro de límite y utiliza densidades de celda diferentes en los niveles tercero y cuarto, y utiliza el número predeterminado de celdas por objeto.

CREATE SPATIAL INDEX SIndx_SpatialTable_geometry_col3
   ON SpatialTable(geometry_col)
   WITH (
    BOUNDING_BOX = ( 0, 0, 500, 200 ),
    GRIDS = ( LEVEL_4 = HIGH, LEVEL_3 = MEDIUM ) );

D. Cambiar una opción específica de los índices espaciales

El ejemplo siguiente vuelve a generar el índice espacial creado en el ejemplo anterior, SIndx_SpatialTable_geography_col3, especificando una nueva densidad LEVEL_3 con DROP_EXISTING = ON.

CREATE SPATIAL INDEX SIndx_SpatialTable_geography_col3
   ON SpatialTable(geography_col)
   WITH ( BOUNDING_BOX = ( 0, 0, 500, 200 ),
        GRIDS = ( LEVEL_3 = LOW ),
        DROP_EXISTING = ON );

E. Crear un índice espacial en una columna de geografía

El ejemplo siguiente crea una tabla denominada SpatialTable2 que contiene una columna de tipo geography denominada geography_col. A continuación, crea un índice espacial, SIndx_SpatialTable_geography_col1, en la columna geography_col. El ejemplo utiliza los valores predeterminados de los parámetros del esquema de teselación GEOGRAPHY_GRID.

CREATE TABLE SpatialTable2(id int primary key, object GEOGRAPHY);
CREATE SPATIAL INDEX SIndx_SpatialTable_geography_col1 
   ON SpatialTable2(object);

[!NOTA]

No es posible especificar un cuadro de límite para los índices de cuadrícula de geografía.

F. Crear un índice espacial en una columna de geografía

El ejemplo siguiente crea un segundo índice espacial, SIndx_SpatialTable_geography_col2, en la columna geography_col de la tabla SpatialTable2. El ejemplo especifica GEOGRAPHY_GRID como esquema de teselación. También especifica densidades de la cuadrícula diferentes para los distintos niveles y 64 celdas por objeto. También establece el relleno del índice en ON.

CREATE SPATIAL INDEX SIndx_SpatialTable_geography_col2
   ON SpatialTable2(object)
   USING GEOGRAPHY_GRID
   WITH (
    GRIDS = (MEDIUM, LOW, MEDIUM, HIGH ),
    CELLS_PER_OBJECT = 64,
    PAD_INDEX  = ON );

G. Crear un índice espacial en una columna de geografía

A continuación, el ejemplo crea un tercer índice espacial, SIndx_SpatialTable_geography_col3, en la columna geography_col de la tabla SpatialTable2. Utiliza el esquema de teselación predeterminado, GEOGRAPHY_GRID, y el valor predeterminado de CELLS_PER_OBJECT (16).

CREATE SPATIAL INDEX SIndx_SpatialTable_geography_col3
   ON SpatialTable2(object)
   WITH ( GRIDS = ( LEVEL_3 = HIGH, LEVEL_2 = HIGH ) );