sys.sp_indexoption (Transact-SQL)

Gäller för:SQL Server

Sätter låsoptionsvärden för användardefinierade klustrade och icke-klustrade index eller tabeller utan klustrat index.

Databasmotor för SQL Server gör automatiskt val av sid-, rad- eller tabelllåsning. Du behöver inte ställa in dessa alternativ manuellt. sp_indexoption erbjuds för expertanvändare som med säkerhet vet att en viss typ av lås alltid är lämplig.

Important

Den här funktionen tas bort i en framtida version av SQL Server. Undvik att använda den här funktionen i nytt utvecklingsarbete och planera att ändra program som för närvarande använder den här funktionen. Använd ALTER INDEXi stället .

Transact-SQL syntaxkonventioner

Syntax

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

Arguments

[ @IndexNamePattern = ] N'IndexNamePattern'

Det kvalificerade eller icke-kvalificerade namnet på en användardefinierad tabell eller index. @IndexNamePattern är nvarchar(1035), utan standard. Anteckningstecken krävs endast om ett kvalificerat index eller bordsnamn anges. Om ett fullt kvalificerat tabellnamn, inklusive ett databasnamn, tillhandahålls, måste databasnamnet vara namnet på den aktuella databasen. Om ett tabellnamn anges utan index, sätts det angivna optionsvärdet för alla index i den tabellen och tabellen själv om inget klustrat index finns.

[ @OptionName = ] 'OptionName'

Ett indexoptionsnamn. @OptionName är varchar(35) och kan vara ett av följande värden.

Value Description
AllowRowLocks När TRUE, tillåts radlås vid åtkomst till indexet. Databasmotorn avgör när radlås används. När FALSE, används inte radlås. Standardvärdet är TRUE.
AllowPageLocks När TRUE, är sidlås tillåtna vid åtkomst till indexet. Databasmotorn avgör när sidlås används. När FALSE, används inte sidlås. Standardvärdet är TRUE.
DisAllowRowLocks När TRUE, används inte radlås. När FALSE, tillåts radlås vid åtkomst till indexet. Databasmotorn avgör när radlås används.
DisAllowPageLocks När TRUE, används inte sidlås. När FALSE, är sidlås tillåtna vid åtkomst till indexet. Databasmotorn avgör när sidlås används.

[ @OptionValue = ] 'OptionValue'

Specificerar om inställningen @OptionName är aktiverad (TRUE, ON, yes, eller 1) eller inaktiverad (FALSE, OFF, no, eller 0). @OptionValue är varchar(12), utan standard.

Returnera kodvärden

0 (lyckades) eller > 0 (fel).

Remarks

XML-index stöds inte. Om ett XML-index specificeras, eller ett tabellnamn anges utan indexnamn och tabellen innehåller ett XML-index, misslyckas satsen. För att ställa in dessa alternativ, använd ALTER INDEX istället.

För att visa de aktuella egenskaperna för rad- och sidlåsning, använd INDEXPROPERTY eller sys.indexes katalogvy.

  • Rad-, sidnivå- och tabellnivålås är tillåtna vid åtkomst till indexet när AllowRowLocks = TRUE eller DisAllowRowLocks = FALSE, och AllowPageLocks = TRUE eller DisAllowPageLocks = FALSE. Databasmotorn väljer lämpligt lås och kan eskalera låset från ett rad- eller sidlås till ett tabelllås.

Endast ett tabellnivålås är tillåtet vid åtkomst till indexet när AllowRowLocks = FALSE eller DisAllowRowLocks = TRUE och AllowPageLocks = FALSE eller DisAllowPageLocks = TRUE.

Om ett tabellnamn anges utan index tillämpas inställningarna på alla index i den tabellen. När den underliggande tabellen inte har något klustrat index (det vill säga en heap) tillämpas inställningarna enligt följande:

  • När AllowRowLocks eller DisAllowRowLocks sätts till TRUE eller FALSE, tillämpas inställningen på heapen och eventuella tillhörande icke-klustrade index.

  • När AllowPageLocks alternativet är satt till TRUE eller DisAllowPageLocks är satt till FALSE, tillämpas inställningen på heapen och eventuella tillhörande icke-klustrade index.

  • När AllowPageLocks alternativet är satt FALSE eller DisAllowPageLocks är inställt på TRUE, tillämpas inställningen fullt ut på de icke-klustrade indexen. Det vill säga, alla sidlås är förbjudna på de icke-klustrade indexen. På heapen är endast delade (S), uppdateringslås (U) och exklusiva (X) för sidan inte tillåtna. Database Engine kan fortfarande få ett intent page lock (IS, IU eller IX) för interna ändamål.

Permissions

Kräver ALTER behörighet för tabellen.

Examples

A. Sätt ett alternativ på ett specifikt index

Följande exempel tillåter inte sidlås på indexet IX_Customer_TerritoryID i Customer tabellen.

USE AdventureWorks2022;
GO

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

B. Sätt ett alternativ på alla index i en tabell

Följande exempel förbjuder radlås på alla index som är kopplade till Product tabellen. Katalogvyn sys.indexes frågas före och efter att proceduren exekveras sp_indexoption för att visa resultatet av satsen.

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. Sätt ett alternativ på en tabell utan klustrat index

Följande exempel tillåter inte sidlås på en tabell utan klustrat index (en heap). Katalogvyn sys.indexes frågas både före och efter sp_indexoption att proceduren körs för att visa resultatet av satsen.

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