谷歌搜索显示一些脚本,它们对系统表运行查询,并迭代结果,依次重建(或者,重新组织)每个数据库表索引。这似乎是合理的,但我在这里提出这个问题的原因是,从未知来源获取查询系统表的 SQL 脚本让我感到紧张,例如,它可能会错过某些类型的索引或尝试重建应该保持不变的特殊系统索引。事实上,我尝试的前几个没有奏效,因为它们没有处理不同架构中的表。
那么,对于 SQL Server 2005 数据库的所有表上重建所有索引的最佳和最简单的方法是什么?
谢谢。
答案1
如果您不想冒险使用第三方脚本,本机维护计划包括重建每个数据库的所有索引的选项。
答案2
答案3
通常情况下,BOL 有一个很好的起点,解释了它是如何工作的以及你可以进行哪些更改以使其产生不同的效果。http://msdn.microsoft.com/en-us/library/ms177571.aspx。我从这个脚本开始,并对其进行了添加,以便处理所有数据库(在某些服务器上)。我还根据脚本的运行时间设置了不同的 @maxfrag 值 - 周末的值较低,工作日的值较高,以及是否有重建或重组。这可确保作业在我们设定的时间限制内运行,并且数据库不会获得大锁定
答案4
不像其他回复中提到的 sqlfool 脚本那么完整/复杂,但我使用:
DECLARE @sSQL NVARCHAR(1024), @sName NVARCHAR(1024)
DECLARE curTables CURSOR FOR SELECT name FROM sysobjects WHERE xtype='U'
OPEN curTables
FETCH NEXT FROM curTables INTO @sName
WHILE @@fetch_status = 0 BEGIN
SET @sSQL = 'DBCC DBREINDEX ('''+@sName+''', '''', 0)'
EXEC (@sSQL)
FETCH NEXT FROM curTables INTO @sName
END
CLOSE curTables
DEALLOCATE curTables
重建当前登录的数据库中的所有索引。