7

由于数据库数据在 B-tree 中以 8k 页的形式组织,对于 PK 信息信息也是如此,因此数据库中的每个表都应该可以计算 B-Tree 的高度。从而揭示到达某些数据需要多少跳跃。

由于行大小和 PK 大小都非常重要,因此很难计算,因为例如 varchar(250)不需要占用 250 个字节。

1) 有没有办法从 SQL Server 中获取信息?2)如果没有,是否可以使用一些分析数据库表的代码来粗略估计?

4

3 回答 3

12

是的!当然!

查看 SQL Server 中的DMV = 动态管理视图- 它们包含有关您的索引的信息宝库。这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 内部工作的好方法!

于 2012-01-24T19:57:51.857 回答
3

试试这个:

SELECT INDEXPROPERTY(OBJECT_ID('table_name'), 'index_name', 'IndexDepth')
于 2012-01-24T19:09:28.110 回答
0

n 阶的 B 树中可以容纳多少个元素?

 (Average Number of elements that fit in one Leaf-node) * n ^ (depth - 1)
于 2012-01-26T08:42:37.447 回答