經過禁用、從新生成或從新組織索引,或經過設置索引的相關選項,修改現有的表索引或視圖索引(關係索引或 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