Crear un índice clúster

Se aplica a:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Puede crear índices agrupados en tablas mediante SQL Server Management Studio o mediante Transact-SQL. Con pocas excepciones, todas las tablas deben tener un índice clúster. Además de mejorar el rendimiento de las consultas, un índice clúster se puede recompilar o reorganizar a petición para controlar la fragmentación de las tablas. También se puede crear un índice clúster en una vista. (Los índices clúster se definen en el artículo Índices clúster y no clúster.)

Implementaciones típicas

Los clúster se implementan de las formas siguientes:

  • Restricciones PRIMARY KEY y UNIQUE

    Cuando se crea una restricción PRIMARY KEY, se crea automáticamente un índice clúster único en la columna o las columnas si aún no existe un índice clúster en la tabla y no se especifica un índice no clúster único. La columna de clave principal no puede permitir valores NULL.

    Cuando cree una restricción UNIQUE, se creará un índice no clúster único para exigir una restricción UNIQUE de forma predeterminada. Puede especificarse un índice clúster único si todavía no existe un índice clúster en la tabla.

    Un índice creado como parte de la restricción recibe automáticamente el mismo nombre que la restricción. Para obtener más información, consulte Restricciones entre claves principales y claves externas y Restricciones UNIQUE y CHECK.

  • Índice independiente de una restricción

    Puede crear un índice clúster en una columna que no sea la de clave principal si se especificó una restricción de clave principal no agrupada.

Limitaciones

  • Cuando se crea una estructura de índice clúster, se requiere espacio en disco para ambas estructuras, la antigua (origen) y la nueva (destino), en los archivos y grupos de archivos correspondientes. La antigua estructura no se desasignará hasta que se confirme la transacción completa. Podría ser que también se necesite espacio en disco temporal para ordenar. Para más información, consulte Disk Space Requirements for Index DDL Operations.

  • Si se crea un índice clúster en un montón con varios índices no clúster existentes, se deben volver a generar todos los índices no clúster de manera que contengan el valor de clave de agrupación en clústeres en lugar del identificador de fila (RID). De forma similar, si se excluye un índice clúster de una tabla con varios índices no clúster, se vuelven a generar todos los índices no clúster como parte de la operación DROP. Si las tablas son de gran tamaño, el proceso podría prolongarse significativamente.

    La mejor manera de generar índices en tablas de gran tamaño es empezar con el índice clúster y, a continuación, generar los índices no clúster. Considere la posibilidad de establecer la opción ONLINE en ON al crear índices en tablas existentes. Cuando se establece en ON, no se mantienen los bloqueos de tabla de larga duración. Así se habilita la continuación de consultas o actualizaciones de la tabla subyacente. Para más información, consulte Perform Index Operations Online.

  • La clave de índice de un índice agrupado no puede contener columnas varchar con datos existentes en la unidad de asignación ROW_OVERFLOW_DATA. Si se crea un índice agrupado en una columna varchar y los datos existentes están en la unidad de asignación IN_ROW_DATA, no se realizarán correctamente las siguientes acciones de inserción o actualización en la columna que intenten insertar los datos de manera no consecutiva. Para obtener información sobre las tablas que pueden contener datos de desbordamiento de fila, use la función de administración dinámica sys.dm_db_index_physical_stats (Transact-SQL).

Permisos

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

Uso de SQL Server Management Studio

Crear un índice clúster desde el Explorador de objetos

  1. En el Explorador de objetos, expanda la tabla en la que desea crear un índice clúster.

  2. Haga clic con el botón derecho en la carpeta Índices, seleccione Nuevo índice y, luego, Índice no agrupado....

  3. En el cuadro de diálogo Nuevo índice , en la página General , escriba el nombre del nuevo índice en el cuadro Nombre de índice .

  4. En Columnas de clave de índice, seleccione Agregar....

  5. En el cuadro de diálogo Seleccionar columnas detable_name , active la casilla de la columna de tabla que se va a agregar al índice agrupado.

  6. Seleccione Aceptar.

  7. En el cuadro de diálogo Nuevo índice, haz clic en Aceptar.

Crear un índice clúster mediante el Diseñador de tablas

  1. En el Explorador de objetos, expanda la base de datos en la que desea crear una tabla con un índice clúster.

  2. Haga clic con el botón derecho en la carpeta Tablas y, luego, seleccione Nueva tabla....

  3. Cree una tabla nueva como lo haría normalmente. Para obtener más información, vea Crear tablas (motor de base de datos).

  4. Haga clic con el botón derecho en la nueva tabla creada anteriormente y, luego, seleccione Diseño.

  5. En el menú Diseñador de tablas , seleccione Índices o claves.

  6. En el cuadro de diálogo Índices o claves, seleccione Agregar.

  7. Seleccione el nuevo índice en el cuadro de texto Clave principal o única, o índice seleccionado .

  8. En la cuadrícula, seleccione Crear como CLUSTEREDy seleccione en la lista desplegable que aparece a la derecha de la propiedad.

  9. Seleccione Close (Cerrar).

  10. En el menú Archivo , seleccione Guardarnombre_tabla.

Uso de Transact-SQL

  1. En el Explorador de objetos, conéctese a una instancia del Motor de base de datos.

  2. En la barra Estándar, seleccione Nueva consulta.

  3. Copie y pegue el ejemplo siguiente en la ventana de consulta y seleccione Ejecutar.

    USE AdventureWorks2022;
    GO
    
    -- Create a new table with three columns.
    CREATE TABLE dbo.TestTable (
        TestCol1 INT NOT NULL,
        TestCol2 NCHAR(10) NULL,
        TestCol3 NVARCHAR(50) NULL
    );
    GO
    
    -- Create a clustered index called IX_TestTable_TestCol1
    -- on the dbo.TestTable table using the TestCol1 column.
    CREATE CLUSTERED INDEX IX_TestTable_TestCol1 ON dbo.TestTable (TestCol1);
    GO
    

Para más información, consulte CREATE INDEX (Transact-SQL).