Considere um índice da árvore B com um valor que sempre aumentará monotonicamente, por exemplo, uma coluna do tipo IDENTITY. Com uma implementação convencional da árvore B, sempre que um nó estiver cheio, ele será dividido em 50% / 50% e terminaremos com uma árvore B na qual (quase) todos os nós estarão apenas 50% cheios.
Eu sei que a Oracle descobre quando um valor está sempre aumentando e, nesses casos, a Oracle realiza uma divisão de 90% / 10%. Dessa forma, (quase) todos os nós estarão 90% cheios e uma utilização de página muito melhor será obtida para esses casos bastante comuns.
Não consegui encontrar documentação para um recurso semelhante no SQL Server. No entanto, realizei duas experiências nas quais inseri N números aleatórios e N números consecutivos em um índice, respectivamente. O primeiro caso usou muito mais páginas do segundo.
O SQL Server fornece uma funcionalidade semelhante? Em caso afirmativo: você pode me indicar alguma documentação sobre esse recurso?
ATUALIZAÇÃO: Parece, pelas experiências fornecidas abaixo, que os nós das folhas são mantidos sem divisão e os nós internos são divididos em 50% / 50%. Isso torna as árvores B ao aumentar as chaves mais compactas do que nas chaves aleatórias. No entanto, a abordagem de 90% / 10% da Oracle é ainda melhor e ainda procuro alguma documentação oficial que possa verificar o comportamento observado nas experiências.
fonte
Respostas:
Se estiver adicionando uma linha no final do índice, apenas alocará uma nova página para a linha, em vez de dividir a página final atual. A evidência experimental para isso está abaixo (usa a
%%physloc%%
função que requer o SQL Server 2008). Veja também a discussão aqui .Retornos (seus resultados variam)
Porém, isso parece se aplicar apenas aos nós das folhas. Isso pode ser visto executando o abaixo e ajustando o
TOP
valor. Para mim,622/623
foi o ponto de corte entre exigir uma e duas páginas de primeiro nível (pode variar se o isolamento de instantâneo estiver ativado?). Ele divide a página de maneira equilibrada, levando ao desperdício de espaço nesse nível.fonte
PRIMARY KEY
.DBCC IND
esys.dm_db_index_physical_stats
ver informações sobre eles.