sys.sp_indexoption (Transact-SQL)

Aplica-se a: SQL Server

Define valores de opção de bloqueio para índices ou tabelas clusterizadas e não clusterizadas definidas pelo utilizador sem índice clusterizado.

O Mecanismo de Banco de Dados do SQL Server faz automaticamente escolhas de bloqueio ao nível de página, linha ou tabela. Não tens de definir estas opções manualmente. sp_indexoption é destinado a utilizadores especialistas que sabem com certeza que um determinado tipo de fechadura é sempre apropriado.

Importante

Esse recurso será removido em uma versão futura do SQL Server. Evite usar esse recurso em novos trabalhos de desenvolvimento e planeje modificar aplicativos que atualmente usam esse recurso. Em vez disso, use ALTER INDEX.

Transact-SQL convenções de sintaxe

Sintaxe

sys.sp_indexoption
    [ @IndexNamePattern = ] N'IndexNamePattern'
    , [ @OptionName = ] 'OptionName'
    , [ @OptionValue = ] 'OptionValue'
[ ; ]

Arguments

[ @IndexNamePattern = ] N'IndexNamePattern'

O nome qualificado ou não qualificado de uma tabela ou índice definido pelo utilizador. @IndexNamePattern é nvarchar(1035), sem padrão. As aspas são exigidas apenas se for especificado um índice ou nome de tabela qualificado. Se for fornecido um nome de tabela totalmente qualificado, incluindo um nome de base de dados, o nome da base de dados deve ser o nome da base de dados atual. Se um nome de tabela for especificado sem índice, o valor da opção especificado é definido para todos os índices dessa tabela e para a própria tabela caso não exista índice agrupado.

[ @OptionName = ] 'NomeDeopção'

Um nome de opção de índice. @OptionName é varchar(35), e pode ser um dos seguintes valores.

Valor Descrição
AllowRowLocks Quando TRUE, bloqueios de linha são permitidos ao aceder ao índice. O Mecanismo de Banco de Dados determina quando os bloqueios de linha são usados. Quando FALSE, bloqueios de fila não são usados. A predefinição é TRUE.
AllowPageLocks Quando TRUE, bloqueios de página são permitidos ao aceder ao índice. O Mecanismo de Banco de Dados determina quando os bloqueios de página são usados. Quando FALSE, bloqueios de página não são usados. A predefinição é TRUE.
DisAllowRowLocks Quando TRUE, bloqueios de fila não são usados. Quando FALSE, bloqueios de linha são permitidos ao aceder ao índice. O Mecanismo de Banco de Dados determina quando os bloqueios de linha são usados.
DisAllowPageLocks Quando TRUE, bloqueios de página não são usados. Quando FALSE, bloqueios de página são permitidos ao aceder ao índice. O Mecanismo de Banco de Dados determina quando os bloqueios de página são usados.

[ @OptionValue = ] 'ValorOption'

Especifica se a definição de @OptionName está ativada (TRUE, ON, yes, ou 1) ou desativada (FALSE, OFF, no, ou 0). @OptionValue é varchar(12), sem padrão.

Valores de código de retorno

0 (sucesso) ou > 0 (fracasso).

Remarks

Os índices XML não são suportados. Se for especificado um índice XML, ou se for especificado um nome de tabela sem nome de índice e a tabela contiver um índice XML, a instrução falha. Para definir estas opções, use ALTER INDEX em vez disso.

Para mostrar as propriedades atuais de bloqueio de linhas e páginas, use INDEXPROPERTY ou a visualização de catálogo sys.indexes .

  • Bloqueios ao nível de linha, página e tabela são permitidos ao aceder ao índice quando AllowRowLocks = TRUE ou DisAllowRowLocks = FALSE, e AllowPageLocks = TRUE ou DisAllowPageLocks = FALSE. O Mecanismo de Banco de Dados escolhe o bloqueio apropriado e pode escalá-lo de um bloqueio de linha ou página para um bloqueio de tabela.

Apenas um bloqueio ao nível de tabela é permitido ao aceder ao índice quando AllowRowLocks = FALSE ou DisAllowRowLocks = TRUE e AllowPageLocks = FALSE ou DisAllowPageLocks = TRUE.

Se o nome de uma tabela for especificado sem índice, as definições são aplicadas a todos os índices dessa tabela. Quando a tabela subjacente não tem índice agrupado (ou seja, é um heap), as definições são aplicadas da seguinte forma:

  • Quando AllowRowLocks ou DisAllowRowLocks são definidos como TRUE ou FALSE, a definição é aplicada ao heap e a quaisquer índices não agrupados associados.

  • Quando AllowPageLocks a opção está definida como TRUE ou DisAllowPageLocks está definida como FALSE, a definição é aplicada ao heap e a quaisquer índices não agrupados associados.

  • Quando AllowPageLocks a opção está definida FALSE ou DisAllowPageLocks está definida para TRUE, a definição é totalmente aplicada aos índices não agrupados. Ou seja, todos os bloqueios de página são proibidos nos índices não agrupados. No heap, apenas os bloqueios partilhados (S), update (U) e exclusivos (X) para a página são proibidos. O Database Engine ainda pode adquirir um bloqueio de página de intenção (IS, IU ou IX) para fins internos.

Permissions

É necessária a permissão ALTER na tabela.

Examples

A. Definir uma opção num índice específico

O exemplo seguinte impede bloqueios de página no IX_Customer_TerritoryID índice da Customer tabela.

USE AdventureWorks2022;
GO

EXECUTE sp_indexoption N'Sales.Customer.IX_Customer_TerritoryID', N'disallowpagelocks', TRUE;

B. Definir uma opção em todos os índices de uma tabela

O exemplo seguinte impede bloqueios de linhas em todos os índices associados à Product tabela. A sys.indexes vista de catálogo é consultada antes e depois de executar o sp_indexoption procedimento para mostrar os resultados da instrução.

USE AdventureWorks2022;
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.
EXECUTE 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 uma opção numa tabela sem índice clusterizado

O exemplo seguinte impede bloqueios de página numa tabela sem índice agrupado (um heap). A sys.indexes vista de catálogo é consultada antes e depois da execução do sp_indexoption procedimento para mostrar os resultados da instrução.

USE AdventureWorks2022;
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.
EXECUTE 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