2008-10-07 7 views
3

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

ответ

6

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

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

EDIT: This MSDN link описывает структуры уровня страницы, хотя это немного облегчает формат отдельных строк индекса. This presentation в какой-то степени входит в физический формат записей журнала диска и данных. This one более подробно и включает в себя структуры данных индекса. Числовые столбцы с фиксированной длиной имеют размер, указанный в поле; вам нужно будет оценить средний размер столбцов varchar.

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

+0

Не могли бы вы ссылаться на некоторые документы для этой информации? спасибо – icelava 2008-10-07 09:06:48

1

Если возможно, я обычно беру 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 
--======================================================================================== 

 Смежные вопросы

  • Нет связанных вопросов^_^