Freigeben über


Ausführen von Onlineindexvorgängen

Gilt für:SQL ServerAzure SQL-DatenbankVerwaltete Azure SQL-InstanzSQL-Datenbank in Microsoft Fabric Preview

In diesem Artikel wird beschrieben, wie Sie Onlineindizes mithilfe von SQL Server Management Studio oder Transact-SQL erstellen, neu erstellen oder ablegen. 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 (Data Definition Language) offline ausführen, z. B. das Erstellen oder Neuerstellen eines gruppierten Indexes, enthalten diese Vorgänge exklusive (X) Sperren für die zugrunde liegenden Daten und zugeordneten Indizes. Damit werden Änderungen und Abfragen der zugrunde liegenden Daten verhindert, bis der Indexvorgang abgeschlossen ist.

Note

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.

Die Option ONLINE ist in folgenden Transact-SQL-Anweisungen verfügbar:

Einschränkungen und Einschränkungen beim Erstellen, Neuerstellen oder Ablegen von Indizes online finden Sie in den Richtlinien für Onlineindexvorgänge.

Um reaktivierbare Indexvorgänge zu verwenden, muss ein Indexvorgang online ausgeführt werden. Weitere Informationen finden Sie unter " Resumable index considerations".

Supported platforms

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.

Permissions

Erfordert die ALTER Berechtigung für die Tabelle oder Ansicht.

Verwenden von SQL Server Management Studio

  1. Erweitern Sie im Objekt-Explorer die Datenbank, die die Tabelle enthält, in der Sie einen Index online neu erstellen möchten.

  2. Erweitern Sie den Ordner Tabellen .

  3. Erweitern Sie die Tabelle, auf der Sie einen Index online neu erstellen möchten.

  4. Erweitern Sie den Ordner Indizes .

  5. Verwenden Sie das Kontextmenü für den Index, den Sie online neu erstellen möchten, und wählen Sie "Eigenschaften" aus.

  6. Wählen Sie unter Seite auswählendie Option Optionenaus.

  7. Wählen Sie DML-Onlineverarbeitung zulassenaus, und wählen Sie dann in der Liste True aus.

  8. Select OK.

  9. Verwenden Sie das Kontextmenü für den Index, den Sie online neu erstellen möchten, und wählen Sie "Neu erstellen" aus.

  10. Ü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.

Use Transact-SQL

Im folgenden Beispiel wird ein vorhandener Onlineindex in der AdventureWorks Beispieldatenbank neu 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.tablesund 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).