我有一个mssql数据库,我们将它称为:mssqlDB01。 我的任务是在所有表上执行碎片整理。 这个数据库有几百个表,每个表的范围是每个表1到15个索引。
谷歌让我发现了一种整理所有索引的做法,但我无法弄清楚如何在所有的表格上做到这一点。
ALTER INDEX ALL ON TABLENAME REBUILD;
我在找什么
ALTER INDEX ALL ON * REBUILD;
但它抱怨
Msg 102, Level 15, State 1, Line 2 Incorrect syntax near '*'.`
下面让我find我的数据库中的所有表
SELECT * FROM information_schema.tables WHERE TABLE_TYPE='BASE TABLE'
我可以以某种方式将此推送到命令中吗?
ALTER INDEX ALL ON (SELECT * FROM information_schema.tables WHERE TABLE_TYPE='BASE TABLE'; ) REBUILD;
你可以编写一个使用dynamicSQL的脚本来做到这一点,但为什么当你可以使用别人的呢? Ola Hallengren的是最有名的免费的,但是Minion Ware也有一个免费的reindex脚本 。
如果你坚持自己写,这样的事情可能会起作用:
Use mssqlDB01 Declare @TBname nvarchar(255), @SQL nvarchar(max) select @TBname = min(TABLE_NAME) from INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='BASE TABLE' while @TBname is not null BEGIN set @SQL='ALTER INDEX ALL ON [' + @TBname + '] REBUILD;' --print @SQL EXEC SP_EXECUTESQL @SQL select @TBname = min(TABLE_NAME) from INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='BASE TABLE' and TABLE_NAME > @TBname END