更新时间:2023-10-07
重新生成索引将会删除并重新创建索引。重新生成操作可以脱机或联机执行,具体取决于索引类型和数据库引擎版本。脱机索引重新生成耗费的时间通常比联机重新生成少,但它会在重新生成操作持续期间保留对象级锁,阻止查询访问表或视图。
联机索引重新生成操作结束时才需要对象级锁,届时必须将锁短暂保留一段时间,重新生成才能完成。联机索引重新生成可以作为可恢复的操作启动,具体取决于数据库引擎的版本。可恢复的索引重新生成操作可以暂停,并保留截至到该时刻完成的进度。可恢复的重新生成操作可以在暂停或中断后恢复,也可在无需完成重新生成时中止。
索引执行联机重新生成时,对索引列中数据的每个修改都必须更新该索引的其他副本。这可能会导致数据修改语句的性能在执行联机重新生成期间略微下降。
可恢复的联机索引操作暂停时,这会继续影响此性能,直到此可恢复的操作完成或中止。 如果不打算完成可恢复的索引操作,请将其中止,而不要暂停它。
根据可用的资源和工作负荷模式,在MAXDOP语句中指定高于默认 MAXDOP 值的时间可能会缩短重建的持续时间,但代价是 CPU 使用率较高。
对于行存储索引,重新生成会消除索引的所有级别中的碎片,并根据指定的或当前的填充因子来压缩页面。 如果指定 ALL,将通过单个操作删除表中的所有索引并重新生成它们。 重新生成具有128个或更多个区的索引时,数据库引擎延迟页释放并获取关联的锁,直到重建完成。 有关语法示例,请参阅示例 - 行存储重新生成。
对于列存储索引,重新生成会消除碎片,将任何增量存储行移到列存储中,并以物理方式删除标记为已删除的行。
使用 SQL Server Management Studio
- 联机重新生成索引
- 在“对象资源管理器”中,单击加号以便展开包含您要联机重新生成索引的表的数据库。
- 展开 “表” 文件夹。
- 单击加号以展开您要联机重新生成索引的表。
- 展开 “索引” 文件夹。
- 右键单击要联机重新生成的索引,然后选择“属性”。
- 在 “选择页” 下,选择 “选项” 。
- 选择 “允许联机 DML 处理” ,然后从列表中选择 True 。
- 单击“确定”。
- 右键单击要联机重新生成的索引,然后选择“重新生成”。
- 在 “重新生成索引” 对话框中,确认正确的索引位于 “要重新生成的索引” 网格中,然后单击 “确定” 。
使用 SQL Server Management Studio批量操作
- 依次展开数据库实例,管理,右键维护计划,选择“新建维护计划”。
- 选择左侧工具箱中“重新生成索引”任务,拖动到右侧任务窗口。
- 右键任务,编辑“重新生成索引”任务。
- 选择需要重建索引的一个或多个数据库,点击“确定”
- 勾选“保持索引联机”,此任务除作为定时任务执行重建外,还可以通过“查看T-SQL(V)”选项生产重建索引的SQL语句,手工执行重建命令。
- 点击“确定”,并配置任务运行计划,最后保存维护计划。
使用 Transact-SQL
下面的示例在 AdventureWorks 数据库中重新生成现有联机索引。
ALTER INDEX AK_Employee_NationalIDNumber
ON HumanResources.Employee
REBUILD WITH (ONLINE = ON);