Compartir a través de


Realización de operaciones de índice en línea

Se aplica a:SQL ServerAzure SQL DatabaseInstancia administrada de Azure SQLBase de datos SQL en Microsoft Fabric

En este artículo se describe cómo crear, recompilar o quitar índices en línea mediante SQL Server Management Studio o Transact-SQL. Gracias a la opción ONLINE, es posible que usuarios simultáneos obtengan acceso a los datos de la tabla subyacente o del índice clúster, así como a los índices no clúster asociados durante estas operaciones de índices. Por ejemplo, cuando un usuario vuelve a generar un índice clúster, dicho usuario y los demás pueden seguir actualizando los datos subyacentes y realizando consultas sobre los mismos.

Al realizar operaciones de lenguaje de definición de datos (DDL) sin conexión, como compilar o volver a generar un índice agrupado, estas operaciones contienen bloqueos exclusivos (X) en los datos subyacentes y los índices asociados. Es un modo de evitar modificaciones de los datos subyacentes y consultas sobre los mismos hasta que no finalice la operación de índice.

Note

Los comandos de recompilación de índices pueden contener bloqueos exclusivos en índices agrupados después de quitar una columna de objeto grande de una tabla, incluso cuando se realiza en línea.

La opción ONLINE está disponible en las siguientes instrucciones de Transact-SQL.

Para conocer las limitaciones y restricciones relativas a la creación, regeneración o eliminación de índices en línea, consulte Directrices para las operaciones de índice en línea.

Para usar operaciones de índice reanudables, se debe realizar una operación de índice en línea. Para obtener más información, consulte Consideraciones de índice reanudables.

Plataformas compatibles

Las operaciones de índices en línea no están disponibles en todas las ediciones de SQL Server. Para obtener más información, consulte Ediciones y características admitidas de SQL Server 2022.

Las operaciones de índice en línea están disponibles en Azure SQL Database y Azure SQL Managed Instance.

Permissions

Requiere permiso de ALTER en la tabla o vista.

Uso de SQL Server Management Studio

  1. En el Explorador de objetos, expanda la base de datos que contiene la tabla en la que desea recompilar un índice en línea.

  2. Expanda la carpeta Tablas .

  3. Extienda la tabla en la que desea reconstruir un índice en línea.

  4. Expanda la carpeta Índices .

  5. Use el menú contextual del índice que desea recompilar en línea y seleccione Propiedades.

  6. Debajo de Seleccionar una página, seleccione Opciones.

  7. Seleccione Permitir procesamiento DML en líneay, a continuación, seleccione True en la lista.

  8. Selecciona Aceptar.

  9. Use el menú contextual del índice que desea recompilar en línea y seleccione Recompilar.

  10. En el cuadro de diálogo Volver a generar índices, compruebe que el índice correcto se encuentra en la cuadrícula Índices que se volverán a generar y seleccione Aceptar.

Uso de Transact-SQL

En el ejemplo siguiente se vuelve a generar un índice en línea existente en la AdventureWorks base de datos de ejemplo.

ALTER INDEX AK_Employee_NationalIDNumber
    ON HumanResources.Employee
    REBUILD WITH (ONLINE = ON);

En el ejemplo siguiente se elimina un índice clúster en línea y se mueve la tabla resultante (montón) al grupo de archivos NewGroup mediante la cláusula MOVE TO . Las vistas de catálogo sys.indexes, sys.tablesy sys.filegroups se consultan para comprobar la ubicación del índice y la tabla en los grupos de archivos antes y después del desplazamiento.

-- Create a clustered index on the PRIMARY filegroup if the index does not exist.
IF NOT EXISTS (SELECT name FROM sys.indexes WHERE name = 
            N'AK_BillOfMaterials_ProductAssemblyID_ComponentID_StartDate')
    CREATE UNIQUE CLUSTERED INDEX
        AK_BillOfMaterials_ProductAssemblyID_ComponentID_StartDate 
    ON Production.BillOfMaterials (ProductAssemblyID, ComponentID, 
        StartDate)
    ON 'PRIMARY';
GO

-- Verify filegroup location of the clustered index.
SELECT t.name AS [Table Name], i.name AS [Index Name], i.type_desc,
    i.data_space_id, f.name AS [Filegroup Name]
FROM sys.indexes AS i
    JOIN sys.filegroups AS f ON i.data_space_id = f.data_space_id
    JOIN sys.tables as t ON i.object_id = t.object_id
        AND i.object_id = OBJECT_ID(N'Production.BillOfMaterials','U')
GO

-- Create filegroup NewGroup if it does not exist.
IF NOT EXISTS (SELECT name FROM sys.filegroups
                WHERE name = N'NewGroup')
    BEGIN
    ALTER DATABASE AdventureWorks2022
        ADD FILEGROUP NewGroup;
    ALTER DATABASE AdventureWorks2022
        ADD FILE (NAME = File1,
            FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\File1.ndf')
        TO FILEGROUP NewGroup;
    END
GO

-- Verify new filegroup
SELECT * from sys.filegroups;
GO

-- Drop the clustered index and move the BillOfMaterials table to
-- the Newgroup filegroup.
-- Set ONLINE = OFF to execute this example on editions other than Enterprise Edition.
DROP INDEX AK_BillOfMaterials_ProductAssemblyID_ComponentID_StartDate 
    ON Production.BillOfMaterials 
    WITH (ONLINE = ON, MOVE TO NewGroup);
GO

-- Verify filegroup location of the moved table.
SELECT t.name AS [Table Name], i.name AS [Index Name], i.type_desc,
    i.data_space_id, f.name AS [Filegroup Name]
FROM sys.indexes AS i
    JOIN sys.filegroups AS f ON i.data_space_id = f.data_space_id
    JOIN sys.tables as t ON i.object_id = t.object_id
        AND i.object_id = OBJECT_ID(N'Production.BillOfMaterials','U');

Para más información, vea ALTER INDEX (Transact-SQL).