sp_indexoption (Transact-SQL)

Define los valores de la opción de bloqueo para índices agrupados y no agrupados definidos por el usuario o tablas sin ningún índice agrupado.

El SQL Server Database Engine (Motor de base de datos de SQL Server) selecciona automáticamente el bloqueo en el nivel de página, fila o tabla. No es necesario establecer estas opciones manualmente. Se proporciona sp_indexoption para usuarios expertos que saben con certeza que un tipo de bloqueo determinado siempre es apropiado.

Nota importanteImportante

Esta característica se quitará en la versión siguiente de Microsoft SQL Server. Evite utilizar esta característica en nuevos trabajos de desarrollo y tenga previsto modificar las aplicaciones que actualmente la utilizan. En su lugar, use ALTER INDEX (Transact-SQL).

Icono de vínculo a temasConvenciones de sintaxis de Transact-SQL

Sintaxis

sp_indexoption [ @IndexNamePattern = ] 'table_or_index_name' 
        , [ @OptionName = ] 'option_name' 
        , [ @OptionValue = ] 'value'

Argumentos

  • [ @IndexNamePattern=] 'table_or_index_name'
    Es el nombre completo o incompleto de una tabla o índice definido por el usuario. table_or_index_name es de tipo nvarchar(1035) y no tiene ningún valor predeterminado. Las comillas sólo son necesarias si se especifica un índice o nombre de tabla completo. Si se proporciona un nombre de tabla completo, incluido el nombre de la base de datos, el nombre de la base de datos debe ser el nombre de la base de datos actual. Si se especifica un nombre de tabla sin ningún índice, el valor de la opción especificada se define para todos los índices de dicha tabla y para la tabla misma si no existe ningún índice agrupado.

  • [ @OptionName = ] 'option_name'
    Es un nombre de opción de índice. option_name es de tipo varchar(35) y no tiene ningún valor predeterminado. option_name puede tener uno de los siguientes valores.

    Valor

    Descripción

    AllowRowLocks

    Cuando el valor es TRUE, se permiten bloqueos de fila al obtener acceso al índice. El Motor de base de datos determina cuándo se utilizan los bloqueos de fila. Cuando es FALSE, no se utilizan bloqueos de fila. El valor predeterminado es TRUE.

    AllowPageLocks

    Cuando el valor es TRUE, se permiten bloqueos de página al obtener acceso al índice. El Motor de base de datos determina cuándo se utilizan los bloqueos de página. Cuando es FALSE, no se utilizan bloqueos de página. El valor predeterminado es TRUE.

    DisAllowRowLocks

    Cuando es TRUE no se utilizan bloqueos de fila. Cuando el valor es FALSE, se permiten bloqueos de fila al obtener acceso al índice. El Motor de base de datos determina cuándo se utilizan los bloqueos de fila.

    DisAllowPageLocks

    Cuando es TRUE, no se utilizan bloqueos de página. Cuando el valor es FALSE, se permiten bloqueos de página al obtener acceso al índice. El Motor de base de datos determina cuándo se utilizan los bloqueos de página.

  • [ @OptionValue = ] 'value'
    Especifica si el parámetro option_name está habilitado (TRUE, ON, yes o 1) o deshabilitado (FALSE, OFF, no o 0). value es de tipo varchar(12) y no tiene ningún valor predeterminado.

Valores de código de retorno

0 (correcto) o mayor que 0 (error)

Comentarios

Los índices XML no se admiten. Si se especifica un índice XML o un nombre de tabla sin ningún nombre de índice y la tabla contiene un índice XML, la instrucción produce un error. Para establecer estas opciones, utilice ALTER INDEX en su lugar.

Para mostrar las propiedades de bloqueo de página y de fila actuales, utilice INDEXPROPERTY o la vista de catálogo sys.indexes.

  • Se permiten bloqueos de nivel de tabla, página y fila al obtener acceso al índice cuando AllowRowLocks = TRUE o DisAllowRowLocks = FALSE, y AllowPageLocks = TRUE o DisAllowPageLocks = FALSE. El Motor de base de datos elige el bloqueo adecuado y puede ascender el bloqueo de una fila o página a un bloqueo de tabla. Para obtener más información, vea Concentración de bloqueos (motor de base de datos).

Sólo se permite un bloqueo de nivel de tabla al obtener acceso al índice cuando AllowRowLocks = FALSE o DisAllowRowLocks = TRUE, y AllowPageLocks = FALSE o DisAllowPageLocks = TRUE.

Si se especifica un nombre de tabla sin ningún índice, la configuración se aplica a todos los índices de esa tabla. Si la tabla subyacente no tiene ningún índice agrupado (es decir, es un montón), la configuración se aplica de la siguiente manera:

  • Cuando AllowRowLocks o DisAllowRowLocks se definen como TRUE o FALSE, la configuración se aplica al montón y a cualquier índice no agrupado asociado.

  • Cuando la opción AllowPageLocks se define como TRUE o DisAllowPageLocks se define como FALSE, la configuración se aplica al montón y a cualquier índice no agrupado asociado.

  • Cuando la opción AllowPageLocks se define como FALSE o DisAllowPageLocks se define como TRUE, la configuración se aplica por completo a los índices no agrupados. Es decir, no se permite ningún bloqueo de página en los índices no agrupados. En el montón, no se permiten únicamente los bloqueos compartidos (S), de actualización (U) y exclusivos (X) de la página. El Motor de base de datos puede todavía adquirir un bloqueo de página de intención (IS, IU o IX) para fines internos.

Para obtener más información sobre la configuración de la granularidad de bloqueo en un índice, vea Personalizar el bloqueo de un índice.

Permisos

Requiere el permiso ALTER en la tabla.

Ejemplos

A. Definir una opción en un índice específico

El siguiente ejemplo deshabilita los bloqueos de página del índice IX_Customer_TerritoryID de la tabla Customer.

USE AdventureWorks2008R2;
GO
EXEC sp_indexoption N'Sales.Customer.IX_Customer_TerritoryID',
    N'disallowpagelocks', TRUE;

B. Definir una opción en todos los índices de una tabla

El siguiente ejemplo no permite bloqueos de fila en los índices asociados con la tabla Product. La vista de catálogo sys.indexes se consulta antes y después de ejecutar el procedimiento sp_indexoption para mostrar los resultados de la instrucción.

USE AdventureWorks2008R2;
GO
--Display the current row and page lock options for all indexes on the table.
SELECT name, type_desc, allow_row_locks, allow_page_locks 
FROM sys.indexes
WHERE object_id = OBJECT_ID(N'Production.Product');
GO
-- Set the disallowrowlocks option on the Product table. 
EXEC sp_indexoption N'Production.Product',
    N'disallowrowlocks', TRUE;
GO
--Verify the row and page lock options for all indexes on the table.
SELECT name, type_desc, allow_row_locks, allow_page_locks 
FROM sys.indexes
WHERE object_id = OBJECT_ID(N'Production.Product');
GO

C. Definir una opción en una tabla sin índices agrupados

El siguiente ejemplo no permite bloqueos de página en una tabla sin índices agrupados (un montón). La vista de catálogo sys.indexes se consulta antes y después de ejecutar el procedimiento sp_indexoption para mostrar los resultados de la instrucción.

USE AdventureWorks2008R2;
GO
--Display the current row and page lock options of the table. 
SELECT OBJECT_NAME (object_id) AS [Table], type_desc, allow_row_locks, allow_page_locks 
FROM sys.indexes
WHERE OBJECT_NAME (object_id) = N'DatabaseLog';
GO
-- Set the disallowpagelocks option on the table. 
EXEC sp_indexoption DatabaseLog,
    N'disallowpagelocks', TRUE;
GO
--Verify the row and page lock settings of the table.
SELECT OBJECT_NAME (object_id) AS [Table], allow_row_locks, allow_page_locks 
FROM sys.indexes
WHERE OBJECT_NAME (object_id) = N'DatabaseLog';
GO