Realizar operaciones de índice en líneaPerform Index Operations Online

SE APLICA A: síSQL Server síAzure SQL Database noAzure SQL Data Warehouse noAlmacenamiento de datos paralelos APPLIES TO: yesSQL Server yesAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

En este tema se describe cómo crear, volver a generar o quitar índices en línea en SQL Server 2017SQL Server 2017 mediante SQL Server Management StudioSQL Server Management Studio o Transact-SQLTransact-SQL.This topic describes how to create, rebuild, or drop indexes online in SQL Server 2017SQL Server 2017 by using SQL Server Management StudioSQL Server Management Studio or Transact-SQLTransact-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.The ONLINE option allows concurrent user access to the underlying table or clustered index data and any associated nonclustered indexes during these index operations. 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.For example, while a clustered index is being rebuilt by one user, that user and others can continue to update and query the underlying data. Al realizar operaciones DDL (lenguaje de definición de datos) sin conexión, como generar o volver a generar un índice clúster, estas operaciones mantienen bloqueos exclusivos de los datos subyacentes y los índices asociados.When you perform data definition language (DDL) operations offline, such as building or rebuilding a clustered index; these operations hold exclusive locks on the underlying data and associated indexes. Es un modo de evitar modificaciones de los datos subyacentes y consultas sobre los mismos hasta que no finalice la operación de índice.This prevents modifications and queries to the underlying data until the index operation is complete.

Nota

Las operaciones de índices en línea no están disponibles en todas las ediciones de SQL ServerSQL Server .Online index operations are not available in every SQL ServerSQL Server edition. Para obtener más información, vea Características compatibles con las ediciones de SQL Server 2016.For more information, see Features Supported by the Editions of SQL Server 2016.

En este temaIn This Topic

Antes de comenzarBefore You Begin

Limitaciones y restriccionesLimitations and Restrictions

  • Se recomienda realizar operaciones de índices en línea en entornos empresariales que funcionan 24 horas al día, siete días a la semana, y en los que resulta fundamental la actividad simultánea de los usuarios durante las operaciones de índices.We recommend performing online index operations for business environments that operate 24 hours a day, seven days a week, in which the need for concurrent user activity during index operations is vital.

  • La opción ONLINE está disponible en las siguientes instrucciones Transact-SQLTransact-SQL .The ONLINE option is available in the following Transact-SQLTransact-SQL statements.

  • Para conocer más limitaciones y restricciones relacionadas con la creación, nueva generación o eliminación de índices en línea, vea Directrices para operaciones de índices en línea.For more limitations and restrictions concerning creating, rebuilding, or dropping indexes online, see Guidelines for Online Index Operations.

SeguridadSecurity

PermisosPermissions

Requiere el permiso ALTER en la tabla o la vista.Requires ALTER permission on the table or view.

Uso de SQL Server Management StudioUsing SQL Server Management Studio

Para volver a generar un índice en líneaTo rebuild an index online

  1. En el Explorador de objetos, haga clic en el signo más para expandir la base de datos que contiene la tabla en la que desea volver a generar un índice en línea.In Object Explorer, click the plus sign to expand the database that contains the table on which you want to rebuild an index online.

  2. Expanda la carpeta Tablas .Expand the Tables folder.

  3. Haga clic en el signo más para expandir la tabla en la que desea volver a generar un índice en línea.Click the plus sign to expand the table on which you want to rebuild an index online.

  4. Expanda la carpeta Índices .Expand the Indexes folder.

  5. Haga clic con el botón derecho en el índice que quiere volver a generar en línea y seleccione Propiedades.Right-click the index that you want to rebuild online and select Properties.

  6. Debajo de Seleccionar una página, seleccione Opciones.Under Select a page, select Options.

  7. Seleccione Permitir procesamiento DML en líneay, a continuación, seleccione True en la lista.Select Allow online DML processing, and then select True from the list.

  8. Haga clic en Aceptar.Click OK.

  9. Haga clic con el botón derecho en el índice que quiere volver a generar en línea y seleccione Volver a generar.Right-click the index that you want to rebuild online and select Rebuild.

  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 haga clic en Aceptar.In the Rebuild Indexes dialog box, verify that the correct index is in the Indexes to rebuild grid and click OK.

Usar Transact-SQLUsing Transact-SQL

Para crear, volver a generar o quitar un índice en líneaTo create, rebuild, or drop an index online

En el ejemplo siguiente se recompila un índice en línea existente en la base de datos de AdventureWorks.The following example rebuilds an existing online index in the AdventureWorks database.

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 .The following example deletes a clustered index online and moves the resulting table (heap) to the filegroup NewGroup by using the MOVE TO clause. 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.The sys.indexes, sys.tables, and sys.filegroups catalog views are queried to verify the index and table placement in the filegroups before and after the move.

--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 AdventureWorks2012
        ADD FILEGROUP NewGroup;
    ALTER DATABASE AdventureWorks2012
        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 obtener más información, vea ALTER INDEX (Transact-SQL).For more information, see ALTER INDEX (Transact-SQL).