Comportamiento de datos en índices basados ​​en factor de relleno

14

Supongamos que tiene una base de datos donde el factor de relleno predeterminado es 20. Cada vez que se insertan datos, ¿solo crea páginas llenas hasta un 20%?

Según tengo entendido, cuando se inserten los datos habrá aproximadamente el 20% de los datos en las páginas. Sin embargo, cuando se actualizan los datos, se expandirá a más del 20% del índice, hasta llenarlo y generar una división de página, ¿verdad?

DForck42
fuente

Respuestas:

16

El factor de relleno solo entra en juego cuando se crea o reconstruye un índice. Es la cantidad de consumo para el índice de las páginas a nivel de hoja que se llenan durante estas operaciones. ( consulte la nota a continuación para obtener más aclaraciones sobre los niveles de página afectados )

Cuando hay un comando DML a los datos ( INSERT, UPDATEy / o DELETE), que pasará a los índices afectados correspondientes. En otras palabras, si tiene una página que está llena en un 20% e inserta datos en esa página, la página contendrá más del 20% de los datos (digamos 35% solo por el simple hecho). Haga otra inserción, ahora la página está llena en un 64%. Reconstruya el índice, y las páginas a nivel de hoja ahora contendrán relativamente el porcentaje de espacio que especifique (o implícitamente el valor predeterminado para el servidor).

( Tenga en cuenta que , cuando no especifica PAD_INDEXser ON, el factor de relleno solo se aplica a las páginas de nivel de hoja. Pero cuando configura PAD_INDEX = ON, el factor de relleno se tendrá en cuenta para las páginas de nivel intermedio del índice. El valor predeterminado esOFF )

La razón para ajustar el factor de relleno (en lugar de usar el valor predeterminado 100/0) es para minimizar las divisiones de página al insertar o actualizar datos. Pero tenga en cuenta que nada es gratis. Cuanto menor sea el factor de relleno, más espacio ocuparán normalmente los datos. Si mantiene un espacio de página libre del 80% para sus índices, consumirán una cantidad relativamente mayor de espacio en disco, lo que puede generar más lecturas.

Según tengo entendido, cuando se inserten los datos habrá aproximadamente el 20% de los datos en las páginas. Sin embargo, cuando se actualizan los datos, se expandirá a más del 20% del índice, hasta llenarlo y generar una división de página, ¿verdad?

Cuando se insertan datos, se insertarán en los índices apropiados en la página correspondiente. Esto podría y muy probablemente causaría que el consumo de la página sea mayor que el factor de relleno.

Se producirá una división de página cuando se agreguen nuevos datos a una página de índice completa. SQL Server dividirá la página y colocará aproximadamente la mitad de los datos de la página completa en una nueva página. Nuevamente, el factor de relleno no entra en juego aquí.

Una razón legítima para reducir el factor de relleno sería minimizar las divisiones de página y, por lo tanto, minimizar la fragmentación de la página de índice.

Thomas Stringer
fuente
3
También minimiza las operaciones de E / S necesarias para crecer o asignar espacio.
JNK
OK, entonces estaba equivocado en cómo funcionaba el comportamiento. ¡Gracias por una respuesta tan detallada!
DForck42
1
@ DForck42 No hay problema, me alegra ayudarlo.
Thomas Stringer el
¿Podemos resumir esto para decir que establecer un factor de relleno bajo tenderá a lecturas lentas (más páginas) pero insertos de velocidad (menos divisiones)?
Jon of All Trades
2
@ Jon: con un factor de relleno alto, los índices de fragmentos y las lecturas se ralentizan. Para cada índice hay un factor de relleno óptimo: encima y debajo escribe y lee lentamente. La optimización depende de los patrones de uso (cuántas inserciones por día), los patrones de mantenimiento (con qué frecuencia se reconstruye), los datos (cuán única es la clave). Los índices no únicos tienden a requerir más espacio libre (factor de relleno inferior).
wqw