千家信息网

SQL Server怎么找出数据库中没有索引的表

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,这篇文章主要讲解了"SQL Server怎么找出数据库中没有索引的表",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"SQL Server怎么找出数据库中
千家信息网最后更新 2026年10月31日SQL Server怎么找出数据库中没有索引的表

这篇文章主要讲解了"SQL Server怎么找出数据库中没有索引的表",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"SQL Server怎么找出数据库中没有索引的表"吧!

在SQL Server数据库的维护中,我们经常需要巡检,找出一些没有索引的表,然后根据实际情况判断是否需要增加索引。下面分享一个脚本,如何找出当前数据库中没有索引的表信息。

SELECT DISTINCT         @@SERVERNAME              AS [SERVER_NAME]        ,DB_NAME()                 AS [DB_NAME]        ,so.object_id              AS [OBJECT_ID]         ,SCHEMA_NAME(so.schema_id) +'.' +OBJECT_NAME(so.object_id)                                    AS [TABLE_NAME]         ,MAX(dmv.rows)             AS [APPROXIMATE_ROWS]         ,MAX(d.ColumnCount)        AS [COLUMN_COUNT] FROM    sys.objects so ( NOLOCK )         JOIN sys.indexes si ( NOLOCK ) ON so.object_id = si.object_id                                           AND so.type IN ( N'U', N'V' )         JOIN sysindexes dmv ( NOLOCK ) ON so.object_id = dmv.id                                           AND si.index_id = dmv.indid         FULL OUTER JOIN ( SELECT    object_id ,                                     COUNT(1) AS ColumnCount                           FROM      sys.columns (NOLOCK)                           GROUP BY  object_id                         ) d ON d.object_id = so.object_id WHERE   so.is_ms_shipped = 0         AND so.object_id NOT IN (         SELECT  major_id         FROM    sys.extended_properties (NOLOCK)         WHERE   name = N'microsoft_database_tools_support' )         AND INDEXPROPERTY(so.object_id, si.name, 'IsStatistics') = 0 GROUP BY so.schema_id ,         so.object_id HAVING  ( CASE OBJECTPROPERTY(MAX(so.object_id), 'TableHasClustIndex')             WHEN 0 THEN COUNT(si.index_id) - 1             ELSE COUNT(si.index_id)           END = 0 ) ORDER BY [APPROXIMATE_ROWS] DESC;

上面脚本只能查询当前数据库中没有索引的表,我们知道,生产环境中,一个实例下面往往有多个用户数据库,我们需要采集每个数据库中没有索引的表信息,那么上面脚本明显有点硬伤,所以,重写了这个脚本。

IF EXISTS (SELECT * FROM tempdb.dbo.sysobjects WHERE id = OBJECT_ID('tempdb.dbo.#Database')) BEGIN     DROP TABLE #Database; END  CREATE TABLE #Database (database_id INT  ,database_name NVARCHAR(128) );   INSERT INTO #Database  SELECT database_id, name FROM sys.databases WHERE state_desc='ONLINE'   AND name NOT IN ('master','msdb','tempdb','model', 'distribution')   DECLARE @database_name    NVARCHAR(128); DECLARE @database_id      INT; DECLARE @cmdText          NVARCHAR(MAX);  SET @database_name =''; SET @database_id =1;  IF EXISTS (SELECT * FROM tempdb.dbo.sysobjects WHERE id = OBJECT_ID('tempdb.dbo.#TAB_NO_INDEX_INFO')) BEGIN     DROP TABLE #TAB_NO_INDEX_INFO; END  CREATE TABLE #TAB_NO_INDEX_INFO(     [SERVER_NAME] [NVARCHAR](32) NULL,     [INSTANCE_NAME] [NVARCHAR](64) NULL,     [DATABASE_NAME] [NVARCHAR](32) NULL,     [TABLE_NAME] [NVARCHAR](128) NULL,     [OBJECT_ID] [INT] NULL,     [APPROXIMATE_ROWS] [INT] NULL,     [COLUMN_COUNT] [INT] NULL     );  WHILE(1=1)   BEGIN     SELECT TOP 1             @database_id = database_id ,             @database_name = database_name     FROM    #Database     WHERE   database_id > @database_id -- next database_name greater than @database_id     ORDER BY database_id -- database_id order         -- exit loop if no more name greater than the last one used     If @@rowcount = 0 Break       SET @cmdText='USE ' + @database_name  +';          --GO          INSERT  INTO #TAB_NO_INDEX_INFO         ( SERVER_NAME ,           INSTANCE_NAME ,           DATABASE_NAME ,           TABLE_NAME ,           OBJECT_ID ,           APPROXIMATE_ROWS ,           COLUMN_COUNT         )         SELECT  DISTINCT                CAST(SERVERPROPERTY(''MachineName'') AS NVARCHAR(32))                                                     AS [SERVER_NAME]   ,                 @@SERVICENAME                       AS [INSTANCE_NAME] ,                 DB_NAME()                           AS [DATABASE_NAME] ,                 SCHEMA_NAME(so.schema_id)+ ''.'' +                   OBJECT_NAME(so.object_id)           AS [TABLE_NAME]    ,                 so.object_id                        AS [OBJECT_ID]     ,                 MAX(dmv.rows)                       AS [APPROXIMATE_ROWS] ,                 MAX(d.ColumnCount)                  AS [COLUMN_COUNT]         FROM    sys.objects so ( NOLOCK )                 JOIN sys.indexes si ( NOLOCK ) ON so.object_id = si.object_id                                                   AND so.type IN ( N''U'', N''V'' )                 JOIN sysindexes dmv ( NOLOCK ) ON so.object_id = dmv.id                                                   AND si.index_id = dmv.indid                 FULL OUTER JOIN ( SELECT    object_id ,                                             COUNT(1) AS ColumnCount                                   FROM      sys.columns (NOLOCK)                                   GROUP BY  object_id                                 ) d ON d.object_id = so.object_id         WHERE   so.is_ms_shipped = 0                 AND so.object_id NOT IN (                 SELECT  major_id                 FROM    sys.extended_properties (NOLOCK)                 WHERE   name = N''microsoft_database_tools_support'' )                 AND INDEXPROPERTY(so.object_id, si.name, ''IsStatistics'') = 0         GROUP BY so.schema_id ,                 so.object_id         HAVING  ( CASE OBJECTPROPERTY(MAX(so.object_id), ''TableHasClustIndex'')                     WHEN 0 THEN COUNT(si.index_id) - 1                     ELSE COUNT(si.index_id)                   END = 0 )         ORDER BY [APPROXIMATE_ROWS] DESC; '          PRINT @cmdText;           EXEC ( @cmdText);         --EXEC SP_EXECUTESQL @cmdText, N'@database_name NVARCHAR(32)',@database_name     Delete Db   From #Database Db WHERE database_id=@database_id;   END  SELECT  * FROM    #TAB_NO_INDEX_INFO ORDER BY APPROXIMATE_ROWS DESC;   --找出数据量超过1000行没有索引信息的表 SELECT * FROM #TAB_NO_INDEX_INFO WHERE APPROXIMATE_ROWS > 1000 ORDER BY APPROXIMATE_ROWS DESC

当你维护了很多SQL Server数据库时,使用上面脚本到每台SQL Server实例上跑一次,也是一件非常麻烦耗时的事情,所以还是需要自动化作业处理,定时使用Python脚本去每台SQL Server实例上采集数据存储下来,然后DBA只需做好两件事情:监控采集数据和分析处理数据。这里就不贴Python脚本了,其实就是循环所有SQL Server实例,运行上面脚本,将采集到的相关数据存储起来。

感谢各位的阅读,以上就是"SQL Server怎么找出数据库中没有索引的表"的内容了,经过本文的学习后,相信大家对SQL Server怎么找出数据库中没有索引的表这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

数据 数据库 索引 脚本 实例 信息 学习 事情 内容 就是 情况 处理 存储 明显 只需 多个 实际 思路 文章 更多 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 什么是科技互联网 鸠鸠互联网科技 盈实互联网科技 科技制造互联网公司 互联网与新科技 凡科互联网科技 银川新华互联网科技学校地址 互联网汽车科技小镇 科技互联网的估值 昭通云南众福互联网科技有限公司 湖南一路畅行互联网科技 速维有品互联网信息科技(苏州)有限公司 互联网媒体平台算高科技产业 链环科技传统企业怎么转型互联网 中国互联网十大科技股排名 互联网数据科技专业 伍佰万互联网科技怎么赚钱 有人说阿里系是互联网科技企业 陕西云淼互联网科技公司 福建互联网展示科技馆设计 湖北九亚互联网络科技有限公司 疫情对互联网科技公司影响 电子科技大学互联网 卓翼科技产业互联网合作 国大互联网教育科技有限公司薪资 下一代互联网重大应用科技园 昆明中奇联合互联网科技 互联网科技接地气 银川新华互联网科技学校是国营吗 杭州科技互联网公司有哪些
0