首页 > 解决方案 > SQL 数据库重新索引脚本

问题描述

针对 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

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

解决方案


你是

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

这不是一个好主意,因为初学者的门槛为零。这意味着您将重建每个索引,无论它是否碎片化,也无论该索引的页数如何。因此,如果您在新表上创建新索引并运行此命令,它将重建它。而且,这是离线操作。因此,在整个重建期间为非聚集索引持有一个共享锁,以防止对表进行任何修改......

我会考虑使用Ola 的脚本。他们远远优于。然后,我从Brent Ozar这篇文章中再次阅读了关于碎片化的神话和误解。


推荐阅读