Condividi tramite


Eseguire operazioni online sugli indici

In questo argomento si illustra come creare, ricompilare o eliminare gli indici online in SQL Server 2012 tramite SQL Server Management Studio o Transact-SQL. L'opzione ONLINE consente l'accesso simultaneo degli utenti alla tabella sottostante o ai dati dell'indice cluster e a qualsiasi indice non cluster associato durante l'esecuzione di queste operazioni sugli indici. 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, tali operazioni mantengono blocchi esclusivi sui dati sottostanti e gli indici associati. Questo comportamento impedisce modifiche e query nei dati sottostanti fino al termine dell'operazione sull'indice.

[!NOTA]

Le operazioni sugli indici online sono disponibili solo in alcune edizioni di SQL Server. Per ulteriori informazioni, vedere Funzionalità supportate dalle edizioni di SQL Server 2012.

Contenuto dell'argomento

  • Prima di iniziare:

    Limitazioni e restrizioni

    Sicurezza

  • Per ricompilare un indice online tramite:

    SQL Server Management Studio

    Transact-SQL

Prima di iniziare

Limitazioni e restrizioni

  • È 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 ulteriori limitazioni e restrizioni relative alla creazione, alla ricompilazione o all'eliminazione degli indici online, vedere Linee guida per operazioni di indice online.

Sicurezza

Autorizzazioni

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

Icona freccia utilizzata con il collegamento Torna all'inizio[Top]

Utilizzo di SQL Server Management Studio

Per ricompilare un indice online

  1. In Esplora oggetti fare clic sul segno più per espandere il database contenente la tabella in cui si desidera ricompilare un indice online.

  2. Espandere la cartella Tabelle.

  3. Fare clic sul segno più per espandere la tabella in cui si desidera 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 pagina selezionare Opzioni.

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

  8. Scegliere 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 nella griglia Indici da ricompilare sia presente l'indice corretto e fare clic su OK.

Icona freccia utilizzata con il collegamento Torna all'inizio[Top]

Utilizzo di Transact-SQL

Per creare, ricompilare o eliminare un indice online

  1. In Esplora oggetti connettersi a un'istanza del Motore di database.

  2. Sulla barra Standard fare clic su Nuova query.

  3. Copiare e incollare l'esempio seguente nella finestra Query, quindi scegliere Esegui. Nell'esempio viene ricompilato un indice online esistente

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

    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.tables e sys.filegroups per verificare la posizione dell'indice e della tabella nei filegroup prima e dopo lo spostamento.

    USE AdventureWorks2012;
    GO
    --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 AdventureWorks2012
            ADD FILEGROUP NewGroup;
        ALTER DATABASE AdventureWorks2012
            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');
    GO
    

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

Icona freccia utilizzata con il collegamento Torna all'inizio[Top]