由于数据库数据在 B-tree 中以 8k 页的形式组织,对于 PK 信息信息也是如此,因此数据库中的每个表都应该可以计算 B-Tree 的高度。从而揭示到达某些数据需要多少跳跃。
由于行大小和 PK 大小都非常重要,因此很难计算,因为例如 varchar(250)
不需要占用 250 个字节。
1) 有没有办法从 SQL Server 中获取信息?2)如果没有,是否可以使用一些分析数据库表的代码来粗略估计?
由于数据库数据在 B-tree 中以 8k 页的形式组织,对于 PK 信息信息也是如此,因此数据库中的每个表都应该可以计算 B-Tree 的高度。从而揭示到达某些数据需要多少跳跃。
由于行大小和 PK 大小都非常重要,因此很难计算,因为例如 varchar(250)
不需要占用 250 个字节。
1) 有没有办法从 SQL Server 中获取信息?2)如果没有,是否可以使用一些分析数据库表的代码来粗略估计?
是的!当然!
查看 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 内部工作的好方法!
试试这个:
SELECT INDEXPROPERTY(OBJECT_ID('table_name'), 'index_name', 'IndexDepth')
(Average Number of elements that fit in one Leaf-node) * n ^ (depth - 1)