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 angemessen 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-Syntaxkonventionen
Syntax
sp_indexoption
[ @IndexNamePattern = ] N'IndexNamePattern'
, [ @OptionName = ] 'OptionName'
, [ @OptionValue = ] 'OptionValue'
[ ; ]
Argumente
[ @IndexNamePattern = ] N'IndexNamePattern'
Der qualifizierte oder nicht qualifizierte Name einer benutzerdefinierten Tabelle oder eines benutzerdefinierten Indexes. @IndexNamePattern 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 = ] 'OptionName'
Ein Indexoptionsname. @OptionName ist varchar(35) und kann einer der folgenden Werte sein.
Wert | Beschreibung |
---|---|
AllowRowLocks |
Wenn TRUE , sind Zeilensperren beim Zugriff auf den Index zulässig. Das Datenbank-Engine bestimmt, wann Zeilensperren verwendet werden. Wenn FALSE , Zeilensperren werden nicht verwendet. Der Standardwert ist TRUE . |
AllowPageLocks |
Wenn TRUE , Seitensperren sind beim Zugriff auf den Index zulässig. Das Datenbank-Engine bestimmt, wann Seitensperren verwendet werden. Wenn FALSE , Seitensperren werden nicht verwendet. Der Standardwert ist TRUE . |
DisAllowRowLocks |
Wenn TRUE , Zeilensperren werden nicht verwendet. Wenn FALSE , sind Zeilensperren beim Zugriff auf den Index zulässig. Das Datenbank-Engine bestimmt, wann Zeilensperren verwendet werden. |
DisAllowPageLocks |
Wenn TRUE , Seitensperren werden nicht verwendet. Wenn FALSE , Seitensperren sind beim Zugriff auf den Index zulässig. Das Datenbank-Engine bestimmt, wann Seitensperren verwendet werden. |
[ @OptionValue = ] 'OptionValue'
Gibt an, ob die @OptionName Einstellung aktiviert ist (TRUE
, ON
, yes
oder ) oder 1
deaktiviert (FALSE
, OFF
, , no
oder 0
). @OptionValue ist varchar(12) ohne Standard.
Rückgabecodewerte
0
(erfolgreich) oder > 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.
- Sperren auf Zeilenebene, Seitenebene und Tabellenebene sind beim Zugriff auf den Index zulässig, wenn
AllowRowLocks = TRUE
oderDisAllowRowLocks = FALSE
oderAllowPageLocks = TRUE
.DisAllowPageLocks = FALSE
Das Datenbank-Engine wählt die geeignete Sperre aus und kann die Sperre von einer Zeilen- oder Seitensperre auf eine Tabellensperre ausweiten.
Nur eine Sperre auf Tabellenebene ist beim Zugriff auf den Index zulässig, wenn AllowRowLocks = FALSE
oder DisAllowRowLocks = TRUE
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. ein Heap), werden die Einstellungen wie folgt angewendet:
Wenn
AllowRowLocks
die Einstellung aufTRUE
den Heap und alle zugeordneten nicht gruppierten Indizes angewendet wird oderDisAllowRowLocks
FALSE
auf diese festgelegt wird.Wenn
AllowPageLocks
die Option auf "TRUE
DisAllowPageLocks
Oder auf" festgelegtFALSE
ist, wird die Einstellung auf den Heap und alle zugeordneten nicht gruppierten Indizes angewendet.Wenn
AllowPageLocks
die Option festgelegtFALSE
oderDisAllowPageLocks
auf diese festgelegtTRUE
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 für 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 für alle Indizes 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