是否可以在行存储索引后面公开 B 树的最大深度,或者查看特定查询遍历了多少个节点的方法?

J.D*_*.D. 2 index tree sql-server btree sql-server-2016

我个人对数据结构很感兴趣,并且知道行存储索引存储在它们后面的 B 树,我总是很好奇尝试可视化那些 B 树对于给定表/索引的样子。

有没有办法通过执行计划、统计信息、运算符属性、索引/表属性等关联或公开给定行存储索引的 B 树中的节点数?

此外,我可以做同样的事情来确定特定查询遍历的节点数吗?

如果有一种方法也可以确定 B 树中的叶节点数,则加分。

小智 5

可以在 DMF dm_db_index_physical_stats() 中找到一些此类信息,例如索引深度。可以在其中找到的一些外部有趣信息是使用的数据页数和碎片级别。我个人使用以下查询来获取当前数据库的索引状态

SELECT OBJECT_NAME(ind.OBJECT_ID) AS TableName,  
ind.name AS IndexName, 
ixs.index_type_desc, 
ixs.index_depth, 
ixs.page_count, 
ixs.avg_fragmentation_in_percent
FROM sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, NULL) ixs 
INNER JOIN sys.indexes ind 
ON ind.object_id = ixs.object_id AND ind.index_id = ixs.index_id;
Run Code Online (Sandbox Code Playgroud)

有关此 DMF 的更多信息,请访问https://docs.microsoft.com/en-us/sql/relational-databases/system-dynamic-management-views/sys-dm-db-index-physical-stats-transact -sql?view=sql-server-ver15