Нахождение высоты B-дерева таблицы в SQL Server

Поскольку данные базы данных организованы в виде 8-килобайтных страниц в B-дереве, а также для информации о PK, должна быть возможность для каждой таблицы в базе данных вычислить высоту B-дерева. Таким образом, выявляется, сколько прыжков требуется для достижения определенных данных.

Поскольку и размер строки, и размер PK имеют большое значение, его трудно вычислить, поскольку, например, varchar(250) не обязательно должен занимать 250 байт.

1) Есть ли способ получить информацию из SQL Server? 2) если нет, то можно ли дать приблизительную оценку, используя какой-нибудь код, анализирующий таблицы БД?


person Carlo V. Dango    schedule 24.01.2012    source источник
comment
Вам вообще нужно знать высоту? Разве не произвольный доступ в структуре B-дерева примерно O(log n) независимо?   -  person Yuck    schedule 24.01.2012
comment
Ну, я видел примеры действительно больших первичных ключей... например, 2 x GUID + 2 int. Было бы интересно увидеть штраф, поскольку на каждой странице индекса может храниться гораздо меньше ключей.   -  person Carlo V. Dango    schedule 24.01.2012
comment
Имейте в виду, что только таблицы с кластеризованными индексами хранятся в виде B-деревьев, если кластерного индекса нет, то таблица хранится в виде кучи. Итак, что вы действительно хотите знать, так это какова высота B-дерева для кластеризованного индекса, поэтому ответ ниже для dm_db_index_physical_stats.   -  person Pam Lahoud    schedule 25.01.2012


Ответы (3)


ДА! Конечно!

Ознакомьтесь с DMV = динамические представления управления в SQL Server — они содержат кладезь информации о ваших индексах. dm_db_index_physical_stats особенно полезен для просмотра свойств индекса...

Если вы запустите этот запрос в AdventureWorks для самой большой таблицы — Sales.SalesOrderDetails с более чем 200 000 строк — вы получите некоторые данные:

SELECT 
    index_depth,
    index_level,
    record_count,
    avg_page_space_used_in_percent,
    min_record_size_in_bytes,
    max_record_size_in_bytes,
    avg_record_size_in_bytes
FROM
    sys.dm_db_index_physical_stats(DB_ID(), OBJECT_ID('Sales.SalesOrderDetail'), 1, NULL, 'DETAILED')

Вы получите вывод для всех уровней индекса, так что сразу увидите, сколько уровней в индексе (у меня три строки -> три уровня в индексе). Уровень индекса 0 всегда является конечным уровнем, где в кластеризованном индексе (index_id = 1) у вас есть фактические страницы данных.

введите здесь описание изображения

Вы можете увидеть средний, минимальный и максимальный размер записи в байтах, а также много дополнительной информации — прочитайте DMV, это отличный способ диагностировать и заглянуть во внутреннюю работу SQL Server!

person marc_s    schedule 24.01.2012
comment
Не могли бы вы посоветовать, каков размер заказа этого индекса дерева B? И как SQL-сервер определяет, какой размер ордера использовать? Это просто с точки зрения любопытства. - person Johnny_D; 31.03.2017

попробуй это:

SELECT INDEXPROPERTY(OBJECT_ID('table_name'), 'index_name', 'IndexDepth')
person kuba    schedule 24.01.2012

из Сколько элементов может храниться в B-дерево порядка n?

 (Average Number of elements that fit in one Leaf-node) * n ^ (depth - 1)
person Carlo V. Dango    schedule 26.01.2012