Pergunta

Enquanto a estimativa do tamanho da linha e da mesa é bastante simples, achamos difícil adivinhar quanto espaço cada índice ocupará (para um determinado tamanho de tabela). Que áreas podemos aprender a calcular uma melhor estimativa e taxa de crescimento para índices?

Foi útil?

Solução

Uma folha de índice possui um preâmbulo identificando a página de dados (7 bytes mais algumas informações de diretório para colunas de comprimento variável, se houver), além de uma cópia do (s) valor (s) da chave, que será do mesmo tamanho que os dados da tabela para essas colunas. Há um para cada linha na tabela. Os níveis mais altos do índice são muito menores, geralmente menos de 1% das folhas, a menos que você esteja indexando uma chave muito ampla.

O fator de preenchimento deixa algum espaço livre para que as atualizações e inserções não gerem tráfego excessivo de divisão de folhas.

EDITAR: Este link MSDN Descreve as estruturas no nível da página, embora seja um pouco leve no formato das linhas de índice individuais. Esta apresentação entra no formato físico de entradas de log de disco e páginas de dados até certo ponto. Este Mais detalhes e inclui as estruturas de dados do índice. As colunas numéricas e de comprimento fixo têm o tamanho que diz na caixa; Você teria que estimar o tamanho médio das colunas VARCHAR.

Para referência, alguns documentos no formato de bloco da Oracle podem ser encontrados Aqui e Aqui.

Outras dicas

Quando possível, geralmente pego 1000 registros da tabela original, insira -os na minha própria mesa e, com o script abaixo, tenho uma amostra para brincar.

Ok, não é preciso, mas pode me dar um ponto de partida.

--Find out the disk size of an index:
--USE [DB NAME HERE]
go
SELECT
OBJECT_NAME(I.OBJECT_ID) AS TableName,
I.name AS IndexName,   
8 * SUM(AU.used_pages) AS 'Index size (KB)',
CAST(8 * SUM(AU.used_pages) / 1024.0 AS DECIMAL(18,2)) AS 'Index size (MB)'
FROM
sys.indexes I
JOIN sys.partitions P ON P.OBJECT_ID = I.OBJECT_ID AND P.index_id = I.index_id
JOIN sys.allocation_units AU ON AU.container_id = P.partition_id
--WHERE 
--    OBJECT_NAME(I.OBJECT_ID) = '<TableName>'    
GROUP BY
I.OBJECT_ID,    
I.name
ORDER BY
TableName

--========================================================================================

--http://msdn.microsoft.com/en-us/library/fooec9de780-68fd-4551-b70b-2d3ab3709b3e.aspx

--I believe that keeping the GROUP BY 
--is the best option in this case
--because of sys.allocation_units
--can have 4 types of data inside
--as below:

--type tinyint
--Type of allocation unit.
--0 = Dropped
--1 = In-row data (all data types, except LOB data types)
--2 = Large object (LOB) data (text, ntext, image, xml, large value types, and CLR     user-defined types)
--3 = Row-overflow data

--marcelo miorelli 8-NOV-2013
--========================================================================================
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top