经过禁用、从新生成或从新组织索引,或经过设置索引的相关选项,修改现有的表索引或视图索引(关系索引或 XML 索引)。php
ALTER INDEX { index_name | ALL } ON <object> { REBUILD [ [ WITH ( <rebuild_index_option> [ ,...n ] ) ] | [ PARTITION = partition_number [ WITH ( <single_partition_rebuild_index_option> [ ,...n ] ) ] ] ] | DISABLE | REORGANIZE [ PARTITION = partition_number ] [ WITH ( LOB_COMPACTION = { ON | OFF } ) ] | SET ( <set_index_option> [ ,...n ] ) } [ ; ] <object> ::= { [ database_name. [ schema_name ] . | schema_name. ] table_or_view_name } <rebuild_index_option > ::= { PAD_INDEX = { ON | OFF } | FILLFACTOR = fillfactor | SORT_IN_TEMPDB = { ON | OFF } | IGNORE_DUP_KEY = { ON | OFF } | STATISTICS_NORECOMPUTE = { ON | OFF } | ONLINE = { ON | OFF } | ALLOW_ROW_LOCKS = { ON | OFF } | ALLOW_PAGE_LOCKS = { ON | OFF } | MAXDOP = max_degree_of_parallelism } <single_partition_rebuild_index_option> ::= { SORT_IN_TEMPDB = { ON | OFF } | MAXDOP = max_degree_of_parallelism } <set_index_option>::= { ALLOW_ROW_LOCKS= { ON | OFF } | ALLOW_PAGE_LOCKS = { ON | OFF } | IGNORE_DUP_KEY = { ON | OFF } | STATISTICS_NORECOMPUTE = { ON | OFF } }
索引的名称。索引名称在表或视图中必须惟一,但在数据库中没必要惟一。索引名称必须符合标识符的规则。架构
指定与表或视图相关联的全部索引,而不考虑是什么索引类型。若是有一个或多个索引脱机或不容许对一个或多个索引类型执行只读文件组操做或指定操做,则指定 ALL 将致使语句失败。下表列出了索引操做和不容许使用的索引类型。并发
使用此操做指定 ALL | 若是表有一个或多个,语句会失败 |
---|---|
REBUILD WITH ONLINE = ON ide |
XML 索引函数 大型对象数据类型列:image、text、ntext、varchar(max)、nvarchar(max)、varbinary(max) 和 xml优化 |
REBUILD PARTITION = partition_number网站 |
未分区索引、XML 索引或禁用的索引ui |
REORGANIZEspa |
已禁用的索引或 ALLOW_PAGE_LOCKS 设置为 OFF 的索引 |
REORGANIZE PARTITION = partition_number |
未分区索引、XML 索引或禁用的索引 |
SET |
已禁用的索引 |
若是将 PARTITION = partition_number 与 ALL 一块儿指定,则必须对齐全部索引。这意味着,它们是基于等同的分区函数进行分区的。将 ALL 与 PARTITION 一块儿使用可致使从新生成或从新组织全部具备相同 partition_number 的索引分区。有关已分区索引的详细信息,请参阅已分区表和已分区索引。
数据库的名称。
该表或视图所属架构的名称。
与该索引关联的表或视图的名称。若要显示对象的索引报表,请使用 sys.indexes 目录视图。
指定将使用相同的列、索引类型、惟一性属性和排序顺序从新生成索引。此子句操做等同于 DBCC DBREINDEX。REBUILD 启用已禁用的索引。从新生成汇集索引并不从新生成关联的非汇集索引,除非指定了关键字 ALL。若是未指定索引选项,则应用存储在 sys.indexes 中的现有索引选项值。对于未在 sys.indexes 中存储值的任何索引选项,应用该选项的参数定义中指示的默认值。
从新生成 XML 索引时,选项 ONLINE 和 IGNORE_DUP_KEY 无效。
若是指定 ALL 且基础表为堆,则从新生成操做对表没有任何影响。从新生成与表相关联的全部非汇集索引。
若是数据库恢复模式设置为大容量日志记录或简单,则能够对从新生成操做进行最小日志记录。有关详细信息,请参阅为索引操做选择恢复模式。
![]() |
---|
从新生成主 XML 索引时,基础用户表在索引操做持续期间不可用。 |
指定只从新生成或从新组织索引的一个分区。若是 index_name 不是已分区索引,则不能指定 PARTITION。
要从新生成或从新组织已分区索引的分区数。partition_number 是能够引用变量的常量表达式。其中包括用户定义类型变量或函数以及用户定义函数,但不能引用 Transact-SQL 语句。partition_number 必须存在,不然,该语句将失败。
SORT_IN_TEMPDB 和 MAXDOP 是从新生成单个分区 (PARTITION = n) 时可指定的选项。不能在单个分区从新生成操做中指定 XML 索引。
不能在线从新生成分区索引。在此操做过程当中将锁定整个表。
将索引标记为已禁用,从而不能由 SQL Server 2005 数据库引擎使用。任何索引都可被禁用。已禁用的索引的索引定义保留在没有基础索引数据的系统目录中。禁用汇集索引将阻止用户访问基础表数据。若要启用索引,请使用 ALTER INDEX REBUILD 或 CREATE INDEX WITH DROP_EXISTING。有关详细信息,请参阅禁用索引。
指定将从新组织的索引叶级。此子句等同于 DBCC INDEXDEFRAG。ALTER INDEX REORGANIZE 语句始终联机执行。这意味着不保留长期阻塞的表锁,且对基础表的查询或更新能够在 ALTER INDEX REORGANIZE 事务处理期间继续。不能为已禁用的索引或 ALLOW_PAGE_LOCKS 设置为 OFF 的索引指定 REORGANIZE。
指定压缩全部包含大型对象 (LOB) 数据的页。LOB 数据类型包括 image、text、ntext、varchar(max)、nvarchar(max)、varbinary(max) 和 xml。压缩此数据能够改善磁盘空间使用状况。默认值为 ON。
压缩全部包含大型对象数据的页。
从新组织指定的汇集索引将压缩汇集索引中包含的全部 LOB 列。从新组织非汇集索引将压缩做为索引中非键(已包括)列的全部 LOB 列。有关详细信息,请参阅建立带有包含性列的索引。
指定 ALL 时,将从新组织与指定表或视图相关联的全部索引,而且压缩与汇集索引、基础表或具备已包括列的非汇集索引相关联的全部 LOB 列。
不压缩包含大型对象数据的页。
OFF 对堆没有影响。
若是 LOB 列不存在,则忽略 LOB_COMPACTION 子句。
指定不从新生成或从新组织索引的索引选项。不能为已禁用的索引指定 SET。
指定索引填充。默认值为 OFF。
FILLFACTOR 指定的可用空间百分比应用于索引的中间级页。若是在 PAD_INDEX 设置为 ON 的同时不指定 FILLFACTOR,则使用 sys.indexes 中存储的填充因子值。
中间级页已填充到接近容量限制。这样将至少为索引能够基于中间页中的键集拥有的最大大小的一行留出足够的空间。
有关详细信息,请参阅 CREATE INDEX (Transact-SQL)。
指定一个百分比,指示在建立或更改索引期间,数据库引擎对各索引页的叶级填充的程度。fillfactor 必须为介于 1 至 100 之间的整数值。默认值为 0。
![]() |
---|
填充因子的值 0 和 100 在全部方面都是相同的。 |
显式的 FILLFACTOR 设置只是在索引首次建立或从新生成时应用。数据库引擎并不会在页中动态保持指定的可用空间百分比。有关详细信息,请参阅 CREATE INDEX (Transact-SQL)。
若要查看填充因子设置,请使用 sys.indexes。
![]() |
---|
使用 FILLFACTOR 值建立或更改汇集索引会影响数据占用的存储空间量,由于数据库引擎在建立汇集索引时会从新分发数据。 |
指定是否在 tempdb 中存储排序结果。默认值为 OFF。
在 tempdb 中存储用于生成索引的中间排序结果。若是 tempdb 位于不一样于用户数据库的磁盘集中,这样可能会缩短建立索引所需的时间。可是,这会增长索引生成期间所使用的磁盘空间量。
中间排序结果与索引存储在同一数据库中。
若是不须要执行排序操做,或者能够在内存中进行排序,则忽略 SORT_IN_TEMPDB 选项。
有关详细信息,请参阅 tempdb 和索引建立。
指定当对惟一汇集索引或惟一非汇集索引的多行插入事务中出现重复键值时的错误响应。默认值为 OFF。
发出警告消息,只有违反 UNIQUE 索引的行失败。
发出错误消息,整个事务回滚。
IGNORE_DUP_KEY 设置仅适用于建立或从新生成索引后发生的插入操做。该设置在索引操做期间无效。IGNORE_DUP_KEY 在 UPDATE 语句中不起任何做用。
对于 XML 索引以及对视图建立的索引,IGNORE_DUP_KEY 不能设置为 ON。有关详细信息,请参阅 CREATE INDEX (Transact-SQL)。
指定是否从新计算分发统计信息。默认值为 OFF。
不会自动从新计算过期的统计信息。
启用统计信息自动更新功能。
若要还原自动统计信息更新,请将 STATISTICS_NORECOMPUTE 设置为 OFF,或执行 UPDATE STATISTICS 但不包含 NORECOMPUTE 子句。
![]() |
---|
若是禁用分发统计信息的自动从新计算,可能会阻止查询优化器为涉及该表的查询挑选最佳执行计划。 |
指定在索引操做期间基础表和关联的索引是否可用于查询和数据修改操做。默认值为 OFF。
![]() |
---|
联机索引操做只适用于 SQL Server 2005 Enterprise Edition。 |
在索引操做期间不持有长期表锁。在索引操做的主要阶段,源表上只使用意向共享 (IS) 锁。这使得可以继续对基础表和索引进行查询或更新。操做开始时,将对源对象保持极短期的共享 (S) 锁。操做结束时,若是建立非汇集索引,将对源持有极短期的 S 锁;当在线建立或删除汇集索引时,或者从新生成汇集或非汇集索引时,将获取 SCH-M(架构修改)锁。对本地临时表建立索引时,ONLINE 不能设置为 ON。
在索引操做期间应用表锁。建立、从新生成或删除汇集索引或者从新生成或删除非汇集索引的脱机索引操做将对表获取架构修改 (Sch-M) 锁。这样能够防止全部用户在操做期间访问基础表。建立非汇集索引的脱机索引操做将对表获取共享 (S) 锁。这样能够防止更新基础表,但容许读操做(如 SELECT 语句)。
有关详细信息,请参阅联机索引操做的工做方式。有关锁的详细信息,请参阅锁模式。
索引(包括全局临时表中的索引)能够联机从新生成,但如下索引除外:
若是表包含 LOB 数据类型,但这些列中没有任何列在索引定义中用做键列或非键列,则能够联机从新生成非汇集索引。
指定是否容许行锁。默认值为 ON。
在访问索引时容许行锁。数据库引擎肯定什么时候使用行锁。
未使用行锁。
指定是否容许页锁。默认值为 ON。
访问索引时容许使用页锁。数据库引擎肯定什么时候使用页锁。
未使用页锁。
![]() |
---|
ALLOW_PAGE_LOCKS 设置为 OFF 时,没法从新组织索引。 |
在索引操做期间覆盖“最大并行度”配置选项。有关详细信息,请参阅max degree of parallelism 选项。使用 MAXDOP 能够限制在执行并行计划的过程当中使用的处理器数量。最大数量为 64 个处理器。
max_degree_of_parallelism 能够是:
取消生成并行计划。
将并行索引操做中使用的最大处理器数量限制为指定数量。
根据当前系统工做负荷使用实际的处理器数量或更少数量的处理器。
有关详细信息,请参阅配置并行索引操做。
![]() |
---|
并行索引操做只适用于 SQL Server 2005 Enterprise Edition。 |
ALTER INDEX 不能用于对索引从新分区或将索引移到其余文件组。此语句不能用于修改索引定义,如添加或删除列,或更改列的顺序。使用带有 DROP_EXISTING 子句的 CREATE INDEX 执行这些操做。
未显式指定选项时,则应用当前设置。例如,若是未在 REBUILD 子句中指定 FILLFACTOR 设置,将在从新生成过程当中使用系统目录中存储的填充因子值。若要查看当前索引选项设置,请使用 sys.indexes。
![]() |
---|
系统目录中不存储 ONLINE、MAXDOP 和 SORT_IN_TEMPDB 的值。除非在索引语句中指定,不然,使用选项的默认值。 |
在多处理器计算机中,就像其余查询那样,ALTER INDEX REBUILD 自动使用更多处理器来执行与修改索引相关联的扫描和排序操做。运行 ALTER INDEX REORGANIZE 时,不管是否有 LOB_COMPACTION,最大并行度值均为单个线程化操做。有关详细信息,请参阅配置并行索引操做。
若是索引所在的文件组脱机或设置为只读,则没法从新组织或从新生成索引。若是指定了关键字 ALL,但有一个或多个索引位于离线文件组或只读文件组中,该语句将失败。
从新生成索引将会删除并从新建立索引。这将根据指定的或现有的填充因子设置压缩页来删除碎片、回收磁盘空间,而后对连续页中的索引行从新排序。若是指定 ALL,将删除表中的全部索引,而后在单个事务中从新生成。FOREIGN KEY 约束没必要预先删除。从新生成具备 128 个区或更多区的索引时,数据库引擎延迟实际的页释放及其关联的锁,直到事务提交。有关详细信息,请参阅删除并从新生成大型对象。
在早期版本的 SQL Server 中,您有时能够从新生成非汇集索引来更正由硬件故障致使的不一致。在 SQL Server 2005 中,您仍然能够经过脱机从新生成非汇集索引来纠正索引和汇集索引之间的这种不一致。可是,您不能经过联机从新生成索引来纠正非汇集索引的不一致,由于联机从新生成机制将会使用现有的非汇集索引做为从新生成的基础,所以仍存在不一致。相反,离线从新生成索引将会强制扫描汇集索引(或堆),所以会删除不一致。与早期版本同样,建议经过从备份还原受影响的数据来从不一致状态进行恢复;可是,您能够经过离线从新生成非汇集索引来纠正索引的不一致。有关详细信息,请参阅 DBCC CHECKDB (Transact-SQL)。
使用最少系统资源从新组织索引。经过对叶级页以物理方式从新排序,使之与叶节点的从左到右的逻辑顺序相匹配,进而对表和视图中的汇集索引和非汇集索引的叶级进行碎片整理。从新组织还会压缩索引页。压缩基于现有的填充因子值。若要查看填充因子设置,请使用 sys.indexes。
若是指定 ALL,将从新组织表中的关系索引(包括汇集索引和非汇集索引)和 XML 索引。指定 ALL 时应用某些限制,请参阅“参数”部分的 ALL 定义。
有关详细信息,请参阅从新组织和从新生成索引。
禁用索引可防止用户访问该索引,对于汇集索引,还可防止用户访问基础表数据。索引定义保留在系统目录中。对视图禁用非汇集索引或汇集索引会以物理方式删除索引数据。禁用汇集索引将阻止对数据的访问,但在删除或从新生成索引以前,数据在 B 树中一直保持未维护的状态。若要查看已启用索引或已禁用的索引的状态,查询 sys.indexes 目录视图中的 is_disabled 列。
若是表位于事务复制发布中,则没法禁用任何与主键列关联的索引。复制须要使用这些索引。若要禁用索引,必须先从发布中删除该表。有关详细信息,请参阅发布数据和数据库对象。
使用 ALTER INDEX REBUILD 语句或 CREATE INDEX WITH DROP_EXISTING 语句启用索引。从新生成已禁用汇集索引不能在 ONLINE 选项设置为 ON 时执行。有关详细信息,请参阅禁用索引。
您能够为指定的索引设置选项 ALLOW_ROW_LOCKS、ALLOW_PAGE_LOCKS、IGNORE_DUP_KEY 和 STATISTICS_NORECOMPUTE,而不从新生成或从新组织该索引。修改的值当即应用于索引。若要查看这些设置,请使用 sys.indexes。有关详细信息,请参阅设置索引选项。
若是 ALLOW_ROW_LOCKS = ON 而且 ALLOW_PAGE_LOCK = ON,则当访问索引时将容许行级别、页级别和表级别的锁。数据库引擎将选择相应的锁,而且能够将锁从行锁或页锁升级到表锁。
若是 ALLOW_ROW_LOCKS = OFF 而且 ALLOW_PAGE_LOCK = OFF,则当访问索引时只容许表级锁。有关为索引配置锁定粒度的详细信息,请参阅自定义索引的锁定。
设置行锁或页锁选项时,若是指定 ALL,这些设置将应用于全部索引。基础表为堆时,经过如下方式应用这些设置:
ALLOW_ROW_LOCKS = ON 或 OFF |
应用于堆和任何关联的非汇集索引。 |
ALLOW_PAGE_LOCKS = ON |
应用于堆和任何关联的非汇集索引。 |
ALLOW_PAGE_LOCKS = OFF |
彻底针对非汇集索引。这意味着全部页锁均不容许对非汇集索引使用。在堆中,只有页的共享 (S) 锁、更新 (U) 锁和排他 (X) 锁不容许使用。数据库引擎仍然能够获取意向页锁(IS、IU 或 IX),供内部使用。 |
有关详细信息,请参阅锁升级(数据库引擎)。
从新生成索引且 ONLINE 选项设置为 ON 时,基础对象、表和关联的索引都可用于查询和数据修改。更改过程当中,排他表锁只保留很是短的时间。
从新组织索引始终联机执行。该进程不长期保留锁,所以,不阻塞正在运行的查询或更新。
只有在执行如下操做时,才能对同一个表执行并发联机索引操做:
同一时间执行的全部其余联机索引操做都将失败。例如,您不能在同一个表中同时从新生成两个索引或更多索引,也不能在同一个表中从新生成现有索引时建立新的索引。
有关详细信息,请参阅联机执行索引操做。
若要执行 ALTER INDEX,至少须要对表或视图具备 ALTER 权限。
如下示例在 Employee 表中从新生成单个索引。
USE AdventureWorks;
GO
ALTER INDEX PK_Employee_EmployeeID ON HumanResources.Employee
REBUILD;
GO
下面的示例指定了 ALL 关键字。这将从新生成与表相关联的全部索引。其中指定了三个选项。
USE AdventureWorks;
GO
ALTER INDEX ALL ON Production.Product
REBUILD WITH (FILLFACTOR = 80, SORT_IN_TEMPDB = ON,
STATISTICS_NORECOMPUTE = ON);
GO
下面的示例从新组织单个汇集索引。由于该索引在叶级别包含 LOB 数据类型,因此该语句还会压缩全部包含该大型对象数据的页。注意,不须要指定 WITH (LOB_COMPACTION) 选项,由于默认值为 ON。
USE AdventureWorks;
GO
ALTER INDEX PK_ProductPhoto_ProductPhotoID ON Production.ProductPhoto
REORGANIZE ;
GO
如下示例为索引 AK_SalesOrderHeader_SalesOrderNumber 设置了几个选项。
USE AdventureWorks;
GO
ALTER INDEX AK_SalesOrderHeader_SalesOrderNumber ON
Sales.SalesOrderHeader
SET (
STATISTICS_NORECOMPUTE = ON,
IGNORE_DUP_KEY = ON,
ALLOW_PAGE_LOCKS = ON
) ;
GO
下面的示例禁用了对 Employee 表的非汇集索引。
USE AdventureWorks;
GO
ALTER INDEX IX_Employee_ManagerID ON HumanResources.Employee
DISABLE ;
GO
如下示例经过禁用 PRIMARY KEY 索引来禁用 PRIMARY KEY 约束。对基础表的 FOREIGN KEY 约束自动被禁用,并显示警告消息。
USE AdventureWorks;
GO
ALTER INDEX PK_Department_DepartmentID ON HumanResources.Department
DISABLE ;
GO
结果集返回此警告消息。
Warning: Foreign key 'FK_EmployeeDepartmentHistory_Department_DepartmentID' on table 'EmployeeDepartmentHistory' referencing table 'Department' was disabled as a result of disabling the index 'PK_Department_DepartmentID'.
如下示例启用在示例 F 中被禁用的 PRIMARY KEY 和 FOREIGN KEY 约束。
经过从新生成 PRIMARY KEY 索引启用 PRIMARY KEY 约束。
USE AdventureWorks;
GO
ALTER INDEX PK_Department_DepartmentID ON HumanResources.Department
REBUILD ;
GO
此时,将启用 FOREIGN KEY 约束。
ALTER TABLE HumanResources.EmployeeDepartmentHistory
CHECK CONSTRAINT FK_EmployeeDepartmentHistory_Department_DepartmentID;
GO
如下示例从新生成分区索引 IX_TransactionHistory_TransactionDate 的单个分区,分区编号为 5。此示例假定安装了已分区索引示例。有关安装信息,请参阅 Readme_PartitioningScript。
USE AdventureWorks;
GO
-- Verify the partitioned indexes.
SELECT *
FROM sys.dm_db_index_physical_stats (DB_ID(),OBJECT_ID(N'Production.TransactionHistory'), NULL , NULL, NULL);
GO
--Rebuild only partition 5.
ALTER INDEX IX_TransactionHistory_TransactionDate
ON Production.TransactionHistory
REBUILD Partition = 5;
GO