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

标签 sql sql-server-2008 etl

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

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

这似乎是社区可能已经解决的问题之一。

最佳答案

我有用于查询系统表以捕获所有非聚集索引并禁用然后在完成后重建的脚本。以下是用于标准版,如果你在企业我会添加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);

我喜欢这种方法,因为它非常可定制,因为您可以根据条件排除/包含某些表以及避免光标。您也可以更改 EXECPRINT并查看将要执行的代码并手动运行它。

排除表的条件
AND o.name NOT IN ('tblTest','tblTest1');

关于sql - 自动删除和重新创建当前索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11301383/

相关文章:

sql - 这种方法可以扩展 SQL 查询吗?

mysql - 将选择结果添加到另一个选择并创建一个 json 键

sql - 库存库存先进先出

sql - 更改 SSAS 数据库的 ID

c# - 什么时候写 "ad hoc sql"比存储过程更好

pentaho - 在 Pentaho Data Integration 中为不同的连接复制作业

c# - 尝试将大 Excel 文件读入 DataTable 时出现 OutOfMemoryException

Android:索引 1 处的绑定(bind)值为空

database - 分辨率不同的数据

sql-server-2008 - 合并两行,其中 1 列有值,另一列为空