您可以使用 SQL Server Management Studio 或 Transact-SQL,在 SQL Server 2014 中的數據表上建立叢集索引。 除了少數例外狀況,每個數據表都應該有叢集索引。 除了改善查詢效能之外,還可以視需要重建或重新組織叢集索引,以控制數據表片段。 您也可以在檢視上建立叢集索引。 (叢集索引定義於主題叢集和非叢集索引描述中。)
本主題內容
開始之前:
若要在資料表上建立叢集索引:
開始之前
典型實作
叢集索引會以下列方式實作:
PRIMARY KEY 和 UNIQUE 條件約束
當您建立主鍵約束時,如果資料表上沒有現有的叢集索引,且您未指定唯一的非叢集索引,則會在主鍵欄位上自動建立唯一的叢集索引。 主鍵資料行不允許 NULL 值。
當您建立 UNIQUE 條件約束時,依預設會建立唯一的非叢集索引,以強制 UNIQUE 條件約束。 若資料表上還沒有叢集索引,您可以指定唯一叢集索引。
建立為條件約束一部分的索引會自動指定與條件約束名稱相同的名稱。 如需詳細資訊,請參閱 主要和外鍵條件約束 和 唯一條件約束和檢查條件約束。
獨立於條件限制之外的索引
如果指定了非叢集主鍵條件約束,您可以在主鍵數據行以外的數據行上建立叢集索引。
限制與制約
建立叢集索引結構時,其各自的檔案和檔案群組都需要舊 (來源) 和新的 (target) 結構的磁碟空間。 在完成交易認可之前,舊結構不會解除分配。 可能也需要其他暫存磁碟空間來進行排序。 如需詳細資訊,請參閱 Disk Space Requirements for Index DDL Operations。
如果在具有數個現有非叢集索引的堆積上建立叢集索引,則必須重建所有非叢集索引,使其包含叢集索引鍵值,而不是數據列標識碼 (RID)。 同樣地,如果在具有數個非叢集索引的資料表上移除叢集索引,則非叢集索引都會重建作為DROP操作的一部分。 在大型數據表上可能需要相當長的時間。
在大型數據表上建置索引的慣用方法是從叢集索引開始,然後建置任何非叢集索引。 當您在現有數據表上建立索引時,請考慮將 ONLINE 選項設定為 ON。 當設定為 ON 時,不會保留長期數據表鎖定。 這可讓基礎表的查詢或更新繼續進行。 如需詳細資訊,請參閱 Perform Index Operations Online。
叢集索引的索引鍵不能包含
varchar具有ROW_OVERFLOW_DATA配置單位中現有數據的數據行。 如果在數據行上varchar建立叢集索引,而且現有數據位於IN_ROW_DATA配置單位中,則後續會在將數據從數據列外推送的數據行上執行後續的插入或更新動作將會失敗。 若要取得可能包含數據列溢位數據的數據表資訊,請使用 sys.dm_db_index_physical_stats (Transact-SQL) 動態管理功能。
安全
權限
需要擁有對資料表或檢視表的 ALTER 權限。 使用者必須是 系統管理員 固定伺服器角色的成員,或是 db_ddladmin 和 db_owner 固定資料庫角色的成員。
使用 SQL Server Management Studio
使用物件總管建立叢集索引
在 [物件總管] 中,展開您要在其中建立叢集索引的數據表。
以滑鼠右鍵按兩下 [索引] 資料夾,指向 [ 新增索引],然後選取 [ 叢集索引...]。
在 [新增索引] 對話方塊,於 [一般] 頁面上的 [索引名稱] 方塊中輸入新索引的名稱。
在 [索引鍵資料行] 下,按一下 [新增...]。
在 [ 從table_name 選取數據行] 對話框中,選取要新增至叢集索引之數據表數據行的複選框。
按一下 [確定]。
在 [新增索引] 對話方塊中,按一下 [確定] 。
使用數據表設計工具建立叢集索引
在 [物件總管] 中,展開您想要建立具有叢集索引的數據表所在的資料庫。
以滑鼠右鍵按兩下 [ 資料表] 資料夾,然後按下 [ 新增數據表...]。
像平常一樣建立新的數據表。 如需詳細資訊,請參閱 建立數據表 (Database Engine)。
以滑鼠右鍵點擊前面建立的新表格,然後點擊設計。
在 [資料表設計器] 功能表上,按一下 [索引/鍵]。
在 [索引/索引鍵] 對話方塊中,按一下 [加入]。
從 [已選擇的主/唯一索引鍵或索引] 文字框中選擇新索引。
在方格中,選取 [ 建立為叢集],然後從屬性右邊的下拉式清單中選擇 [ 是 ]。
按下 關閉。
在 [檔案] 功能表上,按一下 [儲存]資料表名稱。
使用 Transact-SQL
建立叢集索引
在物件總管中,連線到資料庫引擎實例。
在標準列上,按一下 [新增查詢] 。
複製下列範例並將其貼到查詢視窗中,然後按一下 [執行] 。
USE AdventureWorks2012; GO -- Create a new table with three columns. CREATE TABLE dbo.TestTable (TestCol1 int NOT NULL, TestCol2 nchar(10) NULL, TestCol3 nvarchar(50) NULL); GO -- Create a clustered index called IX_TestTable_TestCol1 -- on the dbo.TestTable table using the TestCol1 column. CREATE CLUSTERED INDEX IX_TestTable_TestCol1 ON dbo.TestTable (TestCol1); GO
如需更多資訊,請參閱 CREATE INDEX (Transact-SQL)。