Hace poco descubrí que una tabla de montón tenía más del 70% de fragmentación. Entonces decidí hacer un
ALTER TABLE dbo.myTable REBUILD
Curiosamente, después tuve un 20% de fragmentación. No había escrito en esa mesa desde entonces. Así que decidí hacer la reconstrucción una vez más.
Después de la segunda vez, la mesa tiene una fragmentación del 50%, ¡así que aún más! Realmente no entiendo cómo puede suceder esto ...
sql-server
fragmentation
heap
tuxmania
fuente
fuente
Respuestas:
¿Qué significa la fragmentación en un montón?
El valor de fragmentación en el montón que obtiene de la columna
avg_fragmentation_in_percent
al consultarsys.dm_db_index_physical_stats
DMV indica queAdemás, el mismo BOL dice que
Entonces puede ver que no es el espacio libre presente en las páginas asignadas a Heap sino la secuencia variable de páginas lo que crea la fragmentación.
Esto se puede demostrar mediante una pequeña prueba. Creemos una tabla de montón e inserte algunos registros en ella y luego verifiquemos la fragmentación.
Por lo tanto, la tabla del montón se crea con 50 registros. A continuación se muestra cómo se ve la fragmentación después de la consulta DMV sys.dm_db_index_physical stats
Puede ver
avg_fragmentation_in_percent
que el valor de la columna es 33%. Ahora veamos cómo están organizadas las páginas. Esto se puede hacer mediante la consulta no documentada%%lockres%%
. La consulta seríaY a continuación se muestra cómo se ve la salida. Adjuntando solo una parte relevante del mismo. La consulta produjo 50 filas ya que insertamos 50 filas en nuestra tabla dbo.HeapTest.
Lo que dice es que la primera página tiene ID,
197
la página siguiente tiene ID. Las242
páginas siguientes tienen ID continua hasta que alcanzamos la ID de la página264
porque después de eso obtenemos la ID de la página280
. Entonces, este salto en los números de ID de página es lo que realmente causa la fragmentación.Ahora no sea que reconstruya el montón y ejecute el comando nuevamente para ver la fragmentación y cómo se organizan las páginas. Obtenemos fragmentación como
Puedes ver que la fragmentación es ahora
14%
.Veamos los números de página asignados
Solo tenemos un salto de salto; todas las páginas tienen asignada la ID de página en serie. Dado que solo un salto la fragmentación disminuyó considerablemente.
Reconstruí el montón nuevamente y ahora, cuando verifiqué la fragmentación, desapareció por completo. Y la asignación de ID de página es como
Por qué aumentó la fragmentación
Ahora, con respecto a lo que podría haber causado el aumento de la fragmentación, podemos corroborarlo al hecho de que cuando las páginas se asignaban al montón, no serían continuas, como se vio anteriormente, lo que causó que el valor de la fragmentación aumentara fue el salto en la ID de PÁGINA asignada a las páginas.
En la parte posterior de la cabeza, también debe tener en cuenta que la palabra fragmentación para HEAP no tiene ningún significado, ¿cómo definiría la fragmentación para un montón de páginas no ordenadas?
Realmente preocupado por la fragmentación
Si realmente enfrenta un escenario en el que la tabla de montón está fragmentada y ralentiza las consultas, sería mejor crear un índice agrupado en la tabla que reconstruirlo. La razón es que cuando reconstruye el montón todos los índices subyacentes no agrupados también se reconstruyen, lo que hace que el proceso de reconstrucción tarde mucho más tiempo, utilizando muchos recursos y un registro de transacciones hinchado. En un sistema de producción, uno siempre trataría de evitar esto. Paul cubrió esto en su Sección de Mitos sobre el montón .
PD: No utilices comandos no documentados en el sistema de producción. Esto fue solo para demostración.
fuente
Heaptest
y dé el resultado. Estoy seguro de que te habrás perdido algo. Solo asegúrese de que el nivel de compatibilidad no sea 80 en ese caso, la función db_id no funcionará