Eseguire operazioni online sugli indici

Si applica a:SQL ServerDatabase SQL di AzureIstanza gestita di SQL di Azure

Questo articolo descrive come creare, ricompilare o eliminare indici online in SQL Server usando SQL Server Management Studio o Transact-SQL. L'opzione ONLINE consente all'utente simultaneo di accedere alla tabella sottostante o ai dati dell'indice cluster e a qualsiasi indice non cluster associato durante queste operazioni sull'indice. Durante la ricompilazione di un indice cluster da parte di un utente, ad esempio, tale utente e altri utenti possono continuare ad aggiornare ed eseguire query sui dati sottostanti.

Quando si eseguono operazioni DDL (Data Definition Language) offline, ad esempio la compilazione o la ricompilazione di un indice cluster, queste operazioni contengono blocchi esclusivi (X) sui dati sottostanti e sugli indici associati. Questo comportamento impedisce modifiche e query nei dati sottostanti fino al termine dell'operazione sull'indice.

Nota

I comandi di ricompilazione dell'indice possono contenere blocchi esclusivi sugli indici cluster dopo l'eliminazione di una colonna di oggetti di grandi dimensioni da una tabella, anche quando vengono eseguiti online.

Piattaforme supportate

Le operazioni sugli indici online non sono disponibili in ogni edizione di SQL Server. Per altre informazioni, vedere Edizioni e funzionalità supportate di SQL Server 2022.

Le operazioni sugli indici online sono disponibili in database SQL di Azure e Istanza gestita di SQL di Azure.

Limiti

È consigliabile eseguire operazioni online sugli indici per ambiti aziendali in funzione 24 ore al giorno e sette giorni su sette, in cui l'esigenza di attività simultanee durante le operazioni sugli indici rappresenta un elemento essenziale.

L'opzione ONLINE è disponibile nelle istruzioni Transact-SQL seguenti.

Per altre limitazioni e restrizioni relative alla creazione, alla ricompilazione o all'eliminazione di indici online, vedere Linee guida per le operazioni sugli indici online.

Autorizzazioni

È richiesta l'autorizzazione ALTER per la tabella o la vista.

Usare SQL Server Management Studio

  1. In Esplora oggetti selezionare il segno più per espandere il database contenente la tabella in cui si vuole ricompilare un indice online.

  2. Espandere la cartella Tabelle .

  3. Selezionare il segno più per espandere la tabella in cui si vuole ricompilare un indice online.

  4. Espandere la cartella Indici .

  5. Fare clic con il pulsante destro del mouse sull'indice da ricompilare online e selezionare Proprietà.

  6. In Selezione paginaselezionare Opzioni.

  7. Selezionare Consenti elaborazione DML online, quindi selezionare True dall'elenco.

  8. Seleziona OK.

  9. Fare clic con il pulsante destro del mouse sull'indice da ricompilare online e selezionare Ricompila.

  10. Nella finestra di dialogo Ricompila indici verificare che l'indice corretto si trova nella griglia Indici da ricompilare e selezionare OK.

Usare Transact-SQL

Nell'esempio seguente viene ricompilato un indice online esistente nel database AdventureWorks.

ALTER INDEX AK_Employee_NationalIDNumber
    ON HumanResources.Employee
    REBUILD WITH (ONLINE = ON);

Nell'esempio seguente viene eliminato un indice cluster online e la tabella risultante (heap) viene spostata nel filegroup NewGroup tramite la clausola MOVE TO . Vengono eseguite query sulle viste del catalogo sys.indexes, sys.tablese sys.filegroups per verificare la posizione dell'indice e della tabella nei filegroup prima e dopo lo spostamento.

-- 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');

Per altre informazioni, vedere ALTER INDEX (Transact-SQL).