線上執行索引作業
此主題描述如何使用 SQL Server Management Studio 或 Transact-SQL,在 SQL Server 2012 中線上建立、重建或卸除索引。 在這些索引作業期間,ONLINE 選項可讓並行使用者存取基礎資料表或叢集索引資料,以及任何關聯的非叢集索引。 例如,當某個使用者正在重建叢集索引時,此使用者和其他人可以繼續更新和查詢基礎資料。 當您離線執行資料定義語言 (DDL) 作業 (例如建立或重建叢集索引) 時,這些作業會保有基礎資料和關聯索引的獨佔鎖定。 這可避免在索引作業完成之前對基礎資料進行修改和查詢。
[!附註]
SQL Server 的所有版本都無法使用線上索引作業。 如需詳細資訊,請參閱<SQL Server 2012 版本支援的功能>。
本主題內容
開始之前:
限制事項
安全性
若要線上重建索引,使用:
SQL Server Management Studio
Transact-SQL
開始之前
限制事項
建議您針對全年無休的商務環境執行線上索引作業,在索引作業期間,這類環境的並行使用者活動需求相當重要。
ONLINE 選項可用於下列 Transact-SQL 陳述式。
ALTER TABLE (搭配 CLUSTERED 索引選項時,用來加入或卸除 UNIQUE 或 PRIMARY KEY 條件約束)
如需更多有關線上建立、重建或卸除索引的限制,請參閱<線上索引作業的指導方針>。
安全性
權限
需要資料表或檢視的 ALTER 權限。
[Top]
使用 SQL Server Management Studio
若要線上重建索引
在 [物件總管] 中,按一下加號展開包含您要線上重建索引之資料表的資料庫。
展開 [資料表] 資料夾。
按一下加號展開要線上重建索引的資料表。
展開 [索引] 資料夾。
以滑鼠右鍵按一下要線上重建的索引,然後選取 [屬性]。
在 [選取頁面] 底下,選取 [選項]。
選取 [允許線上 DML 處理],然後從清單中選取 [True]。
按一下 [確定]。
以滑鼠右鍵按一下要線上重建的索引,然後選取 [重建]。
在 [重建索引] 對話方塊中,確認 [要重建的索引] 方格中有正確索引,然後按一下 [確定]。
[Top]
使用 Transact-SQL
若要線上建立、重建或卸除索引
在 [物件總管] 中,連接到 Database Engine 的執行個體。
在標準列上,按一下 [新增查詢]。
將下列範例複製並貼到查詢視窗中,然後按一下 [執行]。 這個範例會線上重建現有索引
USE AdventureWorks2012; GO ALTER INDEX AK_Employee_NationalIDNumber ON HumanResources.Employee REBUILD WITH (ONLINE = ON); GO
下列範例會在線上刪除叢集索引,並利用 MOVE TO 子句,將產生的資料表 (堆積) 移到 NewGroup 檔案群組。 它會查詢 sys.indexes、 sys.tables 和 sys.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)>。
[Top]