Ausführen von Onlineindexvorgängen
Gilt für: SQL Server Azure SQL-Datenbank Azure SQL Managed Instance
In diesem Artikel wird beschrieben, wie Indizes in SQL Server mithilfe von SQL Server Management Studio oder Transact-SQL online erstellt, neu erstellt oder gelöscht werden. Die Option ONLINE
ermöglicht, dass Benutzer während dieser Indexvorgänge gleichzeitig auf die dem Index zugrunde liegende Tabelle oder auf Daten eines gruppierten Indexes sowie auf alle eventuell damit verbundenen nicht gruppierten Indizes zugreifen können. Während beispielsweise ein gruppierter Index von einem Benutzer neu erstellt wird, kann dieser Benutzer – und alle anderen Benutzer – weiterhin die dem Index zugrunde liegenden Daten aktualisieren oder abfragen.
Wenn Sie DDL-Vorgänge (Datendefinitionssprache) wie das Erstellen oder Neuerstellen eines gruppierten Indexes offline ausführen, richten diese Vorgänge exklusive Sperren für die dem Index zugrunde liegenden Daten und damit verbundene Indizes ein. Damit werden Änderungen und Abfragen der zugrunde liegenden Daten verhindert, bis der Indexvorgang abgeschlossen ist.
Hinweis
Index-Neuerstellungsbefehle enthalten möglicherweise exklusive Sperren für gruppierte Indizes, nachdem eine große Objektspalte aus einer Tabelle gelöscht wurde, auch wenn dies online ausgeführt wird.
Unterstützte Plattformen
Onlineindexvorgänge sind nicht in jeder Edition von SQL Serververfügbar. Weitere Informationen finden Sie unter Editionen und unterstützte Funktionen von SQL Server 2022.
Onlineindexvorgänge sind in Azure SQL-Datenbank und Azure SQL Managed Instance verfügbar.
Begrenzungen
Onlineindexvorgänge werden in Geschäftsumgebungen empfohlen, die rund um die Uhr und 7 Tage die Woche aktiv sind, für die also eine gleichzeitige Benutzeraktivität während Indexvorgängen unabdingbar ist.
Die Option ONLINE
ist in folgenden Transact-SQL-Anweisungen verfügbar:
- CREATE INDEX
- ALTER INDEX
- DROP INDEX
- ALTER TABLE (zum Hinzufügen oder Löschen von
UNIQUE
- oderPRIMARY KEY
-Einschränkungen mit derCLUSTERED
-Indexoption)
Weitere Einschränkungen und Einschränkungen im Zusammenhang mit der Onlineerstellung, -neuerstellung und -löschung von Indizes finden Sie unter Richtlinien für Onlineindexvorgänge.
Berechtigungen
Erfordert die ALTER
-Berechtigung für die Tabelle oder Sicht.
Verwenden von SQL Server Management Studio
Klicken Sie im Objekt-Explorer auf das Pluszeichen, um die Datenbank mit der Tabelle zu erweitern, in der Sie einen Index online neu erstellen möchten.
Erweitern Sie den Ordner Tabellen .
Klicken Sie auf das Pluszeichen, um die Tabelle zu erweitern, für die Sie einen Index online neu erstellen möchten.
Erweitern Sie den Ordner Indizes .
Klicken Sie mit der rechten Maustaste auf den Index, den Sie online neu erstellen möchten, und wählen Sie Eigenschaftenaus.
Wählen Sie unter Seite auswählendie Option Optionenaus.
Wählen Sie DML-Onlineverarbeitung zulassenaus, und wählen Sie dann in der Liste True aus.
Wählen Sie OK aus.
Klicken Sie mit der rechten Maustaste auf den Index, den Sie online neu erstellen möchten, und wählen Sie Neu erstellenaus.
Überprüfen Sie im Dialogfeld Indizes neu erstellen, dass der richtige Index im Raster Neu zu erstellende Indizes ausgewählt ist, und klicken sie auf OK.
Verwenden von Transact-SQL
Im folgenden Beispiel wird ein vorhandener Onlineindex in der AdventureWorks-Datenbank erneut erstellt.
ALTER INDEX AK_Employee_NationalIDNumber
ON HumanResources.Employee
REBUILD WITH (ONLINE = ON);
Im folgenden Beispiel wird ein gruppierter Index online gelöscht, und die daraus resultierende Tabelle (Heap) wird in die Dateigruppe NewGroup
verschoben, wofür die MOVE TO
-Klausel verwendet wird. Die Katalogsichten sys.indexes
, sys.tables
und sys.filegroups
werden abgefragt, um die Platzierung von Index und Tabelle in den Dateigruppen vor und nach der Verschiebung zu prüfen.
-- Create a clustered index on the PRIMARY filegroup if the index does not exist.
IF NOT EXISTS (SELECT name FROM sys.indexes WHERE name =
N'AK_BillOfMaterials_ProductAssemblyID_ComponentID_StartDate')
CREATE UNIQUE CLUSTERED INDEX
AK_BillOfMaterials_ProductAssemblyID_ComponentID_StartDate
ON Production.BillOfMaterials (ProductAssemblyID, ComponentID,
StartDate)
ON 'PRIMARY';
GO
-- Verify filegroup location of the clustered index.
SELECT t.name AS [Table Name], i.name AS [Index Name], i.type_desc,
i.data_space_id, f.name AS [Filegroup Name]
FROM sys.indexes AS i
JOIN sys.filegroups AS f ON i.data_space_id = f.data_space_id
JOIN sys.tables as t ON i.object_id = t.object_id
AND i.object_id = OBJECT_ID(N'Production.BillOfMaterials','U')
GO
-- Create filegroup NewGroup if it does not exist.
IF NOT EXISTS (SELECT name FROM sys.filegroups
WHERE name = N'NewGroup')
BEGIN
ALTER DATABASE AdventureWorks2022
ADD FILEGROUP NewGroup;
ALTER DATABASE AdventureWorks2022
ADD FILE (NAME = File1,
FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\File1.ndf')
TO FILEGROUP NewGroup;
END
GO
-- Verify new filegroup
SELECT * from sys.filegroups;
GO
-- Drop the clustered index and move the BillOfMaterials table to
-- the Newgroup filegroup.
-- Set ONLINE = OFF to execute this example on editions other than Enterprise Edition.
DROP INDEX AK_BillOfMaterials_ProductAssemblyID_ComponentID_StartDate
ON Production.BillOfMaterials
WITH (ONLINE = ON, MOVE TO NewGroup);
GO
-- Verify filegroup location of the moved table.
SELECT t.name AS [Table Name], i.name AS [Index Name], i.type_desc,
i.data_space_id, f.name AS [Filegroup Name]
FROM sys.indexes AS i
JOIN sys.filegroups AS f ON i.data_space_id = f.data_space_id
JOIN sys.tables as t ON i.object_id = t.object_id
AND i.object_id = OBJECT_ID(N'Production.BillOfMaterials','U');
Weitere Informationen finden Sie unter ALTER INDEX (Transact-SQL).