Especificar el factor de relleno para un índiceSpecify Fill Factor for an Index

SE APLICA A: síSQL Server síAzure SQL Database noAzure SQL Data Warehouse noAlmacenamiento de datos paralelos APPLIES TO: yesSQL Server yesAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

Este tema describe qué es el factor de relleno y cómo especificar un valor de factor de relleno en un índice de SQL Server 2017SQL Server 2017 mediante 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.

La opción de factor de relleno permite optimizar el almacenamiento y rendimiento de los datos de índice.The fill-factor option is provided for fine-tuning index data storage and performance. Cuando se crea o se vuelve a generar un índice, el valor de factor de relleno determina el porcentaje de espacio en cada página de nivel de hoja que se tiene que rellenar con datos, por lo que se reserva el resto de cada página como espacio disponible para seguir creciendo.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. Por ejemplo, si se especifica un valor de factor de relleno de 80, significa que el 20 por ciento de cada página de nivel de hoja se dejará vacío para proporcionar espacio para la expansión del índice a medida que se agreguen datos a la tabla subyacente.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. El espacio vacío se reserva entre las filas de índice en lugar de al final del índice.The empty space is reserved between the index rows rather than at the end of the index.

El valor de factor de relleno es un porcentaje entre 1 y 100, y el valor predeterminado en el servidor es 0, lo que significa que las páginas de nivel de hoja se rellenan al máximo de su capacidad.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

Los valores del factor de relleno 0 y 100 son idénticos.Fill-factor values 0 and 100 are the same in all respects.

En este temaIn This Topic

Antes de comenzarBefore You Begin

Consideraciones de rendimientoPerformance Considerations

Divisiones de páginasPage Splits

Si el valor de factor de relleno se elige correctamente, se pueden reducir las posibles divisiones de página al proporcionarse espacio suficiente para la expansión del índice a medida que se agregan datos a la tabla subyacente. Cuando se agrega una fila nueva a una página de índice llena, el Motor de base de datosDatabase Engine mueve aproximadamente la mitad de las filas a una página nueva con el fin de hacer espacio para la nueva fila.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 Motor de base de datosDatabase Engine moves approximately half the rows to a new page to make room for the new row. Esta reorganización se denomina división de página.This reorganization is known as a page split. Una división de página genera espacio para los nuevos registros, pero puede tardar en realizarse y es una operación que consume muchos recursos.A page split makes room for new records, but can take time to perform and is a resource intensive operation. Además, puede causar fragmentación que, a su vez, causa más operaciones de E/S.Also, it can cause fragmentation that causes increased I/O operations. Cuando se llevan a cabo divisiones de páginas con frecuencia, el índice se puede volver a generar utilizando un valor de factor de relleno nuevo o existente para redistribuir los datos.When frequent page splits occur, the index can be rebuilt by using a new or existing fill-factor value to redistribute the data. Para obtener más información, vea Reorganizar y volver a generar índices.For more information, see Reorganize and Rebuild Indexes.

Aunque si el valor del factor de relleno es bajo y distinto de cero, se puede reducir el requisito de dividir páginas a medida que crezca el índice, éste necesitará más espacio de almacenamiento y puede reducir el rendimiento de la lectura.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. Incluso en el caso de una aplicación pensada para realizar muchas operaciones de inserción y actualización, el número de lecturas de base de datos suele superar a las escrituras en un factor de 5 a 10.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. Por lo tanto, al especificar un factor de relleno distinto del predeterminado, se puede disminuir el rendimiento de las lecturas de base de datos en una cantidad inversamente proporcional al valor del factor de relleno.Therefore, specifying a fill factor other than the default can decrease database read performance by an amount inversely proportional to the fill-factor setting. Por ejemplo, un valor de factor de relleno igual a 50 puede hacer que el rendimiento de las lecturas de base de datos se reduzca a la mitad.For example, a fill-factor value of 50 can cause database read performance to decrease by two times. El rendimiento de las lecturas se reduce porque el índice contiene más páginas, con lo que se aumentan las operaciones de E/S de disco necesarias para recuperar los datos.Read performance is decreased because the index contains more pages, therefore increasing the disk IO operations required to retrieve the data.

Agregar datos al final de la tablaAdding Data to the End of the Table

Un factor de relleno distinto de cero o de cien puede ser conveniente para el rendimiento si los datos nuevos se distribuyen uniformemente en toda la tabla.A nonzero fill factor other than 0 or 100 can be good for performance if the new data is evenly distributed throughout the table. Sin embargo, si todos los datos se agregan al final de la tabla, el espacio vacío en las páginas de índice no se rellenará.However, if all the data is added to the end of the table, the empty space in the index pages will not be filled. Por ejemplo, si la columna de clave de índice es una columna IDENTITY, la clave de las nuevas filas siempre aumenta y las filas de índice se agregan lógicamente al final del índice.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. Si las filas existentes se van a actualizar con datos que hacen aumentar el tamaño de las filas, use un factor de relleno menor que 100.If existing rows will be updated with data that lengthens the size of the rows, use a fill factor of less than 100. Los bytes adicionales en cada página ayudarán a reducir las divisiones de página ocasionadas por la longitud extra de las filas.The extra bytes on each page will help to minimize page splits caused by extra length in the rows.

SeguridadSecurity

PermisosPermissions

Requiere el permiso ALTER en la tabla o la vista.Requires ALTER permission on the table or view. El usuario debe ser miembro del rol fijo de servidor sysadmin o de los roles fijos de base de datos db_ddladmin y db_owner .User must be a member of the sysadmin fixed server role or the db_ddladmin and db_owner fixed database roles.

Uso de SQL Server Management StudioUsing SQL Server Management Studio

Para especificar un factor de relleno con el Diseñador de tablasTo specify a fill factor by using Table Designer

  1. En el Explorador de objetos, haga clic en el signo más para expandir la base de datos que contiene la tabla en la que quiera especificar el factor de relleno de un índice.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. Haga clic en el signo más para expandir la carpeta Tablas .Click the plus sign to expand the Tables folder.

  3. Haga clic con el botón derecho en la tabla en la que quiere especificar el factor de relleno de un índice y seleccione Diseño.Right-click the table on which you want to specify an index's fill factor and select Design.

  4. En el menú Diseñador de tablas , haga clic en Índices o claves.On the Table Designer menu, click Indexes/Keys.

  5. Seleccione el índice con el factor de relleno que desea especificar.Select the index with the fill factor that you want to specify.

  6. Expanda Especificación de relleno, seleccione la fila Factor de relleno y escriba el factor de relleno que desee en la fila.Expand Fill Specification, select the Fill Factor row and enter the fill factor you want in the row.

  7. Haga clic en Cerrar.Click Close.

  8. En el menú Archivo , seleccione Guardarnombre_tabla.On the File menu, select Savetable_name.

Para especificar un factor de relleno en un índice mediante el Explorador de objetosTo specify a fill factor in an index by using Object Explorer

  1. En el Explorador de objetos, haga clic en el signo más para expandir la base de datos que contiene la tabla en la que quiera especificar el factor de relleno de un índice.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. Haga clic en el signo más para expandir la carpeta Tablas .Click the plus sign to expand the Tables folder.

  3. Haga clic en el signo más para expandir la tabla en la que quiere especificar el factor de relleno de un índice.Click the plus sign to expand the table on which you want to specify an index's fill factor.

  4. Haga clic en el signo más para expandir la carpeta Índices .Click the plus sign to expand the Indexes folder.

  5. Haga clic con el botón derecho en el índice con el factor de relleno que quiere especificar y seleccione Propiedades.Right-click the index with the fill factor that you want to specify and select Properties.

  6. Debajo de Seleccionar una página, seleccione Opciones.Under Select a page, select Options.

  7. En la fila Factor de relleno , escriba el factor de relleno que desee.In the Fill factor row, enter the fill factor that you want.

  8. Haga clic en Aceptar.Click OK.

Usar Transact-SQLUsing Transact-SQL

Para especificar un factor de relleno en un índice existenteTo specify a fill factor in an existing index

  1. En el Explorador de objetos, conéctese a una instancia del Motor de base de datosDatabase Engine.In Object Explorer, connect to an instance of Motor de base de datosDatabase Engine.

  2. En la barra de Estándar, haga clic en Nueva consulta.On the Standard bar, click New Query.

  3. Copie y pegue el siguiente ejemplo en la ventana de consulta y haga clic en Ejecutar.Copy and paste the following example into the query window and click Execute. En el ejemplo se vuelve a generar un índice existente y se aplica el factor de relleno especificado durante la operación de nueva generación.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  
    

Otra manera de especificar un factor de relleno de un índiceAnother way to specify a fill factor in an index

  1. En el Explorador de objetos, conéctese a una instancia del Motor de base de datosDatabase Engine.In Object Explorer, connect to an instance of Motor de base de datosDatabase Engine.

  2. En la barra de Estándar, haga clic en Nueva consulta.On the Standard bar, click New Query.

  3. Copie y pegue el siguiente ejemplo en la ventana de consulta y haga clic en Ejecutar.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  
    

Para obtener más información, vea ALTER INDEX (Transact-SQL).For more information, see ALTER INDEX (Transact-SQL).