Specificare un fattore di riempimento per un indiceSpecify Fill Factor for an Index

QUESTO ARGOMENTO SI APPLICA A: sìSQL Server (a partire dalla versione 2016)sìDatabase SQL di AzurenoAzure SQL Data Warehouse noParallel Data Warehouse THIS TOPIC APPLIES TO: yesSQL Server (starting with 2016)yesAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

In questo argomento si descrive il fattore di riempimento e come specificare un valore del fattore di riempimento in un indice in SQL Server 2017SQL Server 2017 tramite SQL Server Management StudioSQL Server Management Studio o Transact-SQLTransact-SQL.This topic describes what fill factor is and how to specify a fill factor value on an index in SQL Server 2017SQL Server 2017 by using SQL Server Management StudioSQL Server Management Studio or Transact-SQLTransact-SQL.

L'opzione del fattore di riempimento viene fornita per ottimizzare l'archiviazione dati e le prestazioni degli indici.The fill-factor option is provided for fine-tuning index data storage and performance. Quando si crea o si ricompila un indice, il valore del fattore di riempimento determina la percentuale di spazio in ogni pagina al livello foglia da riempire di dati, riservando lo spazio rimanente in ogni pagina come spazio libero per la crescita futura.When an index is created or rebuilt, the fill-factor value determines the percentage of space on each leaf-level page to be filled with data, reserving the remainder on each page as free space for future growth. Se ad esempio si specifica un fattore di riempimento pari a 80, significa che il 20% di ogni pagina al livello foglia verrà lasciato vuoto, rendendo disponibile lo spazio per l'espansione dell'indice con l'aggiunta di dati alla tabella sottostante.For example, specifying a fill-factor value of 80 means that 20 percent of each leaf-level page will be left empty, providing space for index expansion as data is added to the underlying table. Lo spazio vuoto viene riservato tra le righe anziché alla fine dell'indice.The empty space is reserved between the index rows rather than at the end of the index.

Il valore del fattore di riempimento è una percentuale compresa tra 1 e 100 e l'impostazione predefinita a livello di server è 0. Questo significa che le pagine al livello foglia vengono riempite completamente.The fill-factor value is a percentage from 1 to 100, and the server-wide default is 0 which means that the leaf-level pages are filled to capacity.

Nota

I valori 0 e 100 del fattore di riempimento sono equivalenti.Fill-factor values 0 and 100 are the same in all respects.

Contenuto dell'argomentoIn This Topic

Prima di iniziare Before You Begin

Considerazioni sulle prestazioni Performance Considerations

Divisioni di paginaPage Splits

Un valore del fattore di riempimento scelto correttamente consente di ridurre le potenziali divisioni di pagina rendendo disponibile uno spazio sufficiente per l'espansione dell'indice durante l'aggiunta di dati alla tabella sottostante. Quando viene aggiunta una nuova riga a una pagina di indice completa, tramite il Motore di databaseDatabase Engine viene spostata circa la metà delle righe in una nuova pagina per lasciare spazio per la nuova riga.A correctly chosen fill-factor value can reduce potential page splits by providing enough space for index expansion as data is added to the underlying table.When a new row is added to a full index page, the Motore di databaseDatabase Engine moves approximately half the rows to a new page to make room for the new row. Questa riorganizzazione è nota come divisione di pagina.This reorganization is known as a page split. Una divisione di pagina consente di creare spazio per nuovi record, ma può richiedere una certa quantità di tempo e un elevato utilizzo di risorse.A page split makes room for new records, but can take time to perform and is a resource intensive operation. Può inoltre provocare la frammentazione, che a sua volta causa l'aumento delle operazioni di I/O.Also, it can cause fragmentation that causes increased I/O operations. Quando si verificano frequenti divisioni di pagina, l'indice può essere ricompilato utilizzando un valore del fattore di riempimento nuovo o esistente per ridistribuire i dati.When frequent page splits occur, the index can be rebuilt by using a new or existing fill-factor value to redistribute the data. Per altre informazioni, vedere Riorganizzare e ricompilare gli indici.For more information, see Reorganize and Rebuild Indexes.

Benché un valore del fattore di riempimento basso e diverso da 0 può ridurre la necessità di dividere le pagine con l'aumento delle dimensioni dell'indice, l'indice richiederà uno spazio di archiviazione maggiore, con possibili effetti negativi sulle prestazioni di lettura.Although a low, nonzero fill-factor value may reduce the requirement to split pages as the index grows, the index will require more storage space and can decrease read performance. Anche per un'applicazione progettata per il supporto di numerose operazioni di inserimento e aggiornamento, il numero di letture nel database è in genere maggiore del numero di scritture in base a un fattore di 5 a 11.Even for an application oriented for many insert and update operations, the number of database reads typically outnumber database writes by a factor of 5 to 10. Se pertanto si specifica un fattore di riempimento diverso dal valore predefinito, è possibile che le prestazioni di lettura del database risultino ridotte in misura inversamente proporzionale all'impostazione del fattore di riempimento.Therefore, specifying a fill factor other than the default can decrease database read performance by an amount inversely proportional to the fill-factor setting. Un valore del fattore di riempimento pari a 50 può ad esempio dimezzare le prestazioni di lettura del database.For example, a fill-factor value of 50 can cause database read performance to decrease by two times. Ciò avviene perché l'indice contiene più pagine, aumentando pertanto le operazioni di I/O su disco necessarie per recuperare i dati.Read performance is decreased because the index contains more pages, therefore increasing the disk IO operations required to retrieve the data.

Aggiunta di dati alla fine della tabellaAdding Data to the End of the Table

Un valore del fattore di riempimento diverso da 0 o 100 può risultare efficace per le prestazioni se i nuovi dati vengono distribuiti uniformemente in tutta la tabella.A nonzero fill factor other than 0 or 100 can be good for performance if the new data is evenly distributed throughout the table. Se tuttavia tutti i dati vengono aggiunti alla fine della tabella, lo spazio vuoto nelle pagine di indice non verrà riempito.However, if all the data is added to the end of the table, the empty space in the index pages will not be filled. Se ad esempio la colonna chiave dell'indice è una colonna IDENTITY, la chiave per le nuove righe aumenta di continuo e le righe di indice vengono aggiunte logicamente alla fine dell'indice.For example, if the index key column is an IDENTITY column, the key for new rows is always increasing and the index rows are logically added to the end of the index. Se le righe esistenti verranno aggiornate con dati che ne aumentano le dimensioni, utilizzare un fattore di riempimento minore di 100.If existing rows will be updated with data that lengthens the size of the rows, use a fill factor of less than 100. I byte aggiuntivi in ogni pagina consentiranno di ridurre le divisioni di pagina causate dalla maggiore lunghezza delle righe.The extra bytes on each page will help to minimize page splits caused by extra length in the rows.

Sicurezza Security

Autorizzazioni Permissions

È richiesta l'autorizzazione ALTER per la tabella o la vista.Requires ALTER permission on the table or view. L'utente deve essere un membro del ruolo predefinito del server sysadmin o dei ruoli predefiniti del database db_ddladmin e db_owner .User must be a member of the sysadmin fixed server role or the db_ddladmin and db_owner fixed database roles.

Utilizzo di SQL Server Management Studio Using SQL Server Management Studio

Per specificare un fattore di riempimento tramite Progettazione tabelleTo specify a fill factor by using Table Designer

  1. In Esplora oggetti fare clic sul segno più per espandere il database contenente la tabella in cui si desidera specificare il fattore di riempimento di un indice.In Object Explorer, click the plus sign to expand the database that contains the table on which you want to specify an index’s fill factor.

  2. Fare clic sul segno più per espandere la cartella Tabelle .Click the plus sign to expand the Tables folder.

  3. Fare clic con il pulsante destro del mouse sulla tabella in cui si vuole specificare il fattore di riempimento di un indice e selezionare Progettazione.Right-click the table on which you want to specify an index’s fill factor and select Design.

  4. Scegliere Indici/chiavi dal menu Progettazione tabelle.On the Table Designer menu, click Indexes/Keys.

  5. Selezionare l'indice con il fattore di riempimento che si desidera specificare.Select the index with the fill factor that you want to specify.

  6. Espandere Specifica riempimento, selezionare la riga Fattore di riempimento e immettere il fattore di riempimento desiderato nella riga.Expand Fill Specification, select the Fill Factor row and enter the fill factor you want in the row.

  7. Scegliere Chiudi.Click Close.

  8. Selezionare Salva table_name dal menuFile.On the File menu, select Savetable_name.

Per specificare un fattore di riempimento in un indice tramite Esplora oggettiTo specify a fill factor in an index by using Object Explorer

  1. In Esplora oggetti fare clic sul segno più per espandere il database contenente la tabella in cui si desidera specificare il fattore di riempimento di un indice.In Object Explorer, click the plus sign to expand the database that contains the table on which you want to specify an index’s fill factor.

  2. Fare clic sul segno più per espandere la cartella Tabelle .Click the plus sign to expand the Tables folder.

  3. Fare clic sul segno più per espandere la tabella in cui si desidera specificare il fattore di riempimento di un indice.Click the plus sign to expand the table on which you want to specify an index’s fill factor.

  4. Fare clic sul segno più per espandere la cartella Indici .Click the plus sign to expand the Indexes folder.

  5. Fare clic con il pulsante destro del mouse sull'indice con il fattore di riempimento che si vuole specificare e scegliere Proprietà.Right-click the index with the fill factor that you want to specify and select Properties.

  6. In Selezione paginaselezionare Opzioni.Under Select a page, select Options.

  7. Nella riga Fattore di riempimento immettere il fattore di riempimento desiderato.In the Fill factor row, enter the fill factor that you want.

  8. Scegliere OK.Click OK.

Utilizzo di Transact-SQL Using Transact-SQL

Per specificare un fattore di riempimento in un indice esistenteTo specify a fill factor in an existing index

  1. In Esplora oggetticonnettersi a un'istanza del Motore di databaseDatabase Engine.In Object Explorer, connect to an instance of Motore di databaseDatabase Engine.

  2. Sulla barra Standard fare clic su Nuova query.On the Standard bar, click New Query.

  3. Copiare e incollare l'esempio seguente nella finestra Query, quindi fare clic su Esegui.Copy and paste the following example into the query window and click Execute. Nell'esempio viene ricompilato un indice esistente e viene applicato il fattore di riempimento specificato durante l'operazione di ricompilazione.The example rebuilds an existing index and applies the specified fill factor during the rebuild operation.

    USE AdventureWorks2012;  
    GO  
    -- Rebuilds the IX_Employee_OrganizationLevel_OrganizationNode index   
    -- with a fill factor of 80 on the HumanResources.Employee table.  
    
    ALTER INDEX IX_Employee_OrganizationLevel_OrganizationNode ON HumanResources.Employee  
    REBUILD WITH (FILLFACTOR = 80);   
    GO  
    

Modalità alternativa per specificare un fattore di riempimento in un indiceAnother way to specify a fill factor in an index

  1. In Esplora oggetticonnettersi a un'istanza del Motore di databaseDatabase Engine.In Object Explorer, connect to an instance of Motore di databaseDatabase Engine.

  2. Sulla barra Standard fare clic su Nuova query.On the Standard bar, click New Query.

  3. Copiare e incollare l'esempio seguente nella finestra Query, quindi fare clic su Esegui.Copy and paste the following example into the query window and click Execute.

    USE AdventureWorks2012;  
    GO  
    /* Drops and re-creates the IX_Employee_OrganizationLevel_OrganizationNode index on the HumanResources.Employee table with a fill factor of 80.  
    */  
    
    CREATE INDEX IX_Employee_OrganizationLevel_OrganizationNode ON HumanResources.Employee  
       (OrganizationLevel, OrganizationNode)   
    WITH (DROP_EXISTING = ON, FILLFACTOR = 80);   
    GO  
    

    Per altre informazioni, vedere ALTER INDEX (Transact-SQL).For more information, see ALTER INDEX (Transact-SQL).