sp_indexoption (Transact-SQL)

Aplica-se a:SQL Server

Define os valores da opção de bloqueio para índices clusterizados e não clusterizados definidos pelo usuário ou tabelas sem índice clusterizado.

O Mecanismo de Banco de Dados do SQL Server faz escolhas automaticamente de bloqueio em nível de página, linha ou tabela. Você não precisa definir essas opções manualmente. sp_indexoption é fornecido para usuários especialistas que sabem com certeza que um determinado tipo de bloqueio é sempre apropriado.

Importante

Esse recurso será removido em uma versão futura do SQL Server. Evite usar esse recurso em desenvolvimentos novos e planeje modificar os aplicativos que atualmente o utilizam. Em vez disso, use ALTER INDEX (Transact-SQL).

Convenções de sintaxe de Transact-SQL

Sintaxe

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

Argumentos

[ @IndexNamePattern = ] 'table_or_index_name' É o nome qualificado ou não qualificado de uma tabela ou índice definido pelo usuário. table_or_index_name é nvarchar(1035), sem padrão. As aspas são necessárias somente se um nome de índice ou tabela qualificado for especificado. Se um nome de tabela totalmente qualificado, incluindo um nome de banco de dados, for fornecido, o nome de banco de dados deve ser o nome do banco de dados atual. Se um nome de tabela for especificado sem-índice, o valor de opção especificado será definido para todos os índices nessa tabela e para a própria tabela se não houver um índice clusterizado.

[ @OptionName = ] 'option_name' É um nome de opção de índice. option_name é varchar(35), sem padrão. option_name pode ter um dos seguintes valores.

Valor Descrição
AllowRowLocks No caso de TRUE, são permitidos bloqueios de linha ao acessar o índice. O Mecanismo de Banco de Dados determina quando os bloqueios de linha são usados. No caso de FALSE, não são usados bloqueios de linha. O valor padrão é TRUE.
AllowPageLocks No caso de TRUE, são permitidos bloqueios de página ao acessar o índice. O Mecanismo de Banco de Dados determina quando os bloqueios de página são usados. No caso de FALSE, não são usados bloqueios de página. O valor padrão é TRUE.
DisAllowRowLocks No caso de TRUE, não são usados bloqueios de linha. No caso de FALSE, são permitidos bloqueios de linha ao acessar o índice. O Mecanismo de Banco de Dados determina quando os bloqueios de linha são usados.
DisAllowPageLocks No caso de TRUE, não são usados bloqueios de página. No caso de FALSE, são permitidos bloqueios de página ao acessar o índice. O Mecanismo de Banco de Dados determina quando os bloqueios de página são usados.

[ @OptionValue = ] 'value'Especifica se a configuração option_name está habilitada (TRUE, ON, yes ou 1) ou desabilitada (FALSE, OFF, no ou 0). value é varchar(12), sem padrão.

Valores do código de retorno

0 (êxito) ou superior a 0 (falha)

Comentários

Não é oferecido suporte a índices XML. Se um índice XML for especificado, ou um nome de tabela for especificado sem nome de índice e a tabela tiver um índice XML, haverá falha na instrução. Para definir essas opções, use ALTER INDEX .

Para exibir as propriedades atuais de bloqueio de linha e página, use INDEXPROPERTY ou a exibição de catálogo sys.indexes .

  • Bloqueios em nível de linha, página e tabela são permitidos ao acessar o í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 escalar o bloqueio de uma linha ou página para um bloqueio de tabela.

Somente um bloqueio em nível de tabela é permitido ao acessar o índice quando AllowRowLocks = FALSE ou DisAllowRowLocks = TRUE e AllowPageLocks = FALSE ou DisAllowPageLocks = TRUE.

Se um nome de tabela for especificado sem-índice, as configurações serão aplicadas a todos os índices nessa tabela. Quando a tabela subjacente não tiver índice clusterizado (ou seja, é um heap), as configurações serão aplicadas da seguinte forma:

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

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

  • Quando a opção AllowPageLocks é definida como FALSE ou DisAllowPageLocks é definida como TRUE, a configuração é totalmente aplicada aos índices não clusterizados. Ou seja, nenhum bloqueio de página é permitido nos índices não clusterizados. No heap, somente os bloqueios compartilhados (S, shared), de atualização (U, update) e exclusivos (X, exclusive) de página não são permitidos. O Mecanismo de Banco de Dados ainda pode adquirir um bloqueio de página intencional (IS, IU ou IX) para fins internos.

Permissões

Exige a permissão ALTER na tabela.

Exemplos

R. Definindo uma opção em um índice específico

O exemplo a seguir não permite bloqueios de página no IX_Customer_TerritoryID índice na Customer tabela.

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

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

O exemplo a seguir não permite bloqueios de linha em todos os índices associados com a tabela Product. A exibição do catálogo sys.indexes é consultada antes e depois da execução do procedimento sp_indexoption 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.   
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. Definindo uma opção em uma tabela sem índice clusterizado

O exemplo a seguir não permite bloqueios de página em uma tabela sem índice clusterizado (um heap). A sys.indexes exibição 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.   
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  

Confira também

INDEXPROPERTY (Transact-SQL)
Procedimentos armazenados do sistema (Transact-SQL)
sys.indexes (Transact-SQL)