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 <objeto> ( 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 sólo se puede crear 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 estar ON para la sesión actual. Esta es 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 tales 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 de í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 llenan 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, 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 no es nunca inferior a dos, independientemente de lo bajo que sea el valor de fillfactor.

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

    Nota

    Los valores de fill factor 0 y 100 son idénticos.

    La configuración de FILLFACTOR solo se aplica cuando se crea o se vuelve a generar el índice. Motor de base de datos no mantiene dinámicamente el porcentaje especificado de espacio disponible de las páginas. Para ver la configuración de fill factor, 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 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 orden 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 se vuelven a calcular las estadísticas de distribución. El valor predeterminado es OFF.

    • ON
      Las estadísticas obsoletas no se vuelven a calcular 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 de 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, la definición se puede modificar. Por ejemplo, puede especificar columnas, criterio de ordenación, esquema de particionamiento 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 evita que todos los usuarios tengan acceso a la tabla subyacente durante 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 permiten bloqueos de fila. El valor predeterminado es ON.

    • ON
      Los bloqueos de fila se admiten al obtener acceso al índice. Motor de base de datos determina cuándo se utilizan los bloqueos de fila.

    • OFF
      Los bloqueos de fila no se utilizan.

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

    • ON
      Los bloqueos de página se permiten al obtener acceso al índice. 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 grado máximo de paralelismo durante la operación de índice. Utilice MAXDOP para establecer un límite para el número de procesadores utilizados en la ejecución de un plan paralelo. El máximo es de 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 paralelo al número especificado o a un número inferior, en función de la actual carga de trabajo 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.

Comentarios

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 | "valor predeterminado" } ]

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

El usuario debe tener el permiso ALTER en la tabla o vista, o ser miembro del rol fijo de servidor sysadmin o de los roles fijos de base de datos db_ddladmin y db_owner.

Ejemplos

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

En el ejemplo siguiente se crea una tabla denominada SpatialTable que contiene una columna de tipo geometry denominada geometry_col. A continuación, se 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

En el ejemplo siguiente se 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

En el ejemplo siguiente se crea una tabla denominada SpatialTable2 que contiene una columna de tipo geography denominada geography_col. A continuación, se 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

En el ejemplo siguiente se 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 ) );