自动删除和重新创建当前索引

时间:2012-07-02 21:23:14

标签: sql sql-server-2008 etl

我正在努力提供一种允许批量更新表的方法(每次更新大于1M的新行或更新行),并且有兴趣删除当前索引并在更新后重新创建它们。

我想知道是否有人有脚本来提供这些操作的松耦合,这样如果索引随时间变化,则更新过程不会改变。

这似乎是社区已经解决过的事情之一。

2 个答案:

答案 0 :(得分:10)

我有用于查询系统表以捕获所有非聚集索引的脚本,并在完成后禁用然后重建。以下内容适用于标准版,如果您使用的是企业版,我会添加ONLINE选项。

停用

DECLARE @sql AS VARCHAR(MAX);
SET @sql = '';
SELECT 
    @sql = @sql + 'ALTER INDEX [' + i.name + '] ON [' + o.name + '] DISABLE; '
FROM sys.indexes AS i
JOIN sys.objects AS o ON i.object_id = o.object_id
WHERE i.type_desc = 'NONCLUSTERED'
AND o.type_desc = 'USER_TABLE'

EXEC (@sql)

<强>重建

DECLARE @sql AS VARCHAR(MAX);
SET @sql = '';
SELECT 
    @sql = @sql + 'ALTER INDEX [' + i.name + '] ON [' + o.name + '] REBUILD WITH (FILLFACTOR = 80); '
FROM sys.indexes AS i
JOIN sys.objects AS o ON i.object_id = o.object_id
WHERE i.type_desc = 'NONCLUSTERED'
AND o.type_desc = 'USER_TABLE'

EXEC (@sql);

我喜欢这种方法,因为它可以自定义,因为您可以根据条件排除/包含某些表以及避免使用游标。您也可以将EXEC更改为PRINT,然后查看将执行并手动运行的代码。

排除表格的条件

AND o.name NOT IN ('tblTest','tblTest1');

答案 1 :(得分:4)

EXEC sp_MSforEachTable 'ALTER INDEX ALL ON ? DISABLE'

EXEC sp_MSforEachTable 'ALTER INDEX ALL ON ? REBUILD'
如果您想对所有表和每个索引执行此操作,那么

就是您所需要的。