Как оценить размеры индекса SQL Server

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
0
5 946
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

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

Обновлено: Эта ссылка MSDN описывает структуры уровня страницы, хотя немного освещает формат отдельных строк индекса. Эта презентация в некоторой степени переходит в физический формат записей журнала диска и страниц данных. Этот более подробно и включает в себя структуры данных индекса. Числовые столбцы и столбцы фиксированной длины имеют размер, указанный на коробке; вам нужно будет оценить средний размер столбцов varchar.

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

Не могли бы вы сослаться на какую-нибудь документацию для получения этой информации? Благодарность

icelava 07.10.2008 13:06

Забудьте о 16 байтах. Я думал об Oracle. В третьем справочнике по SQL Server это подробно рассматривается.

ConcernedOfTunbridgeWells 07.10.2008 17:36

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

Другие вопросы по теме