Хотя оценка размеров прямых строк и таблиц - это довольно простая математика, нам сложно угадать, сколько места будет занимать каждый индекс (для данного размера таблицы). Какие области мы можем изучить для расчета более точной оценки и темпов роста индексов?





Лист индекса имеет преамбулу, идентифицирующую страницу данных (7 байтов плюс некоторая информация каталога для столбцов переменной длины, если таковые имеются) плюс копия значения (значений) ключа, которое будет того же размера, что и данные таблицы для этих столбцов. По одному на каждую строку в таблице. Верхние уровни индекса намного меньше, обычно менее 1% листьев, если вы не индексируете очень широкий ключ.
Коэффициент заполнения оставляет некоторое пространство свободным, поэтому обновления и вставки не создают чрезмерного трафика разделения листьев.
Обновлено: Эта ссылка MSDN описывает структуры уровня страницы, хотя немного освещает формат отдельных строк индекса. Эта презентация в некоторой степени переходит в физический формат записей журнала диска и страниц данных. Этот более подробно и включает в себя структуры данных индекса. Числовые столбцы и столбцы фиксированной длины имеют размер, указанный на коробке; вам нужно будет оценить средний размер столбцов varchar.
Для справки можно найти некоторые документы по формату блоков Oracle Здесь и Здесь.
Забудьте о 16 байтах. Я думал об Oracle. В третьем справочнике по SQL Server это подробно рассматривается.
по возможности я обычно беру 1000 записей из исходной таблицы, вставляю их в мою таблицу, и со сценарием ниже у меня есть образец, с которым можно поиграть.
Хорошо, это не совсем точно, но может дать мне отправную точку.
--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
--========================================================================================
Не могли бы вы сослаться на какую-нибудь документацию для получения этой информации? Благодарность