暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

SQL Server用脚本重建所有数据库和所有表的全部索引

原创 沙沃兴 2023-02-03
1425

DBA 的主要职责之一是维护索引。在此技巧中,我们将介绍可用于重建的简单脚本 所有数据库的所有索引。

维护计划的一个好处是它们可以跨多个数据库工作。因此,您可以制定一个任务来处理所有任务中的相同活动的数据库。我在维护计划中看到的问题是 有时它们无法按预期工作,因此在本提示中我提供了另一种方法。


下面的脚本允许您为所有数据库和所有表重建索引。在数据库中,这可以进一步调整以仅处理以下索引: 需要根据碎片级别进行维护,然后执行索引 重组或索引重建。

在数据库中该脚本使用两个游标,一个用于数据库,另一个用于表。 


为 SQL Server 2005 及更高版本重新生成所有索引脚本

下面的脚本将适用于 SQL Server 2005 及更高版本。

因为我们需要从一个数据库切换到另一个数据库,所以我们需要创建动态 查询的 SQL 代码。该代码使用 master.sys.databases 来获取 数据库以及检查数据库的状态以确保我们是 使用联机数据库。这也使用 INFORMATION_SCHEMA。TABLES 获取数据库中用户表的列表。

DECLARE @Database NVARCHAR(255)   
DECLARE @Table NVARCHAR(255)  
DECLARE @cmd NVARCHAR(1000)  

DECLARE DatabaseCursor CURSOR READ_ONLY FOR  
SELECT name FROM master.sys.databases   
WHERE name NOT IN ('master','msdb','tempdb','model','distribution')  -- databases to exclude
--WHERE name IN ('DB1', 'DB2') -- use this to select specific databases and comment out line above
AND state = 0 -- database is online
AND is_in_standby = 0 -- database is not read only for log shipping
ORDER BY 1  

OPEN DatabaseCursor  

FETCH NEXT FROM DatabaseCursor INTO @Database  
WHILE @@FETCH_STATUS = 0  
BEGIN  

   SET @cmd = 'DECLARE TableCursor CURSOR READ_ONLY FOR SELECT ''['' + table_catalog + ''].['' + table_schema + ''].['' +  
   table_name + '']'' as tableName FROM [' + @Database + '].INFORMATION_SCHEMA.TABLES WHERE table_type = ''BASE TABLE'''   

   -- create table cursor  
   EXEC (@cmd)  
   OPEN TableCursor   

   FETCH NEXT FROM TableCursor INTO @Table   
   WHILE @@FETCH_STATUS = 0   
   BEGIN
      BEGIN TRY   
         SET @cmd = 'ALTER INDEX ALL ON ' + @Table + ' REBUILD' 
         --PRINT @cmd -- uncomment if you want to see commands
         EXEC (@cmd) 
      END TRY
      BEGIN CATCH
         PRINT '---'
         PRINT @cmd
         PRINT ERROR_MESSAGE() 
         PRINT '---'
      END CATCH

      FETCH NEXT FROM TableCursor INTO @Table   
   END   

   CLOSE TableCursor   
   DEALLOCATE TableCursor  

   FETCH NEXT FROM DatabaseCursor INTO @Database  
END  
CLOSE DatabaseCursor   
DEALLOCATE DatabaseCursor


此脚本已经排除了系统数据库,因此您可以包括这些或 添加其他数据库以从索引维护例程中排除。也 您可以更改代码以仅包含特定数据库。

此脚本已经过测试,可与 SQL Server 2005、SQL Server 配合使用 2008, SQL Server 2008R2, SQL Server 2012, SQL Server 2014, SQL Server 2016, SQL Server 2017 和 SQL Server 2019。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论