如何使用 MSSQL,重建所有表上的所有索引?MSSQL Server 2008

par*_*hon 9 fragmentation sql-server

我有一个 mssql 数据库,我们称之为:mssqlDB01。我的任务是对所有表执行碎片整理。这个数据库有几百个表,每个表都有 1 到 15 个索引。


谷歌让我发现了一种对每个表的所有索引进行碎片整理的做法,但我无法弄清楚如何在所有表上执行此操作。

ALTER INDEX ALL ON TABLENAME REBUILD;
Run Code Online (Sandbox Code Playgroud)

我要找的是

ALTER INDEX ALL ON * REBUILD; 
Run Code Online (Sandbox Code Playgroud)

但它抱怨

Msg 102, Level 15, State 1, Line 2
Incorrect syntax near '*'.`
Run Code Online (Sandbox Code Playgroud)

下面让我找到我的数据库中的所有表

SELECT * FROM information_schema.tables WHERE TABLE_TYPE='BASE TABLE'
Run Code Online (Sandbox Code Playgroud)

我可以以某种方式将其推送到命令中吗?

ALTER INDEX ALL ON (SELECT * FROM information_schema.tables WHERE TABLE_TYPE='BASE TABLE'; ) REBUILD;
Run Code Online (Sandbox Code Playgroud)

Kat*_*ard 14

您可能会编写一个使用动态 SQL 来执行此操作的脚本,但是当您可以使用其他人的时,为什么还要这样做呢? Ola Hallengren是最著名且免费的,但Minion Ware 也有免费的重新索引脚本

如果你坚持自己写,这样的事情可能会奏效:

Use mssqlDB01

Declare @TBname nvarchar(255),
        @schema nvarchar(255),
        @SQL nvarchar(max) 


select @TBname = min(TABLE_NAME) from INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='BASE TABLE'
select @schema = SCHEMA_NAME from INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='BASE TABLE' and TABLE_NAME = @TBname

while @TBname is not null
BEGIN
    set @SQL='ALTER INDEX ALL ON [' + @schema + '].[' + @TBname + '] REBUILD;'
    --print @SQL
    EXEC SP_EXECUTESQL @SQL
    select @TBname = min(TABLE_NAME) from INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='BASE TABLE'
    select @schema = SCHEMA_NAME from INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='BASE TABLE' and TABLE_NAME = @TBname      
END
Run Code Online (Sandbox Code Playgroud)


小智 6

  1. 按 Ctrl + T
  2. 运行此查询:

    SELECT 'ALTER INDEX ALL ON ' + table_name + '  REBUILD;' 
        FROM Information_Schema.tables where  table_type ='BASE TABLE'
    
    Run Code Online (Sandbox Code Playgroud)
  3. 复制输出并将其粘贴到 SQL 窗口中,然后单击运行。