Compartilhar via


Estimar o tamanho de um índice clusterizado

Aplica-se a:SQL ServerBanco de Dados SQL do AzureInstância Gerenciada de SQL do AzureBanco de dados SQL no Microsoft Fabric

Você pode usar as seguintes etapas para estimar a quantidade de espaço exigida para armazenar dados em um índice clusterizado:

  1. Calcule o espaço usado para armazenar dados no nível folha do índice clusterizado.
  2. Calcule o espaço usado para armazenar as informações de índice para o índice clusterizado.
  3. Some os valores calculados.

Etapa 1. Calcular o espaço usado para armazenar dados no nível folha

  1. Especifique o número de linhas presentes na tabela:

    • Num_Rows = número de linhas na tabela
  2. Especifique o número de colunas de comprimento fixo e variável e calcule o espaço necessário para o seu armazenamento:

    Calcule o espaço que cada um desses grupos de colunas ocupa dentro da linha de dados. O tamanho de uma coluna depende do tipo de dados e da especificação de comprimento.

    • Num_Cols = número total de colunas (comprimento fixo e tamanho variável)
    • Fixed_Data_Size = tamanho total em bytes de todas as colunas de tamanho fixo
    • Num_Variable_Cols = número de colunas de tamanho variável
    • Max_Var_Size = tamanho máximo em bytes de todas as colunas de comprimento variável
  3. Se o índice clusterizado não for único, considere a coluna uniqueifier.

    O identificador de exclusividade é uma coluna de comprimento variável que permite valor nulo. Ele não é nulo e tem 4 bytes de tamanho em linhas que têm valores de chave não específicos. Esse valor faz parte da chave de índice e é necessário para garantir que cada linha tenha um valor de chave exclusivo.

    • = Num_ColsNum_Cols + 1
    • = Num_Variable_ColsNum_Variable_Cols + 1
    • = Max_Var_SizeMax_Var_Size + 4

    Essas modificações pressupõem que todos os valores não sãouniques.

  4. Parte da linha, conhecida como bitmap nulo, é reservada para gerenciar a nulabilidade da coluna. Calcule seu tamanho:

    • Null_Bitmap = 2 + ((Num_Cols + 7) / 8)

    Somente a parte de inteiro da expressão anterior deve ser usada; descarte todo o restante.

  5. Calcule o tamanho dos dados de comprimento variável:

    Se houver colunas de comprimento variável na tabela, determine quanto espaço será usado para armazenar as colunas dentro da linha:

    • Variable_Data_Size = 2 + (Num_Variable_Cols x 2) + Max_Var_Size

    Os bytes adicionados a Max_Var_Size são para acompanhar cada coluna de variáveis. Essa fórmula presume que todas as colunas de comprimento variável estão 100% completas. Se você prevê que um percentual menor do espaço de armazenamento da coluna de tamanho variável será usado, pode ajustar o valor Max_Var_Size de acordo com esse percentual para obter uma estimativa mais precisa do tamanho geral da tabela.

    É possível combinar colunas varchar, nvarchar, varbinaryou sql_variant que fazem com que a largura total da tabela definida exceda 8.060 bytes. O tamanho de cada uma dessas colunas ainda deve ficar dentro do limite de 8.000 bytes para uma coluna varchar, varbinaryou sql_variant e 4.000 bytes para colunas nvarchar . No entanto, suas larguras combinadas podem exceder o limite de 8.060 bytes em uma tabela.

    Se não houver colunas de tamanho variável, defina Variable_Data_Size como 0.

  6. Calcule o tamanho total da linha:

    • Tamanho_da_Linha = Tamanho_dados_fixos + Tamanho_dados_variáveis + Mapa_de_nulos + 4

    O valor 4 é a sobrecarga de cabeçalho de uma linha de dados.

  7. Calcular o número de linhas por página (8.096 bytes gratuitos por página):

    • Rows_Per_Page = 8096 / (Row_Size + 2)

    Como as linhas não abrangem páginas, o número de linhas por página deve ser arredondado para baixo até a linha inteira mais próxima. O valor 2 na fórmula é para a entrada da linha na matriz de slot da página.

  8. Calcule o número de linhas livres reservadas por página, com base no fator de preenchimento especificado:

    • Free_Rows_Per_Page = 8096 x ((100 - Fill_Factor) / 100) / (Row_Size + 2)

    O fator de preenchimento usado no cálculo é um valor inteiro, em vez de uma porcentagem. Como as linhas não abrangem páginas, o número de linhas por página deve ser arredondado para baixo até a linha inteira mais próxima. À medida que o fator de preenchimento aumenta, mais dados são armazenados em cada página e há menos páginas. O valor 2 na fórmula é para a entrada da linha na matriz de slot da página.

  9. Calcule o número de páginas necessário para armazenar todas as linhas:

    • Num_Leaf_Pages = Num_Rows / (Rows_Per_Page - Free_Rows_Per_Page)

    O número de páginas estimado deve ser arredondado para cima, até a página inteira mais próxima.

  10. Calcule a quantidade de espaço necessária para armazenar os dados no nível folha (8.192 bytes totais por página):

    • Leaf_space_used = 8192 x Num_Leaf_Pages

Etapa 2. Calcular o espaço usado para armazenar informações de índice

Você pode usar as seguintes etapas para estimar a quantidade de espaço necessária para armazenar os níveis superiores do índice:

  1. Especifique o número de colunas de comprimento fixo e variável na chave do índice e calcule o espaço necessário para seu armazenamento:

    As colunas de chave de um índice podem incluir colunas de comprimento fixo e variável. Para estimar o tamanho da linha de índice no nível interior, calcule o espaço que cada um desses grupos de colunas ocupa na linha do índice. O tamanho de uma coluna depende do tipo de dados e da especificação de comprimento.

    • Num_Key_Cols = número total de colunas de chaves (tamanho fixo e tamanho variável)
    • Fixed_Key_Size = tamanho total em bytes de todas as colunas de chaves de tamanho fixo
    • Num_Variable_Key_Cols = número de colunas de chaves de tamanho variável
    • Max_Var_Key_Size = tamanho máximo em bytes de todas as colunas de chaves de tamanho variável
  2. Considere qualquer identificador de unicidade necessário se o índice não for único.

    O identificador de exclusividade é uma coluna de comprimento variável que permite valor nulo. Não é nulo e tem 4 bytes de tamanho em linhas que têm valores de chave de índice não exclusivos. Esse valor faz parte da chave de índice e é necessário para garantir que cada linha tenha um valor de chave exclusivo.

    • Num_Key_Cols = Num_Key_ColsNum_Key_Cols + 1
    • Num_Variable_Key_Cols = Num_Variable_Key_ColsNum_Variable_Key_Cols + 1
    • = Max_Var_Key_SizeMax_Var_Key_Size + 4

    Essas modificações pressupõem que todos os valores não sãouniques.

  3. Calcule o tamanho do bitmap nulo:

    Se houver colunas que permitem valor nulo na chave de índice, parte da linha do índice será reservada para o bitmap nulo. Calcule seu tamanho:

    • Index_Null_Bitmap = 2 + ([número de colunas na linha de índice + 7] / 8)

    Somente a parte do inteiro da expressão anterior deve ser usada. Descarte todo o restante.

    Se não houver colunas de chave anuláveis, defina Index_Null_Bitmap como 0.

  4. Calcule o tamanho dos dados de comprimento variável:

    Se houver colunas de comprimento variável no índice, determine quanto espaço será usado para armazenar as colunas dentro da linha do índice:

    • Variable_Key_Size = 2 + (Num_Variable_Key_Cols x 2) + Max_Var_Key_Size

    Os bytes adicionados a Max_Var_Key_Size são para acompanhamento de cada coluna de comprimento variável. Essa fórmula presume que todas as colunas de comprimento variável estão 100% completas. Se você previr que um percentual menor do espaço de armazenamento de coluna de tamanho variável será usado, poderá ajustar o valor Max_Var_Key_Size com esse percentual para obter uma estimativa mais precisa do tamanho geral da tabela.

    Se não houver colunas de tamanho variável, defina Variable_Key_Size como 0.

  5. Calcule o tamanho da linha de índice:

    • Index_Row_Size = Fixed_Key_Size + Variable_Key_Size + Index_Null_Bitmap + 1 (para a sobrecarga de cabeçalho de linha de uma linha de índice) + 6 (para o ponteiro de ID da página filho)
  6. Calcular o número de linhas de índice por página (8.096 bytes gratuitos por página):

    • Index_Rows_Per_Page = 8096 / (Index_Row_Size + 2)

    Como as linhas de índice não abrangem páginas, o número de linhas de índice por página deve ser arredondado para baixo até a linha inteira mais próxima. O 2 na fórmula é para a entrada da linha no array de slots da página.

  7. Calcule o número de níveis no índice:

    • Níveis_não_folha = 1 + log (Linhas_Índice_Por_Página) (Núm_Páginas_Folha / Linhas_Índice_Por_Página)

    Arredonde esse valor até o número inteiro mais próximo. Esse valor não inclui o nível folha do índice clusterizado.

  8. Calcule o número de páginas não-folha no índice.

    • Num_Index_Pages = ∑Level (Num_Leaf_Pages / (Index_Rows_Per_Page^Nível))

      em que 1 <= Level <= Non-leaf_Levels

    Arredonde cada soma até o número inteiro mais próximo. Como um exemplo simples, considere um índice em que Num_Leaf_Pages = 1000 e Index_Rows_Per_Page = 25. O primeiro nível de índice acima do nível folha armazena mil linhas de índice, sendo uma linha de índice para cada página de folha, e 25 linhas de índice cabem em cada página. Isso significa que 40 páginas são necessárias para armazenar essas 1.000 linhas de índice. O próximo nível do índice precisa armazenar 40 linhas. Isso significa que ele requer duas páginas. O nível final do índice deve armazenar duas linhas. Isso significa que requer uma página. Isso fornece 43 páginas de índice não folha. Quando esses números são usados nas fórmulas anteriores, o resultado é o seguinte:

    • Nível_Não_Folha = 1 + log(25) (1000 / 25) = 3

    • Num_Index_Pages = 1000/(25^3)+ 1000/(25^2) + 1000/(25^1) = 1 + 2 + 40 = 43, que é o número de páginas descrito no exemplo.

  9. Calcular o tamanho do índice (8.192 bytes totais por página):

    • Espaço_de_Índice_Usado = 8192 x Num_de_Páginas_do_Índice

Etapa 3. Total dos valores calculados

Some os valores obtidos nas duas etapas anteriores:

  • Tamanho do índice clusterizado (bytes) = Leaf_Space_Used + Index_Space_used

Esse cálculo não considera as seguintes condições:

  • Particionamento: a sobrecarga de espaço do particionamento é mínima, mas complexa de calcular. Não é importante incluir.

  • Páginas de alocação: há pelo menos uma página IAM usada para acompanhar as páginas alocadas para um heap. A sobrecarga de espaço é mínima e não há nenhum algoritmo para calcular deterministicamente exatamente quantas páginas IAM serão usadas.

  • Valores de Objeto Grande (LOB): O algoritmo para determinar exatamente quanto espaço será usado para armazenar os tipos de dados LOB varchar(max), varbinary(max), nvarchar(max), text, ntext, xml e image é complexo. É suficiente apenas adicionar o tamanho médio dos valores LOB esperados, multiplicar por Num_Rows e adicioná-lo ao tamanho total do índice clusterizado.

  • Compactação: você não pode pré-calcular o tamanho de um índice compactado.

  • Colunas esparsas: para obter informações sobre os requisitos de espaço de colunas esparsas, consulte Usar colunas esparsas.