Pregunta

Si bien la estimación de los tamaños de filas y tablas rectas son matemáticas bastante simples, nos resulta difícil adivinar cuánto espacio ocupará cada índice (para un tamaño de tabla determinado). ¿En qué áreas podemos aprender a calcular una mejor estimación y tasa de crecimiento para los índices?

¿Fue útil?

Solución

Una hoja de índice tiene un preámbulo que identifica la página de datos (7 bytes más información de directorio para columnas de longitud variable, si corresponde) más una copia de los valores clave que serán del mismo tamaño que los datos de la tabla para aquellos columnas Hay uno para cada fila en la tabla. Los niveles más altos del índice son mucho más pequeños, generalmente menos del 1% de las hojas, a menos que esté indexando una clave muy amplia.

El factor de relleno deja algo de espacio libre para que las actualizaciones e inserciones no generen un tráfico excesivo de división de hojas.

EDITAR: Este enlace de MSDN describe las estructuras de nivel de página, aunque es un poco ligero en el formato de las filas de índice individuales. Esta presentación va en el formato físico de las entradas de registro de disco y las páginas de datos en cierta medida. Este más detalles e incluye el índice estructuras de datos. Las columnas numéricas y de longitud fija tienen el tamaño que dice en la caja; tendría que estimar el tamaño promedio de las columnas varchar.

Como referencia, se pueden encontrar algunos documentos en formato de bloque de Oracle Aquí y Aquí .

Otros consejos

cuando sea posible, generalmente tomo 1000 registros de la tabla original, insertarlos en mi propia mesa, y con el script a continuación tengo una muestra para jugar.

Ok, no es preciso, pero me puede dar un punto 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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top