SQL数据库重新索引脚本

时间:2018-06-28 12:55:55

标签: sql sql-server sql-server-2008 sql-server-2014

在针对SQL Server数据库的脚本下运行时发生了什么。

我的脚本:

set arithabort on
set quoted_identifier on    

use TestDB

declare objcur cursor for
    select name
    from sysobjects
    where type = 'u'
    order by name    

declare @obj sysname    

open objcur   
fetch next from objcur into @obj    

while (@@fetch_status = 0)
begin
    dbcc dbreindex( @obj ) WITH NO_INFOMSGS   

    fetch next from objcur into @obj
end   

deallocate objcur

2 个答案:

答案 0 :(得分:2)

您是

  • 将ARITHABORT设置为on,这将在发生溢出时终止查询。默认情况下,此选项处于启用状态,因此可能很多余
  • 将QUOTED_IDENTIFIER设置为on,这告诉SQL Server遵循有关引号的ISO标准。即允许您使用双引号分隔标识符,并强制您对文字字符串使用单引号。当您在某些类型的列(如计算列,索引视图等)上更改索引时,必须启用此选项。默认设置为开启。
  • 为所有表创建游标(循环)
  • 遍历每个表并为每个表重建每个索引

这不是一个好主意,因为您的入门者门槛为零。这意味着您将重建每个索引,而不管其是否碎片化以及该索引的页数如何。因此,如果您在一个新表上创建了一个新索引并运行了此命令,它将重新构建它。另外,这是离线操作。因此,在重建的整个过程中,将为非聚集索引保留一个共享锁,这可以防止对该表进行任何修改...

我会考虑使用Ola's scripts。他们远胜于上。然后,我将从Brent Ozar再到in this post上阅读关于碎片化的神话和误解。

答案 1 :(得分:0)

您可以使用以下语句重建所有索引。

Exec sp_msforeachtable 'ALTER INDEX ALL ON ? REBUILD'