sqlserver 自动重建库中所有表索引

ALTER PROCEDURE [dbo].[p_ReIndexing] (

@dbname varchar(50)

)

AS

SET NOCOUNT ON

DECLARE @tblname varchar(200), @execstring nvarchar(4000)

EXEC('

DECLARE defrag_cursor CURSOR FOR

SELECT

  ''['' + b.name + '']'' + ''.'' + ''['' + a.name + '']'' AS tblname

FROM '

  + @dbname + '..sysobjects a (nolock)

  INNER JOIN ' + @dbname + '..sysusers b (nolock)

   ON a.uid = b.uid

WHERE a.name NOT LIKE ''sys%'' 

 AND a.name NOT LIKE ''%sys%''

 AND a.name NOT LIKE ''%properties%''

  AND a.name NOT LIKE ''MS%''

  AND a.type = ''U''

GROUP BY ''['' + b.name + '']'' + ''.'' + ''['' + a.name + '']''')

OPEN defrag_cursor

  FETCH NEXT FROM defrag_cursor

    INTO @tblname

  WHILE @@FETCH_STATUS = 0

    BEGIN 

<think>好的,我现在需要帮助用户解决在SQL Server中整重建索引的问题。用户之前已经询问过MySQL和Oracle的整索引重建方法,现在转向SQL Server,所以需要保持回答的结构一致,方便用户对比。 首先,回顾用户提供的引用内容。引用[1]给出了一个使用游标遍历所有并执行DBCC DBREINDEX的示例,这应该作为基础方法。引用[2]和[4]提到了DBCC SHOWCONTIG来评估索引碎片情况,这可能涉及到是否需要重建索引的判断标准。引用[3]同样涉及DBCC SHOWCONTIG的用法,但用户的问题是关于整个数据重建,所以需要整合这些信息。 用户可能的需求不仅仅是步骤,还包括最佳实践,比如何时重建、如何评估影响、注意事项等。需要结合引用中的DBCC SHOWCONTIG来建议先检查碎片率,再决定是否重建,避免不必要的操作。 另外,用户之前的问题中提到了备份、低峰时段操作、验证状态等通用注意事项,这些也应该包含在回答中,确保一致性。 接下来,整理步骤。根据引用[1],使用游标和DBCC DBREINDEX是主要方法。但需要考虑SQL Server版本,因为从2005开始,DBCC DBREINDEX已被ALTER INDEX取代,所以需要提醒用户注意版本差异,并提供两种方法:传统游标方法和动态SQL方法。 此外,引用[2]提到分页和碎片的影响,最佳实践中应包括碎片率阈值(比如超过30%才重建),以及重建后更新统计信息,使用ONLINE选项减少锁等待等。 还需要注意权限问题,执行这些操作需要足够的权限,比如ALTER权限。另外,维护窗口的选择和监控进度也是关键点。 最后,生成相关问题时要参考之前的模式,可能涉及碎片分析、性能影响、不同版本差异等。</think>### SQL Server整重建索引方法与最佳实践 #### 一、核心方法 1. **动态SQL批量重建** ```sql DECLARE @sql NVARCHAR(MAX) = ''; SELECT @sql += 'ALTER INDEX ALL ON ' + QUOTENAME(SCHEMA_NAME(schema_id)) + '.' + QUOTENAME(name) + ' REBUILD WITH (ONLINE = ON);' FROM sys.tables; EXEC sp_executesql @sql; ``` - **特点**: - 通过`ALTER INDEX`重建所有的所有索引(适用于SQL Server 2005+)[^1] - `ONLINE=ON`参数减少锁竞争(需企业版支持) 2. **游标遍历方法(传统方式)** ```sql DECLARE @table_name VARCHAR(200); DECLARE cursor_reindex CURSOR FOR SELECT QUOTENAME(SCHEMA_NAME(schema_id)) + '.' + QUOTENAME(name) FROM sys.tables; OPEN cursor_reindex; FETCH NEXT FROM cursor_reindex INTO @table_name; WHILE @@FETCH_STATUS = 0 BEGIN EXEC('ALTER INDEX ALL ON ' + @table_name + ' REBUILD;'); FETCH NEXT FROM cursor_reindex INTO @table_name; END; CLOSE cursor_reindex; DEALLOCATE cursor_reindex; ``` - **适用场景**: - SQL Server 2000等旧版本(需替换为`DBCC DBREINDEX`)[^1] --- #### 二、最佳实践 1. **碎片率评估先行** - 执行`DBCC SHOWCONTIG`或查询`sys.dm_db_index_physical_stats`判断索引碎片率: ```sql SELECT object_name(object_id) AS TableName, index_type_desc, avg_fragmentation_in_percent FROM sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, 'LIMITED') WHERE avg_fragmentation_in_percent > 30; -- 仅重建碎片率>30%的索引[^2] ``` - **阈值建议**: - 5%-30%:执行`REORGANIZE` - >30%:执行`REBUILD`[^2] 2. **优化重建策略** - **分批执行**:对大分批次操作,避免事务日志爆满 - **统计信息更新**:重建后执行`UPDATE STATISTICS` - **兼容性检查**:`ONLINE=ON`需企业版支持,否则会阻塞写入[^1] 3. **操作注意事项** - **备份必做**:重建过程中可能触发页分裂,需提前备份关键 - **资源监控**:通过`sys.dm_exec_requests`监控进度 - **维护窗口**:选择业务低峰期执行(如凌晨) - **权限要求**:需`ALTER`权限或`db_ddladmin`角色 --- ### 性能对比与选择建议 | 方法 | 优点 | 缺点 | |--------------------|-----------------------------|-----------------------------| | 动态SQL批量重建 | 无需游标,执行效率高 | 单语句执行可能占用大量事务日志 | | 游标遍历 | 可控性强,支持进度监控 | 性能较低,不适合超大型数据 | | `DBCC DBREINDEX` | 兼容旧版本,自动处理所有索引 | 已弃用(SQL Server 2005+不推荐) | --- ### 补充说明 - **分区处理**:若使用分区,需通过`ALTER PARTITION`单独处理热点分区 - **过滤索引**:重建后需验证过滤条件是否失效 - **列存储索引**:需使用`ALTER INDEX...REORGANIZE`特殊语法 --- ### 相关问题 1. 如何通过`sys.dm_db_index_physical_stats`精准判断索引碎片程度? 2. 索引重建过程中遇到事务日志已满如何应急处理? 3. 重建索引与重组索引(`REORGANIZE`)的核心区别是什么?[^2] 4. 如何在SQL Server Standard版中实现最小化锁等待的索引重建
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值