sql - 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
解决方案
你是
- 将 ARITHABORT 设置为 on,这会在发生溢出时终止查询。默认情况下,这是 ON 所以可能是多余的
- 将 QUOTED_IDENTIFIER 设置为 on,这会告诉 SQL Server 遵循有关引号的 ISO 标准。ie 允许您使用双引号来分隔标识符并强制您对文字字符串使用单引号。当您更改某些类型的列(如计算列、索引视图等)的索引时,必须打开此选项。打开是默认设置。
- 为所有表创建游标(循环)
- 循环遍历每个表并为每个表重建每个索引
这不是一个好主意,因为初学者的门槛为零。这意味着您将重建每个索引,无论它是否碎片化,也无论该索引的页数如何。因此,如果您在新表上创建新索引并运行此命令,它将重建它。而且,这是离线操作。因此,在整个重建期间为非聚集索引持有一个共享锁,以防止对表进行任何修改......
我会考虑使用Ola 的脚本。他们远远优于。然后,我从Brent Ozar和这篇文章中再次阅读了关于碎片化的神话和误解。