You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动