SQL Server 2008:如何统计数据库所有表的索引?是否有内置存储过程?
统计SQL Server 2008中所有表的索引数量及相关方案
嘿,关于你在SQL Server 2008环境下统计所有表索引数量的需求,我来给你详细说说可行的方案:
一、快速统计:直接查询系统视图
你不需要复杂的存储过程,直接通过查询系统内置视图就能快速得到每个表的索引数量,甚至整个数据库的总索引数:
1. 统计每个表的索引数量
这个查询会列出每个表所属的架构、表名以及对应的索引数量(排除堆表默认的无索引标识):
SELECT SCHEMA_NAME(t.schema_id) AS 架构名, t.name AS 表名, COUNT(i.index_id) AS 索引数量 FROM sys.tables t LEFT JOIN sys.indexes i ON t.object_id = i.object_id WHERE i.index_id > 0 -- 排除堆表的默认"索引"(index_id=0代表无聚集索引的堆表,不算用户创建的索引) GROUP BY SCHEMA_NAME(t.schema_id), t.name ORDER BY 索引数量 DESC;
2. 统计数据库的总索引数量
如果只需要整个数据库的索引总数,用这个简化版查询即可:
SELECT SUM(索引数量) AS 数据库总索引数量 FROM ( SELECT COUNT(i.index_id) AS 索引数量 FROM sys.tables t LEFT JOIN sys.indexes i ON t.object_id = i.object_id WHERE i.index_id > 0 GROUP BY t.object_id ) AS 表索引统计;
二、是否有内置存储过程?
很遗憾,SQL Server 2008并没有专门用来批量统计所有表索引数量的内置存储过程。系统自带的sp_helpindex只能查看单个表的索引详情,没办法一次性遍历所有表完成统计。
如果你需要频繁执行这个统计操作,可以把上面的查询封装成自定义存储过程,后续调用会更方便:
CREATE PROCEDURE dbo.GetAllTableIndexCount AS BEGIN SET NOCOUNT ON; -- 关闭影响行数的提示,让输出更整洁 SELECT SCHEMA_NAME(t.schema_id) AS 架构名, t.name AS 表名, COUNT(i.index_id) AS 索引数量 FROM sys.tables t LEFT JOIN sys.indexes i ON t.object_id = i.object_id WHERE i.index_id > 0 GROUP BY SCHEMA_NAME(t.schema_id), t.name ORDER BY 索引数量 DESC; END;
创建完成后,每次需要统计时只需执行:
EXEC dbo.GetAllTableIndexCount;
内容的提问来源于stack exchange,提问作者user2607417




