Considere un índice de árbol B en un valor que siempre aumentará monotónicamente, por ejemplo, una columna de tipo IDENTIDAD. Con una implementación convencional de árbol B, cada vez que un nodo está lleno, se dividirá 50% / 50% y terminaremos con un árbol B en el que (casi) todos los nodos estarán llenos solo un 50%.
Sé que Oracle descubre cuándo un valor aumenta constantemente y, en estos casos, Oracle realiza una división del 90% / 10%. De esa manera, (casi) todos los nodos estarán llenos al 90% y se obtendrá una mejor utilización de la página para estos casos, bastante comunes.
No he podido encontrar documentación para una característica similar en SQL Server. Sin embargo, he realizado dos experimentos en los que inserté N enteros aleatorios y N enteros consecutivos en un índice, respectivamente. El primer caso usó muchas más páginas que el segundo.
¿SQL Server proporciona una funcionalidad similar? Si es así: ¿puede indicarme alguna documentación sobre esta función?
ACTUALIZACIÓN: Según los experimentos que se proporcionan a continuación, parece que los nodos hoja se mantienen sin dividir y los nodos internos se dividen en un 50% / 50%. Eso hace que los árboles B en claves crecientes sean más compactos que en claves aleatorias. Sin embargo, el enfoque de 90% / 10% de Oracle es aún mejor, y todavía busco alguna documentación oficial que pueda verificar el comportamiento visto en los experimentos.
fuente
Respuestas:
Si agrega una fila al final del índice, solo asignará una nueva página para la fila en lugar de dividir la página final actual. A continuación se encuentra evidencia experimental de esto (usa la
%%physloc%%
función que requiere SQL Server 2008). Vea también la discusión aquí .Devoluciones (sus resultados variarán)
Sin embargo, esto solo parece aplicarse a los nodos hoja. Esto se puede ver ejecutando lo siguiente y ajustando el
TOP
valor. Para mí,622/623
fue el punto de corte entre requerir una y dos páginas de primer nivel (¿podría variar si tiene habilitado el aislamiento de instantáneas?). Divide la página de manera equilibrada, lo que genera un desperdicio de espacio en este nivel.fuente
PRIMARY KEY
.DBCC IND
ysys.dm_db_index_physical_stats
para ver información sobre estos.