iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >SQL Server怎么找出数据库中没有索引的表
  • 728
分享到

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

2024-04-02 19:04:59 728人浏览 安东尼
摘要

这篇文章主要讲解了“SQL Server怎么找出数据库中没有索引的表”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“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怎么找出数据库中没有索引的表这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

您可能感兴趣的文档:

--结束END--

本文标题: SQL Server怎么找出数据库中没有索引的表

本文链接: https://www.lsjlt.com/news/56153.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • SQL Server怎么找出数据库中没有索引的表
    这篇文章主要讲解了“SQL Server怎么找出数据库中没有索引的表”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“SQL Server怎么找出数据库中没有索...
    99+
    2022-10-18
  • SQL Server数据库镜像下有效的索引维护
    SQL Server数据库镜像下有效的索引维护 我们在做索引重建的时候,由于索引重建产生太多日志,习惯切换到大容量日志恢复模式。而在生产环境,我们配置了数据库镜像作为高可用,镜像只能运行于完整恢复...
    99+
    2022-10-18
  • 怎么解决数据库中没有索引导致的DIRECT PATH READ
    本篇内容主要讲解“怎么解决数据库中没有索引导致的DIRECT PATH READ”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么解决数据库中没有索引导致的DI...
    99+
    2022-10-18
  • Mysql数据库表中为什么有索引却没有提高查询速度
    背景 时间过得太快了,春节假期感觉光速般就结束了,转眼间就要继续搬砖上班了。紧接着很快就要进入金三银四的求职面试高峰期,程序猿小枫还没有找到令自己感到满意的工作。就算是在过年放假期间...
    99+
    2022-11-13
  • mysql查找所有数据库中没有主键的表问题怎么解决
    今天小编给大家分享一下mysql查找所有数据库中没有主键的表问题怎么解决的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。查找所...
    99+
    2023-07-05
  • mysql之查找所有数据库中没有主键的表问题
    目录查找所有数据库中没有主键的表修改mysql数据表主键总结查找所有数据库中没有主键的表 select table_schema,table_name from information_schema.table...
    99+
    2023-03-23
    mysql查找数据库 查找数据库没有主键的表 mysql主键的表
  • MySQL数据库中怎么批量迁移表索引
    这期内容当中小编将会给大家带来有关MySQL数据库中怎么批量迁移表索引,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1. 导出所有索引包括PRIMARY KEY和INDE...
    99+
    2022-10-18
  • SQL Server数据库中怎么利用bcp导出备份文件
    SQL Server数据库中怎么利用bcp导出备份文件,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。EXEC sp_configur...
    99+
    2022-10-18
  • SQL Server中怎么根据分区表名查找所在的文件
    这篇文章给大家介绍SQL Server中怎么根据分区表名查找所在的文件,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。SELECT ps.name AS&nb...
    99+
    2022-10-18
  • SQL Server中怎么查询数据库中表使用空间信息
    SQL Server中怎么查询数据库中表使用空间信息,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。使用了微软提供的不公开的存储过程sp_MSf...
    99+
    2022-10-18
  • 为什么Mysql 数据库表中有索引还是查询慢
    目录前言:1、字段类型不匹配导致的索引失效2、被索引字段使用了表达式计算3、被索引字段使用了内置函数4、like 使用了 %X 模糊匹配5、索引字段不是联合索引字段的最左字段6、or...
    99+
    2022-11-13
  • SQL Server数据库中的存储过程是怎么样的
    SQL Server数据库中的存储过程是怎么样的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。什么是存储过程如果你接触过其他的编程语言,那么就...
    99+
    2022-10-19
  • PHP怎么操作SQL Server数据库实现表的改查与统计
    今天小编给大家分享一下PHP怎么操作SQL Server数据库实现表的改查与统计的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来...
    99+
    2023-06-29
  • 远程数据库的表超过20个索引有什么影响
    这篇文章主要介绍了远程数据库的表超过20个索引有什么影响,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。经过分析,发现那个通过dblink的查...
    99+
    2022-10-18
  • 怎么理解数据库移动分区表和分区索引的表空间
    这篇文章主要介绍“怎么理解数据库移动分区表和分区索引的表空间”,在日常操作中,相信很多人在怎么理解数据库移动分区表和分区索引的表空间问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解...
    99+
    2022-10-19
  • 数据库中怎么清除创建失败的索引
    这篇文章主要介绍了数据库中怎么清除创建失败的索引,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。在创建一张大表的索引时,因为没有加并行而导致创...
    99+
    2022-10-18
  • 怎么解决引用slf4j中Logger.info没有数据的问题
    这篇文章主要介绍“怎么解决引用slf4j中Logger.info没有数据的问题”,在日常操作中,相信很多人在怎么解决引用slf4j中Logger.info没有数据的问题问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家...
    99+
    2023-06-22
  • SQL Server数据库mdf文件中了勒索病毒的解决方法是什么
    这篇文章主要介绍“SQL Server数据库mdf文件中了勒索病毒的解决方法是什么”,在日常操作中,相信很多人在SQL Server数据库mdf文件中了勒索病毒的解决方法是什么问题上存在疑惑,小编查阅了各式...
    99+
    2022-10-18
  • sql server中怎么实现多个数据库间快速查询某个表信息
    sql server中怎么实现多个数据库间快速查询某个表信息,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1.先了解一下系统存储过程和系统表的...
    99+
    2022-10-18
  • SQL Server中怎么修改数据库物理文件的存储位置
    本篇文章为大家展示了SQL Server中怎么修改数据库物理文件的存储位置,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。具体流程为:1、将现有的数据库脱机ALTER...
    99+
    2022-10-18
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作