sp_indexoption (Transact-SQL)

Gilt für:SQL Server

Legt Werte für Sperrenoptionen für benutzerdefinierte gruppierte und nicht gruppierte Indizes oder Tabellen ohne gruppierten Index fest.

Die SQL Server-Datenbank-Engine wählt automatisch die Sperrung auf Seiten-, Zeilen- oder Tabellenebene aus. Sie müssen diese Optionen nicht manuell festlegen. sp_indexoption wird für erfahrene Benutzer bereitgestellt, die mit Sicherheit wissen, dass eine bestimmte Art von Sperre immer geeignet ist.

Wichtig

Diese Funktion wird in einer zukünftigen Version von SQL Serverentfernt. Nutzen Sie diese Funktionen bei Neuentwicklungen nicht mehr, und planen Sie die Änderung von Anwendungen, die diese Funktion zurzeit verwenden. Verwenden Sie stattdessen ALTER INDEX (Transact-SQL).

Transact-SQL-Syntaxkonventionen

Syntax

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

Argumente

[ @IndexNamePattern = ] 'table_or_index_name' Ist der qualifizierte oder nicht qualifizierte Name einer benutzerdefinierten Tabelle oder eines benutzerdefinierten Indexes. table_or_index_name ist nvarchar(1035), ohne Standard. Anführungszeichen sind nur erforderlich, wenn ein qualifizierter Index- oder Tabellenname angegeben wird. Bei Angabe eines voll gekennzeichneten Tabellennamens (einschließlich eines Datenbanknamens) muss der Datenbankname der Name der aktuellen Datenbank sein. Wenn ein Tabellenname ohne Index angegeben wird, wird der angegebene Optionswert für alle Indizes dieser Tabelle und für die Tabelle selbst, falls kein gruppierter Index vorhanden ist, festgelegt.

[ @OptionName = ] 'option_name' Ist ein Indexoptionsname. option_name ist varchar(35) ohne Standard. option_name können einen der folgenden Werte aufweisen.

Wert Beschreibung
AllowRowLocks Mit TRUE sind Zeilensperren beim Zugriff auf den Index zulässig. Das Datenbank-Engine bestimmt, wann Zeilensperren verwendet werden. Mit FALSE werden keine Zeilensperren verwendet. Der Standardwert ist TRUE.
AllowPageLocks Mit TRUE sind Seitensperren beim Zugriff auf den Index zulässig. Das Datenbank-Engine bestimmt, wann Seitensperren verwendet werden. Mit FALSE werden keine Seitensperren verwendet. Der Standardwert ist TRUE.
DisAllowRowLocks Mit TRUE werden keine Zeilensperren verwendet. Mit FALSE sind Zeilensperren beim Zugriff auf den Index zulässig. Das Datenbank-Engine bestimmt, wann Zeilensperren verwendet werden.
DisAllowPageLocks Mit TRUE werden keine Seitensperren verwendet. Mit FALSE sind Seitensperren beim Zugriff auf den Index zulässig. Das Datenbank-Engine bestimmt, wann Seitensperren verwendet werden.

[ @OptionValue = ] 'value' Gibt an, ob die einstellung option_name aktiviert ist (TRUE, EIN, ja oder 1) oder deaktiviert (FALSE, OFF, no oder 0). value is varchar(12), with no default.

Rückgabecodewerte

0 (Erfolg) oder größer als 0 (Fehler)

Hinweise

XML-Indizes werden nicht unterstützt. Wenn Sie einen XML-Index angeben oder einen Tabellennamen ohne Indexnamen angeben und die Tabelle einen XML-Index enthält, wird für die Anweisung ein Fehler gemeldet. Um diese Optionen festzulegen, verwenden Sie stattdessen ALTER INDEX .

Verwenden Sie INDEXPROPERTY oder die Sys.indexes-Katalogansicht , um die aktuellen Zeilen- und Seitensperreigenschaften anzuzeigen.

  • Zeilen-, Seiten- und Tabellenebenensperren sind beim Zugriff auf den Index zulässig, wenn AllowRowLocks = TRUE oder DisAllowRowLocks = FALSE und AllowPageLocks = TRUE oder DisAllowPageLocks = FALSE. Das Datenbank-Engine wählt die geeignete Sperre aus und kann die Sperre von einer Zeilen- oder Seitensperre auf eine Tabellensperre ausweiten.

Beim Zugriff auf den Index ist nur eine Sperre auf Tabellenebene zulässig, wenn AllowRowLocks = FALSE oder DisAllowRowLocks = TRUE und AllowPageLocks = FALSE oder DisAllowPageLocks = TRUE.

Wenn ein Tabellenname ohne Index angegeben wird, werden die Einstellungen auf alle Indizes dieser Tabelle angewendet. Wenn die zugrunde liegende Tabelle keinen gruppierten Index aufweist (d. h., es handelt sich um einen Heap), werden die Einstellungen wie folgt angewendet:

  • Wenn AllowRowLocks oder DisAllowRowLocks auf TRUE oder FALSE festgelegt sind, wird die Einstellung auf den Heap und alle zugeordneten nicht gruppierten Indizes angewendet.

  • Wenn die Option AllowPageLocks auf TRUE oder DisAllowPageLocks auf FALSE festgelegt ist, wird die Einstellung auf den Heap und alle zugeordneten nicht gruppierten Indizes angewendet.

  • Wenn "AllowPageLocks " auf "FALSE" oder "DisAllowPageLocks " auf "TRUE" festgelegt ist, wird die Einstellung vollständig auf die nicht gruppierten Indizes angewendet. Das heißt, alle Seitensperren sind für die nicht gruppierten Indizes nicht zulässig. Auf dem Heap sind nur freigegebene Sperren (S), Updatesperren (U) und exklusive Sperren (X) für die Seite nicht zulässig. Das Datenbank-Engine kann weiterhin eine beabsichtigte Seitensperre (IS, IU oder IX) für interne Zwecke abrufen.

Berechtigungen

Erfordert die ALTER-Berechtigung für die Tabelle.

Beispiele

A. Festlegen einer Option auf einen bestimmten Index

Im folgenden Beispiel werden Seitensperren für den IX_Customer_TerritoryID Index in der Customer Tabelle nicht zulässig.

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

B. Festlegen einer Option auf alle Indizes in einer Tabelle

Im folgenden Beispiel werden Zeilensperren für alle Indizes der Product-Tabelle nicht zugelassen. Die sys.indexes-Katalogsicht wird vor und nach dem Ausführen der gespeicherten Prozedur sp_indexoption abgefragt, um die Ergebnisse der Anweisung anzuzeigen.

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. Festlegen einer Option für eine Tabelle ohne gruppierten Index

Im folgenden Beispiel werden Seitensperren für eine Tabelle ohne gruppierten Index (ein Heap) nicht zugelassen. Die sys.indexes Katalogansicht wird vor und nach der Ausführung der sp_indexoption Prozedur abgefragt, um die Ergebnisse der Anweisung anzuzeigen.

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  

Weitere Informationen

INDEXPROPERTY (Transact-SQL)
Gespeicherte Systemprozeduren (Transact-SQL)
sys.indexes (Transact-SQL)