sp_indexoption (Transact-SQL)

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

SQL Server Database Engine (Datenbankmodul) wählt automatisch zwischen Sperren auf Seitenebene, Zeilenebene und Tabellenebene aus. Sie müssen diese Optionen nicht manuell festlegen. sp_indexoption wird erfahrenen Benutzern bereitgestellt, die mit Bestimmtheit wissen, dass der angegebene Sperrentyp immer angemessen ist.

Wichtiger HinweisWichtig

Diese Funktion wird in der nächsten Version von Microsoft SQL Server entfernt. Verwenden Sie dieses Feature beim Entwickeln neuer Anwendungen nicht, und planen Sie das Ändern von Anwendungen, in denen es zurzeit verwendet wird. Verwenden Sie stattdessen ALTER INDEX (Transact-SQL).

Themenlink (Symbol)Transact-SQL-Syntaxkonventionen

Syntax

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

Argumente

  • [ @IndexNamePattern=] 'table_or_index_name'
    Der qualifizierte oder nicht qualifizierte Name einer benutzerdefinierten Tabelle oder eines benutzerdefinierten Indexes. table_or_index_name ist vom Datentyp nvarchar(1035) und weist keinen Standardwert auf. 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'
    Der Name einer Indexoption. option_name ist vom Datentyp varchar(35) und weist keinen Standardwert auf. option_name kann die folgenden Werte aufweisen.

    Wert

    Beschreibung

    AllowRowLocks

    Mit TRUE sind Zeilensperren beim Zugriff auf den Index zulässig. Database Engine (Datenbankmodul) 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. Database Engine (Datenbankmodul) 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. Database Engine (Datenbankmodul) bestimmt, wann Zeilensperren verwendet werden.

    DisAllowPageLocks

    Mit TRUE werden keine Seitensperren verwendet. Mit FALSE sind Seitensperren beim Zugriff auf den Index zulässig. Database Engine (Datenbankmodul) bestimmt, wann Seitensperren verwendet werden.

  • [ @OptionValue = ] 'value'
    Gibt an, ob die option_name-Einstellung aktiviert (TRUE, ON, Yes oder 1) oder deaktiviert (FALSE, OFF, No oder 0) ist. value ist vom Datentyp varchar(12) und weist keinen Standardwert auf.

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. Verwenden Sie stattdessen ALTER INDEX, um diese Optionen festzulegen.

Verwenden Sie INDEXPROPERTY oder die sys.indexes-Katalogsicht, um die aktuellen Eigenschaften für Zeilen- und Seitensperren anzuzeigen.

  • Sperren auf Zeilen-, Seiten- und Tabellenebene sind beim Zugriff auf den Index zulässig, wenn AllowRowLocks = TRUE oder DisAllowRowLocks = FALSE, und AllowPageLocks = TRUE oder DisAllowPageLocks = FALSE. Database Engine (Datenbankmodul) wählt die geeignete Sperre und kann die Sperre von einer Zeilen- oder Seitensperre auf eine Tabellensperre ausweiten. Weitere Informationen finden Sie unter Sperrenausweitung (Datenbankmodul).

Nur eine Sperre auf Tabellenebene ist beim Zugriff auf den Index 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 nicht zugehörige gruppierte Indizes angewendet.

  • Wenn AllowPageLocks auf TRUE oder DisAllowPageLocks auf FALSE festgelegt ist, wird die Einstellung auf den Heap und alle zugehörige nicht gruppierte 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), Aktualisierungssperren (U) und exklusive Sperren (X) für die Seite nicht zulässig. Database Engine (Datenbankmodul) kann weiterhin eine beabsichtigte Seitensperre (IS, IU oder IX) für interne Zwecke abrufen.

Weitere Informationen zum Konfigurieren der Sperrengranularität für einen Index finden Sie unter Anpassen der Sperren für einen Index.

Berechtigungen

Erfordert die ALTER-Berechtigung für die Tabelle.

Beispiele

A. Festlegen einer Option für einen bestimmten Index

Im folgenden Beispiel werden Seitensperren für den IX_Customer_TerritoryID-Index in der Customer-Tabelle nicht zugelassen.

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

B. Festlegen einer Option für 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 AdventureWorks;
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-Katalogsicht wird vor und nach dem Ausführen der gespeicherten Prozedur sp_indexoption abgefragt, um die Ergebnisse der Anweisung anzuzeigen.

USE AdventureWorks;
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