Как оценить размеры индекса SQL Server - PullRequest
4 голосов
/ 07 октября 2008

Несмотря на то, что оценивать размеры строк и таблиц довольно просто, нам трудно угадать, сколько места будет занимать каждый индекс (для данного размера таблицы). В каких областях мы можем научиться рассчитывать лучшую оценку и скорость роста индексов?

Ответы [ 2 ]

6 голосов
/ 07 октября 2008

В индексном листе есть преамбула, идентифицирующая страницу данных (7 байт плюс некоторая информация каталога для столбцов переменной длины, если таковые имеются), а также копия значения ключа, которое будет иметь тот же размер, что и данные таблицы для этих столбцов. колонны. Есть один для каждой строки в таблице. Верхние уровни индекса намного меньше, обычно менее 1% листьев, если вы не индексируете очень широкий ключ.

Коэффициент заполнения оставляет свободное пространство, поэтому обновления и вставки не генерируют чрезмерный трафик разбиения листа.

РЕДАКТИРОВАТЬ: Эта ссылка MSDN описывает структуры уровня страницы, хотя это немного светит формат отдельных строк индекса. Эта презентация в некоторой степени входит в физический формат записей журнала диска и страниц данных. Это более подробно и включает в себя структуры данных индекса. Числовые столбцы и столбцы фиксированной длины имеют размер, указанный на коробке; Вы должны были бы оценить средний размер столбцов varchar.

Для справки, некоторые документы по блочному формату Oracle можно найти Здесь и Здесь .

1 голос
/ 23 мая 2014

когда это возможно, я обычно беру 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
--========================================================================================
...