sqlserver重建所有索引的存储过程

本文介绍了一个SQL Server存储过程,用于自动重建碎片化的索引。该过程通过查询系统目录视图和动态管理视图来识别需要重建的索引,并执行相应的ALTER INDEX命令。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

CREATE proc [dbo].[reBuildIndex]
as
declare @statement NVARCHAR(1000)
declare mycursor cursor for
SELECT 'ALTER INDEX [' + ix.name + '] ON [' + s.name + '].[' + t.name + '] REBUILD WITH ( PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON, SORT_IN_TEMPDB = OFF, ONLINE = OFF )' 
      as sqlStr
FROM   sys.indexes AS ix
       INNER JOIN sys.tables t
       ON     t.object_id = ix.object_id
       INNER JOIN sys.schemas s
       ON     t.schema_id = s.schema_id
       INNER JOIN
              (SELECT object_id                   ,
                      index_id                    ,
                      avg_fragmentation_in_percent,
                      partition_number
              FROM    sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL, NULL, NULL)
              ) ps
       ON     t.object_id = ps.object_id
          AND ix.index_id = ps.index_id
       INNER JOIN
              (SELECT  object_id,
                       index_id ,
                       COUNT(DISTINCT partition_number) AS partition_count
              FROM     sys.partitions
              GROUP BY object_id,
                       index_id
              ) pc
       ON     t.object_id              = pc.object_id
          AND ix.index_id              = pc.index_id
WHERE  ps.avg_fragmentation_in_percent > 0
   AND ix.name IS NOT NULL
open mycursor

fetch next from mycursor  into @statement
while(@@fetch_status=0)     --如果数据集里一直有数据
begin
EXEC sp_executesql  @statement
--select @statement
fetch next from mycursor  into @statement
end
close mycursor       
deallocate mycursor  

### SQL Server 重建数据库索引SQL语句 在 SQL Server 中,重建数据库索引可以通过多种方式实现。以下是几种常见的方法,涵盖不同场景下的需求。 #### 方法一:使用游标遍历所有表并重建索引 通过 `DECLARE CURSOR` 定义一个游标来遍历数据库中的所有表,并对每个表执行 `DBCC DBREINDEX` 命令以重建索引[^1]。 ```sql USE his; -- 指定要操作的数据库 GO DECLARE @table_name VARCHAR(200); -- 查询数据库里的所有表名 DECLARE cursor_reindex CURSOR FAST_FORWARD READ_ONLY FOR SELECT name FROM sys.tables; -- 使用游标遍历表列表 OPEN cursor_reindex; FETCH NEXT FROM cursor_reindex INTO @table_name; WHILE @@FETCH_STATUS = 0 BEGIN -- 开始重建索引 DBCC DBREINDEX(@table_name); -- 或者指定填充因子:DBCC DBREINDEX(@table_name, '', 90) FETCH NEXT FROM cursor_reindex INTO @table_name; END; CLOSE cursor_reindex; DEALLOCATE cursor_reindex; ``` #### 方法二:创建存储过程重建索引 可以将重建索引的操作封装到存储过程中,方便重复调用和维护[^2]。 ```sql CREATE PROCEDURE [pDBReIndex] AS BEGIN SET NOCOUNT ON; DECLARE @Name VARCHAR(512); -- 定义游标 DECLARE Cur CURSOR FOR SELECT name FROM SYS.tables; OPEN Cur; FETCH NEXT FROM Cur INTO @Name; WHILE @@FETCH_STATUS = 0 BEGIN DBCC DBREINDEX(@Name); IF @@ERROR > 0 GOTO Err; -- 错误处理跳转 FETCH NEXT FROM Cur INTO @Name; END; CLOSE Cur; DEALLOCATE Cur; RETURN; /****************************************************** 错误处理 \******************************************************/ Err: BEGIN -- 抛出异常 DECLARE @ErrorMessage NVARCHAR(4000); DECLARE @ErrorSeverity INT; DECLARE @ErrorState INT; SELECT @ErrorMessage = ERROR_MESSAGE(); SELECT @ErrorSeverity = ERROR_SEVERITY(); SELECT @ErrorState = ERROR_STATE(); RAISERROR (@ErrorMessage, -- Message text. @ErrorSeverity, -- Severity. @ErrorState -- State. ); END END ``` #### 方法三:基于 `sysobjects` 的简单重建 如果需要更简洁的方式,可以直接基于 `sysobjects` 表构建脚本[^3]。 ```sql USE DatabaseName; -- 替换为实际的数据库名称 DECLARE @name varchar(100); DECLARE authors_cursor CURSOR FOR SELECT [name] FROM sysobjects WHERE xtype='u' ORDER BY id; OPEN authors_cursor; FETCH NEXT FROM authors_cursor INTO @name; WHILE @@FETCH_STATUS = 0 BEGIN DBCC DBREINDEX (@name, '', 90); -- 设置填充因子为 90% FETCH NEXT FROM authors_cursor INTO @name; END; DEALLOCATE authors_cursor; ``` #### 方法四:针对单个表的索引状态检查与重建 如果只想检查某个特定表的索引状态并重建,可以使用以下方法[^4]。 ```sql USE nfsscmuat; -- 替换为实际的数据库名称 DECLARE @table_id INT; SET @table_id = OBJECT_ID('Instore'); -- 替换为实际的表名称 -- 检查表的索引碎片情况 DBCC SHOWCONTIG(@table_id); -- 重建表的索引 DBCC DBREINDEX('Instore'); ``` --- ### 注意事项 - 在生产环境中执行索引重建操作时,应避免高峰时段,以免影响系统性能。 - 索引重建会锁定表,可能导致并发问题。如果需要减少锁的影响,可以考虑使用 `ALTER INDEX ... REBUILD WITH (ONLINE = ON)`[^1]。 - 如果数据库较大,建议分批重建索引以降低资源消耗。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值