Deshabilitar índices y restriccionesDisable Indexes and Constraints

ESTE TEMA SE APLICA A: síSQL Server (a partir de 2016)síAzure SQL DatabasenoAzure SQL Data Warehouse noAlmacenamiento de datos paralelos THIS TOPIC APPLIES TO: yesSQL Server (starting with 2016)yesAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

En este tema se describe cómo deshabilitar un índice o restricciones en SQL Server 2017SQL Server 2017 mediante SQL Server Management StudioSQL Server Management Studio o Transact-SQLTransact-SQL.This topic describes how to disable an index or constraints in SQL Server 2017SQL Server 2017 by using SQL Server Management StudioSQL Server Management Studio or Transact-SQLTransact-SQL. Al deshabilitar un índice, se impide que el usuario pueda tener acceso al mismo y, en el caso de los índices clúster, a los datos de la tabla subyacente.Disabling an index prevents user access to the index, and for clustered indexes to the underlying table data. La definición del índice se conserva en los metadatos y las estadísticas de índice se mantienen en índices no clúster.The index definition remains in metadata, and index statistics are kept on nonclustered indexes. La deshabilitación de un índice clúster o no clúster en una vista elimina físicamente los datos del índice.Disabling a nonclustered or clustered index on a view physically deletes the index data. Al deshabilitar un índice clúster en una tabla, se impide el acceso a los datos, que siguen en la tabla pero dejan de estar disponibles para las operaciones de lenguaje de manipulación de datos (DML) hasta que se quite o recompile el índice.Disabling a clustered index on a table prevents access to the data; the data still remains in the table, but is unavailable for data manipulation language (DML) operations until the index is dropped or rebuilt.

En este temaIn This Topic

Antes de comenzar Before You Begin

Limitaciones y restricciones Limitations and Restrictions

  • El índice no se mantiene mientras está deshabilitado.The index is not maintained while it is disabled.

  • El optimizador de consultas no tiene en cuenta el índice deshabilitado a la hora de crear planes de ejecución de consultas.The query optimizer does not consider the disabled index when creating query execution plans. Además, las consultas que hacen referencia al índice deshabilitado con una sugerencia de tabla generan un error.Also, queries that reference the disabled index with a table hint fail.

  • No puede crear un índice que use el mismo nombre que un índice existente deshabilitado.You cannot create an index that uses the same name as an existing disabled index.

  • Se puede quitar un índice deshabilitado.A disabled index can be dropped.

  • Al deshabilitar un índice único, también se deshabilitan la restricción PRIMARY KEY o UNIQUE y todas las restricciones FOREIGN KEY que hacen referencia a las columnas indizadas de otras tablas.When disabling a unique index, the PRIMARY KEY or UNIQUE constraint and all FOREIGN KEY constraints that reference the indexed columns from other tables are also disabled. Al deshabilitar un índice clúster, se deshabilitan también todas las restricciones FOREIGN KEY entrantes y salientes de la tabla subyacente.When disabling a clustered index, all incoming and outgoing FOREIGN KEY constraints on the underlying table are also disabled. Los nombres de las restricciones se enumeran en un mensaje de advertencia cuando se deshabilita el índice.The constraint names are listed in a warning message when the index is disabled. Después de recompilar el índice, se deben habilitar todas las restricciones manualmente mediante la instrucción ALTER TABLE CHECK CONSTRAINT.After rebuilding the index, all constraints must be manually enabled by using the ALTER TABLE CHECK CONSTRAINT statement.

  • Los índices no clúster se deshabilitan automáticamente cuando se deshabilita el índice clúster asociado.Nonclustered indexes are automatically disabled when the associated clustered index is disabled. No se pueden habilitar hasta que se habilita el índice clúster en la tabla o vista, o bien hasta que se quita el índice clúster en la tabla.They cannot be enabled until either the clustered index on the table or view is enabled or the clustered index on the table is dropped. Los índices no clúster deben habilitarse de forma explícita, a no ser que el índice clúster se haya habilitado mediante la instrucción ALTER INDEX ALL REBUILD.Nonclustered indexes must be explicitly enabled, unless the clustered index was enabled by using the ALTER INDEX ALL REBUILD statement.

  • La instrucción ALTER INDEX ALL REBUILD vuelve a generar y habilita todos los índices deshabilitados de la tabla, excepto los índices deshabilitados en las vistas.The ALTER INDEX ALL REBUILD statement rebuilds and enables all disabled indexes on the table, except for disabled indexes on views. Los índices en las vistas deben habilitarse en una instrucción ALTER INDEX ALL REBUILD independiente.Indexes on views must be enabled in a separate ALTER INDEX ALL REBUILD statement.

  • Al deshabilitar un índice clúster en una tabla también se deshabilitan todos los índices clúster y no clúster en las vistas que hacen referencia a esa tabla.Disabling a clustered index on a table also disables all clustered and nonclustered indexes on views that reference that table. Estos índices deben volverse a generar como los de la tabla a la que se hace referencia.These indexes must be rebuilt just as those on the referenced table.

  • No se puede tener acceso a las filas de datos del índice clúster deshabilitado excepto para quitar o volver a generar el índice clúster.The data rows of the disabled clustered index cannot be accessed except to drop or rebuild the clustered index.

  • Se puede recompilar un índice no clúster deshabilitado en línea cuando la tabla no tenga un índice clúster deshabilitado.You can rebuild a disabled nonclustered index online when the table does not have a disabled clustered index. Sin embargo, siempre debe volver a generar un índice clúster deshabilitado sin conexión si utiliza la instrucción ALTER INDEX REBUILD o CREATE INDEX WITH DROP_EXISTING.However, you must always rebuild a disabled clustered index offline if you use either the ALTER INDEX REBUILD or CREATE INDEX WITH DROP_EXISTING statement. Para obtener más información sobre las operaciones de índices en línea, vea Realizar operaciones de índice en línea.For more information about online index operations, see Perform Index Operations Online.

  • La instrucción CREATE STATISTICS no se puede ejecutar correctamente en una tabla que tenga un índice clúster deshabilitado.The CREATE STATISTICS statement cannot be successfully executed on a table that has a disabled clustered index.

  • La opción de base de datos AUTO_CREATE_STATISTICS crea estadísticas en una columna cuando el índice está deshabilitado y existen las condiciones siguientes:The AUTO_CREATE_STATISTICS database option creates new statistics on a column when the index is disabled and the following conditions exist:

    • AUTO_CREATE_STATISTICS está establecido en ON.AUTO_CREATE_STATISTICS is set to ON

    • No hay estadísticas existentes para la columna.There are no existing statistics for the column.

    • Las estadísticas son obligatorias durante la optimización de consultas.Statistics are required during query optimization.

  • Si un índice clúster está deshabilitado, DBCC CHECKDB no puede devolver información acerca de la tabla subyacente; en su lugar, la instrucción indica que el índice clúster está deshabilitado.If a clustered index is disabled, DBCC CHECKDB cannot return information about the underlying table; instead, the statement reports that the clustered index is disabled. DBCC INDEXDEFRAG no se puede usar para desfragmentar un índice deshabilitado; la instrucción genera un mensaje de error.DBCC INDEXDEFRAG cannot be used to defragment a disabled index; the statement fails with an error message. Puede usar DBCC DBREINDEX para recompilar un índice deshabilitado.You can use DBCC DBREINDEX to rebuild a disabled index.

  • Al crear un nuevo índice clúster se habilitan los índices no clúster deshabilitados previamente.Creating a new clustered index enables previously disabled nonclustered indexes. Para obtener más información, consulte Enable Indexes and Constraints.For more information, see Enable Indexes and Constraints.

Seguridad Security

Permisos Permissions

Para ejecutar ALTER INDEX, se necesita, como mínimo, el permiso ALTER en la tabla o en la vista.To execute ALTER INDEX, at a minimum, ALTER permission on the table or view is required.

Usar SQL Server Management Studio Using SQL Server Management Studio

Para deshabilitar un índiceTo disable an index

  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 deshabilitar un índice.In Object Explorer, click the plus sign to expand the database that contains the table on which you want to disable an index.

  2. Haga clic en el signo más para expandir la carpeta Tablas .Click the plus sign to expand the Tables folder.

  3. Haga clic en el signo más para expandir la tabla en la que desea deshabilitar un índice.Click the plus sign to expand the table on which you want to disable an index.

  4. Haga clic en el signo más para expandir la carpeta Índices .Click the plus sign to expand the Indexes folder.

  5. Haga clic con el botón derecho en el índice que quiera deshabilitar y seleccione Deshabilitar.Right-click the index you want to disable and select Disable.

  6. En el cuadro de diálogo Deshabilitar índices , compruebe que el índice correcto se encuentra en la cuadrícula Índices que va a deshabilitar y haga clic en Aceptar.In the Disable Indexes dialog box, verify that the correct index is in the Indexes to disable grid and click OK.

Para deshabilitar todos los índices de una tablaTo disable all indexes on a table

  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 deshabilitar los índices.In Object Explorer, click the plus sign to expand the database that contains the table on which you want to disable the indexes.

  2. Haga clic en el signo más para expandir la carpeta Tablas .Click the plus sign to expand the Tables folder.

  3. Haga clic en el signo más para expandir la tabla en la que desea deshabilitar los índices.Click the plus sign to expand the table on which you want to disable the indexes.

  4. Haga clic con el botón derecho en la carpeta Índices y seleccione Deshabilitar todo.Right-click the Indexes folder and select Disable All.

  5. En el cuadro de diálogo Deshabilitar índices , compruebe que los índices correctos se encuentran en la cuadrícula Índices que va a deshabilitar y haga clic en Aceptar.In the Disable Indexes dialog box, verify that the correct indexes are in the Indexes to disable grid and click OK. Para quitar un índice de la cuadrícula Índices que va a deshabilitar , seleccione el índice y, a continuación, presione la tecla SUPRIMIR.To remove an index from the Indexes to disable grid, select the index and then press the Delete key.

    La siguiente información está disponible en el cuadro de diálogo Deshabilitar índices :The following information is available in the Disable Indexes dialog box:

    Nombre de índiceIndex Name
    Muestra el nombre del índice.Displays the name of the index. Durante la ejecución, esta columna también muestra un icono que representa el estado.During execution, this column also displays an icon representing the status.

    Nombre de tablaTable Name
    Muestra el nombre de la tabla o vista en la que se ha creado el índice.Displays the name of the table or view that the index was created on.

    Tipo de índiceIndex Type
    Muestra el tipo de índice: Agrupado, No agrupado, Espacialo XML.Displays the type of the index: Clustered, Nonclustered, Spatial, or XML.

    EstadoStatus
    Muestra el estado de la operación de deshabilitación.Displays the status of the disable operation. Los valores posibles tras la ejecución son:Possible values after execution are:

  • En blancoBlank

    Antes de la ejecución, el Estado permanece en blanco.Prior to execution Status is blank.

  • En cursoIn progress

    La deshabilitación de los índices se ha iniciado, pero no ha finalizado.Disabling of the indexes has been started but is not complete.

  • SuccessSuccess

    La operación de deshabilitación ha finalizado correctamente.The disable operation completed successfully.

  • ErrorError

    Se ha encontrado un error durante la operación de deshabilitación de índices; la operación no ha finalizado correctamente.An error was encountered during the index disable operation, and the operation did not complete successfully.

  • DetenidoStopped

    La deshabilitación del índice no ha finalizado correctamente porque el usuario ha detenido la operación.The disable of the index was not completed successfully because the user stopped the operation.

    de mensajeMessage
    Proporciona el texto de los mensajes de error durante la operación de deshabilitación.Provides the text of error messages during the disable operation. Durante la ejecución, los errores aparecen como hipervínculos.During execution, errors appear as hyperlinks. El texto de los hipervínculos describe el cuerpo del error.The text of the hyperlinks describes the body of the error. La columna Mensaje pocas veces es lo suficientemente ancha para poder leer el texto completo del mensaje.The Message column is rarely wide enough to read the full message text. Hay dos maneras de leer el texto completo:There are two ways to get the full text:

  • Mueva el puntero sobre la celda del mensaje para que aparezca la información sobre herramientas con el texto de error.Move the mouse pointer over the message cell to display a ToolTip with the error text.

  • Haga clic en el hipervínculo para mostrar un cuadro de diálogo con el error completo.Click the hyperlink to display a dialog box displaying the full error.

Usar Transact-SQL Using Transact-SQL

Para deshabilitar un índiceTo disable an index

  1. En el Explorador de objetos, conéctese a una instancia del Motor de base de datosDatabase Engine.In Object Explorer, connect to an instance of Motor de base de datosDatabase Engine.

  2. En la barra de Estándar, haga clic en Nueva consulta.On the Standard bar, click New Query.

  3. Copie y pegue el siguiente ejemplo en la ventana de consulta y haga clic en Ejecutar.Copy and paste the following example into the query window and click Execute.

    USE AdventureWorks2012;  
    GO  
    -- disables the IX_Employee_OrganizationLevel_OrganizationNode index  
    -- on the HumanResources.Employee table  
    ALTER INDEX IX_Employee_OrganizationLevel_OrganizationNode ON HumanResources.Employee  
    DISABLE;  
    

Para deshabilitar todos los índices de una tablaTo disable all indexes on a table

  1. En el Explorador de objetos, conéctese a una instancia del Motor de base de datosDatabase Engine.In Object Explorer, connect to an instance of Motor de base de datosDatabase Engine.

  2. En la barra de Estándar, haga clic en Nueva consulta.On the Standard bar, click New Query.

  3. Copie y pegue el siguiente ejemplo en la ventana de consulta y haga clic en Ejecutar.Copy and paste the following example into the query window and click Execute.

    USE AdventureWorks2012;  
    GO  
    -- Disables all indexes on the HumanResources.Employee table.  
    ALTER INDEX ALL ON HumanResources.Employee  
    DISABLE;  
    

    Para obtener más información, vea ALTER INDEX (Transact-SQL).For more information, see ALTER INDEX (Transact-SQL).