本主题介绍如何使用 SQL Server Management Studio 或 Transact-SQL 在 SQL Server 2014 中联机创建、重新生成或删除索引。 ONLINE 选项允许并发用户访问基础表或聚集索引数据以及这些索引作期间任何关联的非聚集索引。 例如,当群集索引被一个用户重新生成时,该用户和其他人可以继续更新和查询基础数据。 脱机执行数据定义语言(DDL)作时,例如生成或重新生成聚集索引;这些作保留基础数据和关联索引的排他锁。 这可以防止修改和查询基础数据,直到索引作完成。
注释
联机索引作在每个 SQL Server 版本中都不可用。 有关详细信息,请参阅 SQL Server 2014 各个版本支持的功能。
本主题内容
准备工作:
若要联机重新生成索引,请使用:
在您开始之前
局限性与限制
我们建议对每天运行 24 小时、每周 7 天的业务环境执行联机索引作,在这些环境中,在索引作期间需要并发用户活动至关重要。
以下 Transact-SQL 语句中提供了 ONLINE 选项。
DROP INDEX(删除索引)
ALTER TABLE (使用 CLUSTERED 索引选项添加或删除 UNIQUE 或 PRIMARY KEY 约束)
有关联机创建、重新生成或删除索引的更多限制和限制,请参阅 联机索引作指南。
安全
权限
需要对表或视图具有 ALTER 权限。
使用 SQL Server Management Studio
联机重新生成索引
在对象资源管理器中,单击加号以展开包含要联机重新生成索引的表的数据库。
展开 表格 文件夹。
单击加号以展开要联机重新生成索引的表。
展开 “索引” 文件夹。
右键单击要联机重新生成索引并选择“ 属性”。
在 “选择页面”下,选择“ 选项”。
选择 “允许联机 DML 处理”,然后从列表中选择 True 。
单击 “确定” 。
右键单击要联机重新生成的索引,然后选择“ 重新生成”。
在“ 重新生成索引 ”对话框中,验证正确的索引是否位于 “索引”中以重新生成 网格,然后单击“ 确定”。
使用 Transact-SQL
联机创建、重新生成或删除索引
在 “对象资源管理器” 中,连接到某个数据库引擎实例。
在标准栏上,单击“新建查询”。
将以下示例复制并粘贴到查询窗口中,然后单击 执行。 该示例重新生成现有联机
USE AdventureWorks2012; GO ALTER INDEX AK_Employee_NationalIDNumber ON HumanResources.Employee REBUILD WITH (ONLINE = ON); GO以下示例联机删除聚集索引,并使用
MOVE TO子句将生成的表(堆)移动到文件组NewGroup。sys.indexes查询目录sys.tablessys.filegroups视图,以验证移动前后文件组中的索引和表位置。USE AdventureWorks2012; GO --Create a clustered index on the PRIMARY filegroup if the index does not exist. IF NOT EXISTS (SELECT name FROM sys.indexes WHERE name = N'AK_BillOfMaterials_ProductAssemblyID_ComponentID_StartDate') CREATE UNIQUE CLUSTERED INDEX AK_BillOfMaterials_ProductAssemblyID_ComponentID_StartDate ON Production.BillOfMaterials (ProductAssemblyID, ComponentID, StartDate) ON 'PRIMARY'; GO -- Verify filegroup location of the clustered index. SELECT t.name AS [Table Name], i.name AS [Index Name], i.type_desc, i.data_space_id, f.name AS [Filegroup Name] FROM sys.indexes AS i JOIN sys.filegroups AS f ON i.data_space_id = f.data_space_id JOIN sys.tables as t ON i.object_id = t.object_id AND i.object_id = OBJECT_ID(N'Production.BillOfMaterials','U') GO --Create filegroup NewGroup if it does not exist. IF NOT EXISTS (SELECT name FROM sys.filegroups WHERE name = N'NewGroup') BEGIN ALTER DATABASE AdventureWorks2012 ADD FILEGROUP NewGroup; ALTER DATABASE AdventureWorks2012 ADD FILE (NAME = File1, FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\File1.ndf') TO FILEGROUP NewGroup; END GO --Verify new filegroup SELECT * from sys.filegroups; GO -- Drop the clustered index and move the BillOfMaterials table to -- the Newgroup filegroup. -- Set ONLINE = OFF to execute this example on editions other than Enterprise Edition. DROP INDEX AK_BillOfMaterials_ProductAssemblyID_ComponentID_StartDate ON Production.BillOfMaterials WITH (ONLINE = ON, MOVE TO NewGroup); GO -- Verify filegroup location of the moved table. SELECT t.name AS [Table Name], i.name AS [Index Name], i.type_desc, i.data_space_id, f.name AS [Filegroup Name] FROM sys.indexes AS i JOIN sys.filegroups AS f ON i.data_space_id = f.data_space_id JOIN sys.tables as t ON i.object_id = t.object_id AND i.object_id = OBJECT_ID(N'Production.BillOfMaterials','U'); GO
有关详细信息,请参阅 ALTER INDEX (Transact-SQL)。