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
运行此查询:
SELECT 'ALTER INDEX ALL ON ' + table_name + ' REBUILD;'
FROM Information_Schema.tables where table_type ='BASE TABLE'
Run Code Online (Sandbox Code Playgroud)复制输出并将其粘贴到 SQL 窗口中,然后单击运行。
| 归档时间: |
|
| 查看次数: |
43660 次 |
| 最近记录: |